java - Java 中的 GUI 线程

标签 java multithreading swing user-interface

我正在尝试用 Java 编写一个简单的游戏。基本结构是一个带有不同 JPanelsJFrame,我在不同时间添加/删除它们。启动时,有一个 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期间,此代码导致G​​UI上的卡住是不负责任的,直到新事件调用EDT或鼠标悬停在该容器上也可以激活该容器

1) 有两种方法可以通过实现来处理 Swing GUI 中的任何事件

  • Swing 计时器

  • 通过在 SwingWorker 中使用 Thread.sleep(1000); 进行延迟

关于java - Java 中的 GUI 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9495360/

相关文章:

iphone - 使用 XCode for iPhone 实现多线程

Python:如何在其中一个线程因错误而中断后添加新线程

java - 如何合并JTable的两列

Java Swing组件让人耳目一新

java - 在 Elastic Beanstalk 上使用 Opencv 运行 Spring boot

java - Java中的Trie实现

Java 作用域构造不能用类型使用进行注释

java - 使用 GSON 将 JSONObject 转换为 JSON

multithreading - 有没有人见过像这样处理线程的编程语言?

java - 如何更改网格中的按钮标签?