2017-09-24 80 views
0

我想让我的JLabel在1秒后更改,但似乎Java只显示最新的文本。如何在一段时间后更改JLabel?

这里是我的代码:

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

我想要什么:显示 “等待” - > 1秒 - >显示 “过大”

作用:test.gif

我怎么能解决这个问题?

谢谢。

语言:Java的
JRE:jre1.8.0_144
IDE:Eclipse的释氧(4.7.0)
使用:摇摆设计师 - >应用程序窗口

回答

1

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

其他问题:您似乎试图解析文本以加倍,然后使用==与另一个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"); 
     } 
    } 
}); 
+0

我觉得应该是:'如果(Math.abs(NUM - 答案)> EPSILON)' –

-2

立即显示 “过大” 后,将其改回为 “WAITING”。

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

删除最后一行,你是好。

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

你的回答仍然忽略了主要问题 - 即步进Swing事件线程上,使之无用的。 –

+0

@DontKnowMuchButGettingBetter true,但OP没有声明睡在事件线程上导致问题,所以我只回答了被问到的问题。另外你已经指出了。 –

+0

1)从ActionListener中调用睡眠,所以可以保证它在EDT上被调用,2)如果你知道你的Swing,你已经知道这会给OP带来严重的问题,并且会完全锁定他的GUI。这是一个给定的,这是一个严重的问题,所以不应该传播的答案,因为OP不知道更好 - 但你**做。请纠正这一点,以便我可以删除我的倒票。 –