如何在一段时间后更改JLabel?

时间:2017-09-24 18:32:22

标签: java swing user-interface 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 - >申请窗口

2 个答案:

答案 0 :(得分:1)

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

其他问题:您似乎试图将文本解析为double,然后使用==与另一个double值进行比较。这样做时要小心,因为双精度不像整数,==会因数字计算机保存浮点值的不精确方式而失败。使用不同的测试"几乎"或者"足够接近"平等而不是。

请参阅: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");
        }
    }
});

答案 1 :(得分:-2)

在显示&#34; TOO LARGE&#34;之后,立即将其更改为&#34; WAITING&#34;。

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

删除最后一行并且你很好。

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