一段时间后,我该如何更改jlabel



我希望我的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");
        }
    }
});

我想要的:显示"等待" -> 1S->显示"太大"

它的作用:test.gif

我该如何修复?

谢谢。

语言:java
JRE:JRE1.8.0_144
IDE:Eclipse氧释放(4.7.0)
使用:Swing Designer->应用程序窗口

不要在秋千事件线程上调用 Thread.sleep,因为这将使整个GUI应用程序使其无用。相反,查找摆动计时器教程(检查链接)并使用秋千定时器。计时器使用循环和呼叫在背景线程和场景后面睡觉,允许摇摆事件线程(称为事件调度线程或EDT)继续运行,从而使其可以执行其重要功能,包括绘制您的GUI的更改。

其他问题:您似乎正在尝试解析文本以加倍,然后使用==与另一个双重值进行比较。在这样做时要小心,因为双打不像ints,并且==由于数字计算机持有浮点值的不精确方式而可能失败。使用"几乎"或"近距离"平等的不同测试。

请参阅:为什么我们不能使用'=='比较两个浮点或双数字

类似:

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");
        }
    }
});

显示"太大"后,您将其更改为"等待"。

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

删除最后一行,你很好。

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