2

今天遇到了一个Java问题......

我用一些按钮和标签构建了一个小框架。当我按下按钮时,我想更改 3 个标签,等待几秒钟再将它们改回来。我觉得它是:

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 秒结束时看到标签闪烁,所以他进行了更改,,,,但为什么在他应该去睡觉之前不进行更改??????

4

2 回答 2

2

从 ActionListener 调用的代码在事件调度线程 (EDT) 上执行。Thread.sleep() 导致 EDT 进入睡眠状态,这意味着 GUI 无法自行重绘。

相反,您可以使用 Swing Timer 来安排 JLabel 上文本的更新。

请参阅Swing 教程。您可以阅读有关部分ConcurrencyHow to Use Timers了解更多信息。

于 2013-10-25T19:45:32.673 回答
1

您正在通过在那里睡觉来冲洗主事件线程。在后台线程中进行睡眠,然后在完成睡眠后将标签文本更新回主事件线程中

SwingUtilities.invokeLater()
于 2013-10-25T19:46:26.887 回答