我试图使用javax.swing.Timer类的定时器延迟 我试图让JFrame中的标签(温度)每5秒更新一次,但标签有时会在1秒内更新。我希望它只在5秒内发生 这是我的代码的一部分:
int delay = 5000; //milliseconds
ActionListener taskPerformer = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
tempLabel.setVisible(true);
String currTemp = null; //current temperature
try {
currTemp = getWeatherData.getTemp(locationIndex);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
tempLabel.setText("Temperature : " + currTemp);
}
};
Timer timer= new Timer(delay, taskPerformer);
timer.setRepeats(true);
timer.start();
发生了什么?感谢您的阅读
答案 0 :(得分:0)
没有使用swing对象的Timer对象。但是从我能读到的内容来看,你所使用的“延迟”实际上是速度吗?
https://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html
查看timer.setInitialDelay(pause);代替
//编辑:
可能必须在每次“成功运行”之间延迟,而不仅仅是:
Timer timer= new Timer(delay, taskPerformer);
timer.setDelay(delay);
timer.setRepeats(true);
timer.start();
答案 1 :(得分:0)
时间量会受到许多因素的影响。重要的是要记住,Timer
不准确,它只能保证在刻度之间保持最短的时间。
但是,因为Timer
在EDT的上下文中打勾并且我不知道getWeatherData.getTemp
实际上在做什么,所以它可能会阻止EDT并阻止UI更新...或者你的代码中的其他一些东西,你没有向我们展示。
使用SwingWorker
public class TempatureWorker extends SwingWorker<Void, String> {
private int locationIndex;
public TempatureWorker(int locationIndex) {
this.locationIndex = locationIndex;
}
@Override
protected Void doInBackground() throws Exception {
while (!isCancelled()) {
publish(getWeatherData.getTemp(locationIndex));
Thread.sleep(5000);
}
return null;
}
@Override
protected void process(List<String> values) {
String last = values.get(values.size() - 1);
}
}
只要您使用process
方法,就必须弄清楚如何从此处更新UI。你可以将JLabel
的引用传递给worker,但是我很想使用一个观察者模式,因为它解耦了worker。
有关详细信息,请参阅Worker Threads and SwingWorker