当线程在JAVA中处理时,不显示GUI

时间:2011-11-10 12:52:03

标签: java multithreading swing user-interface concurrency

我用非常简单的线程制作简单的游戏(延迟1秒) 线程出现问题,我有while(true)循环代码:

try {
    while (true) {
       Ltimer.setText(getTimeElapsed());
       Thread.currentThread();
       Thread.sleep(1000); // Thread sleeping for 1 second           
    }
} catch (Exception e) {
    JOptionPane.showMessageDialog(null, "error with timer");       
} 

它每秒只获取一个字符串并更新标签文本 当我试图运行gui冻结时,我只能在黑色背景中看到标签,所有按钮和bg img都消失了。试图解决 setVisible() repaint() 但一无所获..

还有其他选择吗?

4 个答案:

答案 0 :(得分:5)

在EDT期间不要使用Thread#sleep(int),如果您需要延迟使用Concurency in Swing的任何操作,那么java.swing.Timer会遇到问题,例如EDT lack here

答案 1 :(得分:2)

我的猜测是你正在使用GUI事件线程来做到这一点。当您将GUI线程绑定到其他内容时,它也无法更新屏幕。我建议你运行一个新线程来做这件事。

答案 2 :(得分:2)

您不能在事件派发线程之外使用Swing组件。见http://download.oracle.com/javase/6/docs/api/javax/swing/package-summary.html#threading

每次线程必须在UI中更改某些内容时,请使用SwingUtilities.invokeLater。或者使用Swing Timer

如果这个无限循环实际上在EDT中,那么它会在运行时阻止所有UI事件,重新绘制等。所以你应该在一个单独的线程中运行这个循环。

答案 3 :(得分:1)