Java计时器延迟无法正常工作

时间:2017-04-21 11:29:32

标签: java swing timer

我试图使用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();  

发生了什么?感谢您的阅读

2 个答案:

答案 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