【发布时间】:2012-03-18 17:12:24
【问题描述】:
我正在尝试用 Java 编写一个简单的游戏。基本结构是单个JFrame 和不同的JPanels,我在不同时间添加/删除。在启动时,有一个JPanel 这是一个基本菜单(开始游戏、高分等)。一旦按下“开始”按钮,它就会切换到一个带有三个按钮的级别选择面板,以选择游戏的难度级别。一旦按下三个按钮中的任何一个,它就会切换到另一个面板,该面板将显示三秒倒计时,然后是实际游戏。三个按钮都调用同一个方法,只是传入的难度值不同。
我的所有独立部分都工作正常,但我在从关卡选择面板过渡到倒计时时遇到了麻烦。如果我不使用线程,屏幕会在按钮按下时冻结并且不会切换到新面板。我试过搞乱线程,但我对它们了解不多,而且只取得了有限的成功(我已经得到它,所以它会在某些时候成功切换,但不是始终如一)。
在代码方面,在关卡选择面板中,我有这样的东西来监听按钮的点击:
private class ButtonClickedListener implements ActionListener {
public void actionPerformed(ActionEvent evt) {
gui.newLevel(1);
}
}
在哪里只是 gui.newLevel(1) 我已经搞砸了启动新线程并从它们调用方法。
newLevel() 方法如下所示:
getContentPane().removeAll();
levelPanel = new LevelPanel(levelNum, this);
add(levelPanel);
validate();
levelPanel.start();
从开始菜单JPanel 切换到关卡选择器面板时,我使用了非常相似的代码(同样,按钮上有一个ActionListener),效果很好。
LevelPanel 的 start() 方法初始化新的 JPanel 的值并在屏幕上显示倒计时(目前使用以下代码,尽管我在显示实际游戏之前将类似的东西放在 newLevel() 方法中搞砸了) :
try {
Thread.sleep(1000);
//update countdown number
validate();
repaint();
Thread.sleep(1000);
//update countdown number
validate();
repaint();
Thread.sleep(1000);
//update countdown number
validate();
repaint();
} catch (Exception e) {
System.out.println(e);
}
//start game
我非常感谢任何帮助让这段代码工作,我很确定某种线程是要走的路,但我不太确定在哪里/如何。任何建议和/或代码示例都会很棒!
提前致谢!
编辑:我最终使用计时器而不是 Thread.sleep() 重写了倒计时,这解决了部分问题,我最终发现了其余部分,并且与 GUI 的东西完全无关,这就是为什么我一开始没有考虑检查它的原因。
【问题讨论】:
标签: java multithreading swing user-interface