大家好我想问一下是否有可能不使用Java netbeans中的计时器在我的JLabel上使用while循环显示我的变量“counter”的所有值。这是我的示例代码。
int counter = 0;
while (counter < 10) {
lblDisplay.setText("Completed " + Integer.toString(counter));
try {
Thread.sleep(1000);
lblDisplay.setText("Completed " + Integer.toString(counter));
} catch (InterruptedException ex) {
Logger.getLogger(Increment.class.getName()).log(Level.SEVERE, null, ex);
}
counter++;
}
在使用system.out.println时它显示但是在我的Label中没有。
答案 0 :(得分:3)
是的,可以避免使用Swing Timer来实现这一目标,但如果你这样做了,那么:
Thread.sleep(...)
在Swing事件线程的后台线程中运行。如果不这样做,您将冻结事件线程,从而冻结GUI并使其无效。由于所涉及的额外工作和错误的风险,你会发现只使用Swing Timer它 更简单,更安全。例如,您发布的代码看起来很有可能将整个GUI /应用程序置于睡眠状态,因为它既有一个while循环又一个Thread.sleep(...)
被调用,而不用考虑线程。
例如,如果没有Timer,您的代码可能看起来像(警告:代码未编译或测试):
new Thread(new Runnable() {
public void run() {
int counter = 0;
while (counter < 10) {
lblDisplay.setText("Completed " + Integer.toString(counter));
try {
Thread.sleep(1000);
final int finalCounter = counter;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
lblDisplay.setText("Completed " + finalCounter);
}
});
} catch (InterruptedException ex) {
Logger.getLogger(Increment.class.getName()).log(Level.SEVERE, null, ex);
}
counter++;
}
}
}).start();
这比我喜欢的要复杂一点,而Swing Timer可能看起来像:
int delay = 1000;
new Timer(delay, new ActionListener() {
private int count = 0;
@Override
public void actionPerformed(ActionEvent e) {
if (count < 10) {
lblDisplay.setText("Completed " + counter);
} else {
((Timer) e.getSource()).stop(); // stop the Timer
}
counter++;
}
}).start();
这比以前更简单,更安全。