java中的GUI线程

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的东西完全无关,这就是为什么我没想到要在第一名.

mKo*_*bel 6

Thread.sleep(1000);在EDT期间从未真正使用过,这段代码导致G​​UI冻结是un_resposible,直到新事件调用EDT或鼠标悬停在上面也可以活着这个容器

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

  • Swing Timer

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


Sta*_*avL 5

布局和绘画必须在EDT中完成.使用SwingUtilities.invokeAndWait调用validate()和repaint()