问题
I have a one level computer game that I created , and I want to add another level .
Here is the Main :
public class Main extends JDialog
{
private static final long serialVersionUID = 1L;
protected static TimerThread timerThread;
static JStatusBar statusBar = new JStatusBar();
private static JFrame frame;
private static final int FRAME_LOCATION_X = 300;
private static final int FRAME_LOCATION_Y = 50;
private static final int FRAME_SIZE_X = 850; // animator's target frames per second
private static final int FRAME_SIZE_Y = 700; // animator's target frames per second
private static final String WorldName = "FPS 2013 CG Project";
private static final String HARD_TARGET = "src/res/target.jpg";
private static final String runningOut = "Time is running out - you have : ";
static int interval;
static Timer timer1;
static JLabel changingLabel1 = null;
/**
* NEW
*/
private static Timer timer;
private static int count = 60;
private static ActionListener timerAction = new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
count--;
if (count == 0)
timer.stop();
changingLabel1.setText(runningOut + count + " seconds");
}
};
public static void exitProcedure() {
timerThread.setRunning(false);
System.exit(0);
}
/**
* Clock timer1
* @author X2
*
*/
public static class TimerThread extends Thread
{
protected boolean isRunning;
protected JLabel dateLabel;
protected JLabel timeLabel;
protected SimpleDateFormat dateFormat =
new SimpleDateFormat("EEE, d MMM yyyy");
protected SimpleDateFormat timeFormat =
new SimpleDateFormat("h:mm a");
public TimerThread(JLabel dateLabel, JLabel timeLabel) {
this.dateLabel = dateLabel;
this.timeLabel = timeLabel;
this.isRunning = true;
}
@Override
public void run() {
while (isRunning) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Calendar currentCalendar = Calendar.getInstance();
Date currentTime = currentCalendar.getTime();
dateLabel.setText(dateFormat.format(currentTime));
timeLabel.setText(timeFormat.format(currentTime));
}
});
try {
Thread.sleep(5000L);
} catch (InterruptedException e) {
}
}
}
public void setRunning(boolean isRunning) {
this.isRunning = isRunning;
}
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
frame = new JFrame(WorldName);
Container contentPane = frame.getContentPane();
contentPane.setLayout(new BorderLayout());
/**
* the timer of the count-down
*/
timer = new Timer(1000, timerAction);
timer.start();
changingLabel1 = new JLabel(runningOut);
statusBar.setLeftComponent(changingLabel1);
final JLabel dateLabel = new JLabel();
dateLabel.setHorizontalAlignment(JLabel.CENTER);
statusBar.addRightComponent(dateLabel);
final JLabel timeLabel = new JLabel();
timeLabel.setHorizontalAlignment(JLabel.CENTER);
statusBar.addRightComponent(timeLabel);
contentPane.add(statusBar, BorderLayout.SOUTH);
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent event) {
exitProcedure();
}
});
timerThread = new TimerThread(dateLabel, timeLabel);
timerThread.start();
Renderer myCanvas = new Renderer();
final Animator animator = new Animator(myCanvas);
Toolkit t = Toolkit.getDefaultToolkit();
BufferedImage originalImage = null;
try
{
originalImage = ImageIO.read(new File(HARD_TARGET));
}
catch (Exception e1) {e1.printStackTrace();}
Cursor newCursor = t.createCustomCursor(originalImage, new Point(0, 0), "none");
frame.setCursor(newCursor);
frame.setLocation(FRAME_LOCATION_X, FRAME_LOCATION_Y);
frame.add(myCanvas);
frame.setSize(FRAME_SIZE_X, FRAME_SIZE_Y);
frame.addWindowListener(new WindowAdapter()
{
@Override
public void windowClosing(WindowEvent e)
{
new Thread()
{
@Override
public void run()
{
animator.stop();
System.exit(0);
}
}.start();
}
});
frame.setVisible(true);
animator.start();
myCanvas.requestFocus();
myCanvas.setFocusable(true);
}
});
}
}
This Main function uses the class Renderer , i.e.
class Renderer extends GLCanvas implements GLEventListener, KeyListener ,MouseListener ,MouseMotionListener {...}
And that class holds the first level of the game .
As you can see I'm also using JFrame
and JOGL 1.0
.
My question is : how can I reset the JFrame after I'm done with the 1st level ? Obviously I can't use System.exit(0);
, since it would quit the entire program .
What I want is to move to another class that holds the 2nd level .
How can I do that without exiting with System.exit(0);
?
Thanks
回答1:
By using remove(), you can effectively stop the panel. Then just create a new one JFrame
and add()
it. Consider making the JFrame
creation its own function so you don't have to keep rewriting it if do you this.
回答2:
well you can use frame.dispose()
then create the same JFrame with the next level...
I suggest you to restructure your code...your Main class should contain only the main method, and from where you should start the game, which would be located in another class containing the JFrame and Thread...
来源:https://stackoverflow.com/questions/18114622/how-to-restart-a-jframe-when-creating-a-multiple-level-game