我用非常简单的线程制作简单的游戏(延迟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()
但一无所获..
还有其他选择吗?
答案 0 :(得分:5)
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)