最好在swing应用程序中使用javax.swing.Timer
而不是使用java.util.Timer
吗?
例如:
Timer timer = new Timer(1000, e -> label.setText(new Date().toString()));
timer.setCoalesce(true);
timer.setRepeats(true);
timer.setInitialDelay(0);
timer.start();
或
new java.util.Timer().scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
label.setText(new Date().toString());
}
}, 0, 1000);
这两者有什么区别吗?
答案 0 :(得分:10)
区别:
java.util.Timer
启动自己的Thread
来运行任务。
javax.swing.Timer
计划在EDT上执行的任务。
现在。 Swing是单线程的。
您必须仅从EDT访问和改变Swing组件。
因此,要每隔X秒更改一次GUI,请使用Swing计时器。要做后台业务逻辑,请使用其他计时器。或者更好ScheduledExecutorService
。
记住一个非常重要的事情;如果你花时间在EDT上,就不能花时间更新GUI。
答案 1 :(得分:4)
主要区别在于javax.swing.Timer
在EDT上运行其代码,而java.util.timer
在单独的线程上运行。因为如果您以任何方式操作GUI,最好使用此摆动计时器。虽然如果您更喜欢使用不同类型的计时器,那么您仍然可以在EDT上调用您的代码。
new java.util.Timer().scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
label.setText(new Date().toString());
}
});
}, 0, 1000);