一段时间后如何更改 JLabel?

How can I change JLabel after a period of time?

我希望我的 JLabel 在 1 秒后更改,但似乎 Java 只显示最新的文本。

这是我的代码:

btnGuess.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
        try {
            double num = Double.parseDouble(textField.getText());
            if (num == answer) {
                lblResult.setText("CORRECT!");
            } else if (num > answer) {
                lblResult.setText("WAITING");
                Thread.sleep(1000);
                lblResult.setText("TOO LARGE");
                lblResult.setText("WAITING");
            } else {
                lblResult.setText("WAITING");
                Thread.sleep(1000);
                lblResult.setText("TOO SMALL");
            }
        } catch (Exception e) {
            lblResult.setText("Error");
        }
    }
});

我想要的:显示"WAITING" -> 1s -> 显示"TOO LARGE"

它的作用:test.gif

我该如何解决这个问题?

谢谢。

语言:Java
JRE: jre1.8.0_144
IDE:Eclipse 氧气释放 (4.7.0)
使用:Swing 设计器 -> 应用程序 Window

不要在 Swing 事件线程上调用 Thread.sleep,因为这会使整个 GUI 应用程序进入睡眠状态,使其无用。而是查找 Swing Timer tutorial(检查 link)并使用 Swing Timer。计时器使用循环和调用在后台线程和幕后休眠,允许 Swing 事件线程(称为事件调度线程或 EDT)继续 运行,允许它执行其重要功能,包括绘制对 GUI 的更改。

其他问题:您似乎在尝试将文本解析为双精度值,然后使用 == 与另一个双精度值进行比较。这样做时要小心,因为双精度数不像整数,并且 == 可能会由于数字计算机保存浮点值的不精确方式而失败。请改用 "almost" 或 "close-enough" 相等性的不同测试。

请看:Why can't we use '==' to compare two float or double numbers

类似于:

btnGuess.addActionListener(new ActionListener() {

    public void actionPerformed(ActionEvent e) {
        try {
            double num = Double.parseDouble(textField.getText());
            // EPSILON is a constant in the class, declared as 
            // public static final double EPSILON = 0.00001;
            if (Math.abs(num - answer) < EPSILON) {
                lblResult.setText("CORRECT!");
            } else {
                lblResult.setText("WAITING");
                final String comment = num > answer ? "TOO LARGE" : "TOO SMALL";
                int delay = 1000;
                Timer timer = new Timer(delay, new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        lblResult.setText(comment);
                    };
                });
                timer.setRepeats(false);
                timer.start();
            }
        } catch (Exception e1) {
            lblResult.setText("Error");
        }
    }
});

显示 "TOO LARGE" 后立即将其更改回 "WAITING"。

            lblResult.setText("WAITING");
            Thread.sleep(1000);
            lblResult.setText("TOO LARGE");
            lblResult.setText("WAITING");

删除最后一行就可以了。

            lblResult.setText("WAITING");
            Thread.sleep(1000);
            lblResult.setText("TOO LARGE");