今天有一个Java问题......
我用一些按钮和标签构建了一个带有框架的框架。当我点击按钮时,我想要更改3个Lables等待几秒钟并将其更改回来。我重申了它:
lKarte1.setText(test.kartendeck[0].iam()); //lKarte1 is the label and iam() returns a String
lKarte2.setText(test.kartendeck[0].iam());
到目前为止,这项工作相当不错。一些时刻,我改变了一些更多的标签
if(halt [0] .wertigkeit.getValue()> halt [1] .wertigkeit.getValue()){lPlayer1.setText(“PLayer1 Wins !!!!!”);}
这也是有效的。所以在这条线之后我想要休息大约2秒。
try{Thread.sleep(2000);} catch(InterruptedException e){}
两秒后,它应该显示“旧”标签。
lPlayer1.setText("Player1");
lPlayer2.setText("Player2");
lKarte1.setText("");
lKarte2.setText("");
现在我的问题。当我这样做没有Thread.sleep一切正常。 但是当我使用Thread.sleep()并且我点击按钮时,没有显示任何内容,只有2秒没有任何反应。我知道或者更好地看到在2秒结束时,标签眨眼所以他做了改变,,,但是为什么不改变bevor他应该去睡觉?????
答案 0 :(得分:2)
从ActionListener调用的代码在Event Dispatch Thread(EDT)上执行。 Thread.sleep()导致EDT进入休眠状态,这意味着GUI无法自行重绘。
相反,您可以使用Swing Timer来安排更新JLabel上的文本。
请参阅Swing tutorial。您可以阅读Concurrency
和How to Use Timers
上的相关部分以获取更多信息。
答案 1 :(得分:1)
你正在通过在那里睡觉来填充主事件线程。在后台线程中进行睡眠,然后在完成睡眠后使用
更新主事件线程中的标签文本SwingUtilities.invokeLater()