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

Java 一段时间后如何更改JLabel?,java,swing,user-interface,jlabel,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 == ans

我希望我的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->显示太大

它的作用是:

我怎样才能解决这个问题

多谢各位

语言:Java JRE:jre1.8.0_144 IDE:EclipseOxygen4.7.0版 使用:Swing Designer->Application Window

不要在Swing事件线程上调用Thread.sleep,因为这将使整个GUI应用程序处于睡眠状态,从而使其无用。相反,查找检查链接并使用摆动计时器。计时器使用循环和调用在后台线程和后台休眠,允许称为事件调度线程或EDT的Swing事件线程继续运行,允许它执行其重要功能,包括绘制GUI更改

其他问题:您似乎试图将文本解析为double,然后使用==与另一个double值进行比较。执行此操作时要小心,因为double与int不同,==可能会由于数字计算机持有浮点值的不精确方式而失败。使用不同的几乎相等或足够接近相等的测试

请参阅:

比如:

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.setTextWAITING; 线程1000; lblResult.settExt太大; lblResult.setTextWAITING; 删除最后一行,你就好了

lblResult.setTextWAITING; 线程1000; lblResult.settExt太大;
您的回答仍然忽略了一个主要问题,即踩在Swing事件线程上,使其变得无用。@DontKnowmMuchButtingBetter true,但OP没有说明在事件线程上睡觉会导致问题,所以我只回答了所问的问题。另外,你已经指出了这一点。1睡眠是从ActionListener内部调用的,因此保证它是在EDT上调用的,2如果你知道你的Swing,你已经知道这会给OP带来严重问题,并将完全锁定他的GUI。这是一个很严重的问题,所以不应该在答案中传播,因为OP不知道什么更好,但你知道。请更正这一点,以便我可以删除我的反对票。。。。不,我不是为了让我的答案被投票或接受而否决你的答案。请注意,我的回答是作为一个社区维基,这意味着我的回答获得的任何追加投票都不会提高我的声誉。但我仍然必须否决这个答案,直到你们改进它,到时候,如果它也是一个好的答案,我会很高兴地投上一票。请查看对我答案的编辑,以了解需要的内容。@dontknowmuchbuttingbetter好吧。稍后我可能会编辑答案或将其全部删除。现在从手机上编辑它太乏味了。我想应该是:if Math.absnum-answer>EPSILON