2017-04-21 7 views
0

javax.swing.Timerクラスからタイマーの遅延を使用しようとしています。
私は5秒ごとに更新されるJFrameのラベル(温度)を取得しようとしていますが、ラベルは1秒で更新されることがあります。私はそれが5秒で起こることを望む。ここ
は、私のコードの一部です:Javaタイマーの遅延が正しく機能しない

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(); 

何が起こっていますか?読書ありがとう

+1

ためWorker Threads and SwingWorkerを参照してください?タイマーは5秒ごとに呼び出されているかもしれませんが、 'getTemp'は4秒で完了します。この場合、' SwingWorker'を使うほうが良いかもしれません。 – MadProgrammer

+0

getTempは定数ですが、私のコードにSwingWorkerをどのように使うのか教えてください。 – fredjohnson

答えて

0

スイングからTimerオブジェクトを使用していない。しかし、私が読むことができる、あなたが使用している "遅延"は、実際にスピードですか?

https://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html

timer.setInitialDelay(休止)に見て。代わりに

// EDIT:時間の量は、物事の数によって影響を受ける可能性が

Timer timer= new Timer(delay, taskPerformer); 
timer.setDelay(delay); 
timer.setRepeats(true); 
timer.start(); 
+0

がうまく動作しませんでした:/ – fredjohnson

+0

初期のものではなく、成功したすべての実行の間に遅延が生じることがあります。 https://docs.oracle.com/javase/8/docs/api /javax/swing/Timer.html タイマータイマー=新しいタイマー(delay、taskPerformer); timer.setDelay(遅延); timer.setRepeats(true); timer.start(); – Gnewbie

+0

さて、私はそれを試みました。しかし、まだ動作しませんでした:( – fredjohnson

0

はそれをちょうどすべての「正常に実行」の代わりの間の遅延を与えなければならないかもしれません。 Timerは正確ではないことを覚えておくことが重要です。ダニ間の最小時間を保証することのみを想定しています。しかし

Timer EDTの文脈の中でダニと私は実際に何をしているのかgetWeatherData.getTemp見当がつかないので、それがEDTを遮断し、更新されてからのUIを防止することだということが可能です...または他のものの全体の束あなたが私たちに示していないあなたのコードで。

あなたがいる限り、あなたがprocess方法からやっているとして、あなたはここから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); 
    } 

} 

を使用する方がよいかもしれません。あなたはJLabelの参照をワーカーに渡すことができますが、ワーカーを切り離すので、代わりにオブザーバーパターンを使用するように誘惑されます。

は `getTemp`を呼び出すために時間がかかりますどのくらいの詳細

関連する問題