4

基本上,我有这个游戏,一旦猜对了答案,它就会用一个新单词开始一个新游戏。我想显示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。

4

3 回答 3

7

Swing 是一个事件驱动的环境。当您阻塞 Event Dispatching Thread 时,无法处理任何新事件。

你不应该用任何耗时的过程(例如 I/O、循环或Thread#sleep例如)阻塞 EDT。

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

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

这样做的好处是该actionPerformed方法是在事件调度线程的上下文中执行的。

看看这个这个这个这个的例子

于 2012-12-11T01:39:09.810 回答
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();
于 2017-06-24T17:05:41.133 回答
0

如果这些代码在事件处理程序中,那么您正在阻止 UI 线程,并且它不会工作,因为 UI 更新只会在您完成事件处理程序中的工作后发生。

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

于 2012-12-11T01:30:55.797 回答