sca*_*ity 0 java user-interface swing multithreading
我正在尝试用Java编写一个简单的游戏.的基本结构是一个单一的JFrame具有不同JPanels的是我添加/在不同的时间取出.在启动时,有JPanel一个基本菜单(开始游戏,高分等).按下"开始"按钮后,它会切换到一个水平选择器面板,其中有三个按钮可选择游戏的难度级别.按下三个按钮中的任何一个后,它会切换到另一个面板,该面板将显示三秒倒计时,然后是实际游戏.所有三个按钮都调用相同的方法,只是传入了不同的难度值.
我有所有单独的部分工作正常,但我有从水平选择面板到倒计时的过渡的麻烦.如果我不使用线程,屏幕会在按下按钮时冻结,并且不会切换到新面板.我已经尝试过搞乱线程了,但是我对它们知之甚少,并且只取得了有限的成功(我已经得到它所以它会成功切换一些时间,但不是一贯的).
在代码方面,在级别选择面板中我有类似按钮点击的内容:
private class ButtonClickedListener implements ActionListener {
public void actionPerformed(ActionEvent evt) {
gui.newLevel(1);
}
}
Run Code Online (Sandbox Code Playgroud)
代替gui.newLevel(1)我刚刚搞砸了开始新线程并从中调用方法.
该newLevel()方法是这样的:
getContentPane().removeAll();
levelPanel = new LevelPanel(levelNum, this);
add(levelPanel);
validate();
levelPanel.start();
Run Code Online (Sandbox Code Playgroud)
从开始菜单切换JPanel到关卡选择器面板(再次使用ActionListener按钮)时,我使用非常相似的代码,这很好用.
LevelPanel的start()方法初始化new的值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
Run Code Online (Sandbox Code Playgroud)
我真的很感激任何帮助使这个代码工作,我很确定某种线程是要走的路,但我不太确定在哪里/如何.任何建议和/或代码示例都会很棒!
提前致谢!
编辑:我最后使用计时器而不是重写倒计时Thread.sleep(),这解决了问题的其余部分,我最终想通了其余部分并且与GUI的东西完全无关,这就是为什么我没想到要在第一名.
Thread.sleep(1000);在EDT期间从未真正使用过,这段代码导致GUI冻结是un_resposible,直到新事件调用EDT或鼠标悬停在上面也可以活着这个容器
1)有两种方法可以通过工具来实现Swing GUI中的任何事件
Swing Timer
通过使用延迟Thread.sleep(1000);在SwingWorker
| 归档时间: |
|
| 查看次数: |
1157 次 |
| 最近记录: |