Java Swing:延迟后更改文本

基本上,我有这个游戏,一旦猜到正确的答案,它开始一个新的游戏用新词。 我想显示Correct! 但三秒后,将其更改为空字符串。 我怎么做?

我的尝试:

 if (anagram.isCorrect(userInput.getText())) { anagram = new Anagram(); answer.setText("CORRECT!"); word.setText(anagram.getRandomScrambledWord()); this.repaint(); try { Thread.currentThread().sleep(3000); } catch (Exception e) { } answer.setText(""); } else { answer.setForeground(Color.pink); answer.setText("INCORRECT!"); } 

编辑:

我的解决方案

 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: if (anagram.isCorrect(userInput.getText())) { answer.setText("CORRECT!"); ActionListener taskPerformer = new ActionListener() { public void actionPerformed(ActionEvent evt) { anagram = new Anagram(); word.setText(anagram.getRandomScrambledWord()); answer.setText(""); userInput.setText(""); } }; Timer timer = new Timer(3000, taskPerformer); timer.setRepeats(false); timer.start(); } else { answer.setForeground(Color.pink); answer.setText("INCORRECT!"); } } 

我不确定,但我希望我遵循MadProgrammer的建议而不是阻止事件本身,而是新线程。 我也会查找Java Timer。

Swing是一个事件驱动的环境。 阻止事件调度线程时,不能处理任何新事件。

您永远不应该在任何耗时的过程中阻止EDT(例如I / O,循环或Thread#sleep )。

您可能希望阅读事件调度线程以获取更多信息。

相反,您应该使用javax.swing.Timer 。 它会在给定的延迟后触发ActionListener

其好处是actionPerformed方法是使用Event Dispatching Thread的上下文执行的。

查看这个或这个或这个或这个例子

它在3秒后工作..

 ActionListener taskPerformer = new ActionListener() { @Override public void actionPerformed(ActionEvent ae) { statusbar.setText("Status"); } }; Timer timer = new Timer(3000, taskPerformer); timer.setRepeats(false); timer.start(); 

如果这些代码片段在事件处理程序中,那么您将占用UI线程,并且它不会起作用,因为UI更新只会在您完成事件处理程序中的工作后才会发生。

你应该创建另一个线程做“睡3秒,改变文本字段,并触发重绘”的工作。 使用Timer或类似的实用程序是实现我所描述的最简单的方法。