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