[英]How to restart a JFrame when creating a multiple level game?
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 , ie 此Main函数使用类Renderer,即
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
. 如你所见,我也在使用
JFrame
和JOGL 1.0
。
My question is : how can I reset the JFrame after I'm done with the 1st level ? 我的问题是:在完成第一级后如何重置JFrame? Obviously I can't use
System.exit(0);
显然我不能使用
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);
如果不退出
System.exit(0);
我怎么能这样做System.exit(0);
? ?
Thanks 谢谢
well you can use frame.dispose()
then create the same JFrame with the next level... 那么你可以使用
frame.dispose()
然后用下一个级别创建相同的JFrame ...
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... 我建议你重新构建你的代码......你的主类应该只包含main方法,并且你应该从哪里开始游戏,它将位于另一个包含JFrame和Thread的类中...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.