基本上,我有这个游戏,一旦猜到正确的答案,它开始一个新单词的新游戏。我想显示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。
答案 0 :(得分:6)
Swing是一个事件驱动的环境。阻止事件调度线程时,不能处理任何新事件。
您永远不应该在任何耗时的过程中阻止EDT(例如I / O,循环或Thread#sleep
)。
您可能希望阅读The Event Dispatch Thread以获取更多信息。
相反,您应该使用javax.swing.Timer
。在给定的延迟后它会触发ActionListener
。
其好处是使用事件调度线程的上下文执行actionPerformed
方法。
答案 1 :(得分:1)
它在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();
答案 2 :(得分:0)
如果这些代码在事件处理程序中,那么你就是在阻止UI线程,并且它不会起作用,因为UI更新只会在你完成事件处理程序的工作后才会发生。
你应该创建另一个线程做“睡3秒,改变文本字段,并触发重绘”的工作。使用Timer或类似的实用程序是实现我所描述的最简单的方法。