8

アプリケーション GUI で基本的なサーモスタットをシミュレートしようとしています。

新しい温度値で 2 秒ごとにラベル ボックスの値を更新したいと考えています。

たとえば、初期温度は 68 度と表示され、2 秒ごとに 69 度、70 度、75 度に更新されます。

これは私がJava fxで書いたコードです。 controlpanelラベルボックスが存在するテフォームのオブジェクトです。最終値のみを 75 として更新します。2 秒ごとに更新するわけではありません。メソッド一時停止を作成して、2 秒の遅延を発生させました。すべてのラベルは最終値で更新されますが、2 秒ごとに更新されるわけではありません。デバッグすると、値が 2 秒ごとに 1 ずつ増加することがわかります。このコードは、ボタンの onClick イベントに記述されています

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    int i=0;
    Timer asd = new Timer(1000,null);

    asd.setDelay(1000);

    while(i < 10)
    {
         jTextField1.setText(Integer.toString(i));
         i++;

         asd.start();
    }
 }  
4

3 に答える 3

17

Timer を使用してタスクを解決するには、コードで実装TimerTaskし、メソッドを使用Timer#scheduleAtFixedRateしてそのコードを繰り返し実行する必要があります。

Timer timer = new Timer();
    timer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            System.out.print("I would be called every 2 seconds");
        }
    }, 0, 2000);

また、UI 操作の呼び出しは、Swing UI スレッド (または JavaFX を使用している場合は FX UI スレッド) で行う必要があることに注意してください。

private int i = 0;
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    Timer timer = new Timer();
    timer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    jTextField1.setText(Integer.toString(i++));
                }
            });
        }
    }, 0, 2000);
}

JavaFX の場合、Swing スレッドではなく「FX UI スレッド」で FX コントロールを更新する必要があります。javafx.application.Platform#runLaterその代わりにメソッドを使用することを達成するにはSwingUtilities

于 2013-04-21T23:39:33.000 に答える