一段时间后如何更改 JLabel?
How can I change JLabel after a period of time?
我希望我的 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");
}
}
});
我想要的:显示"WAITING" -> 1s -> 显示"TOO LARGE"
它的作用:test.gif
我该如何解决这个问题?
谢谢。
语言:Java
JRE: jre1.8.0_144
IDE:Eclipse 氧气释放 (4.7.0)
使用:Swing 设计器 -> 应用程序 Window
不要在 Swing 事件线程上调用 Thread.sleep
,因为这会使整个 GUI 应用程序进入睡眠状态,使其无用。而是查找 Swing Timer tutorial(检查 link)并使用 Swing Timer。计时器使用循环和调用在后台线程和幕后休眠,允许 Swing 事件线程(称为事件调度线程或 EDT)继续 运行,允许它执行其重要功能,包括绘制对 GUI 的更改。
其他问题:您似乎在尝试将文本解析为双精度值,然后使用 ==
与另一个双精度值进行比较。这样做时要小心,因为双精度数不像整数,并且 ==
可能会由于数字计算机保存浮点值的不精确方式而失败。请改用 "almost" 或 "close-enough" 相等性的不同测试。
请看: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");
}
}
});
显示 "TOO LARGE" 后立即将其更改回 "WAITING"。
lblResult.setText("WAITING");
Thread.sleep(1000);
lblResult.setText("TOO LARGE");
lblResult.setText("WAITING");
删除最后一行就可以了。
lblResult.setText("WAITING");
Thread.sleep(1000);
lblResult.setText("TOO LARGE");
我希望我的 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");
}
}
});
我想要的:显示"WAITING" -> 1s -> 显示"TOO LARGE"
它的作用:test.gif
我该如何解决这个问题?
谢谢。
语言:Java
JRE: jre1.8.0_144
IDE:Eclipse 氧气释放 (4.7.0)
使用:Swing 设计器 -> 应用程序 Window
不要在 Swing 事件线程上调用 Thread.sleep
,因为这会使整个 GUI 应用程序进入睡眠状态,使其无用。而是查找 Swing Timer tutorial(检查 link)并使用 Swing Timer。计时器使用循环和调用在后台线程和幕后休眠,允许 Swing 事件线程(称为事件调度线程或 EDT)继续 运行,允许它执行其重要功能,包括绘制对 GUI 的更改。
其他问题:您似乎在尝试将文本解析为双精度值,然后使用 ==
与另一个双精度值进行比较。这样做时要小心,因为双精度数不像整数,并且 ==
可能会由于数字计算机保存浮点值的不精确方式而失败。请改用 "almost" 或 "close-enough" 相等性的不同测试。
请看: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");
}
}
});
显示 "TOO LARGE" 后立即将其更改回 "WAITING"。
lblResult.setText("WAITING");
Thread.sleep(1000);
lblResult.setText("TOO LARGE");
lblResult.setText("WAITING");
删除最后一行就可以了。
lblResult.setText("WAITING");
Thread.sleep(1000);
lblResult.setText("TOO LARGE");