我正在尝试用 Java 编写一个简单的游戏。基本结构是一个带有不同 JPanels
的 JFrame
,我在不同时间添加/删除它们。启动时,有一个 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 的东西完全无关,这就是为什么我一开始就没有想到检查它。
最佳答案
永远不要真正使用Thread.sleep(1000);
在EDT期间,此代码导致GUI上的卡住是不负责任的,直到新事件调用EDT或鼠标悬停在该容器上也可以激活该容器
1) 有两种方法可以通过实现来处理 Swing GUI 中的任何事件
Swing 计时器
通过在
SwingWorker
中使用Thread.sleep(1000);
进行延迟
关于java - Java 中的 GUI 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9495360/