我创建了一个单级计算机游戏,我想添加另一个级别。
这是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);
}
});
}
}
此Main函数使用类Renderer,即
class Renderer extends GLCanvas implements GLEventListener, KeyListener ,MouseListener ,MouseMotionListener {...}
那个班级掌握了游戏的第一级。
正如您所看到的,我也在使用JFrame
和JOGL 1.0
。
我的问题是:在完成第一级后如何重置JFrame?显然我不能使用System.exit(0);
,因为它会退出整个程序。
我想要的是转移到另一个拥有第二级的类。
如果不退出System.exit(0);
,我怎么能这样做?
谢谢
答案 0 :(得分:1)
使用remove()
,您可以有效地停止面板。然后只需创建一个新的JFrame
和add()
。考虑将JFrame
创建它自己的功能,这样你就不必继续重写它。
答案 1 :(得分:1)
你可以使用frame.dispose()
然后创建下一个级别的相同JFrame ...
我建议你重新构建你的代码......你的Main类应该只包含main方法,并且你应该从哪里开始游戏,它将位于包含JFrame和Thread的另一个类......