我希望我的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 - >申请窗口
答案 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");