Java Swing:延迟后更改文本

时间:2012-12-11 01:25:49

标签: java swing timer delay

基本上,我有这个游戏,一旦猜到正确的答案,它开始一个新单词的新游戏。我想显示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。

3 个答案:

答案 0 :(得分:6)

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

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

您可能希望阅读The Event Dispatch Thread以获取更多信息。

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

其好处是使用事件调度线程的上下文执行actionPerformed方法。

查看thisthisthisthis以获取示例

答案 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或类似的实用程序是实现我所描述的最简单的方法。