1. ホーム
  2. java

[解決済み] 私のプログラム(javafx)にタイマーを追加する [重複] [重複

2022-03-07 23:29:48

質問内容

私は自分のプログラムにタイマーを追加しようとしています。java.util.Timerを呼び出してみましたが、その背後にある概念を完全に理解していないため、イライラします。私はpythonでコーディングを1学期やったばかりですが、これは私にとって全く異なるレベルです。

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.scene.text.Text;
import javafx.stage.Stage;

import java.awt.event.ActionListener;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class main extends Application implements EventHandler<ActionEvent>{

    Button button;
    Button button2;
    Counter counter = new Counter(0);
    Counter timecounter = new Counter(0);
    Text text_counter = new Text(counter.S_count.get());
    Text text_timecounter = new Text(timecounter.S_count.get());

    Date currdate = new Date();
    int currsec = currdate.getSeconds();


    public static void main(String[] args) {
        launch(args);


    }


    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("Counter Window");

        button = new Button();
        button2 = new Button();
        button.setText("Reset");
        button.setOnAction(this);
        button2.setText("Tick");
        button2.setOnAction(this);
        button.setTranslateY(-120);
        button2.setTranslateY(-80);
        text_counter.textProperty().bind(counter.S_count);
        text_timecounter.textProperty().bind(timecounter.S_count);
        text_timecounter.setTranslateX(-100);



        StackPane layout = new StackPane();
        layout.getChildren().add(button);
        layout.getChildren().add(button2);
        layout.getChildren().add(text_counter);
        layout.getChildren().add(text_timecounter);

        Scene scene = new Scene(layout, 360,280);
        primaryStage.setScene(scene);

        primaryStage.show();
    }

    @Override
    public void handle(ActionEvent event) {
        if(event.getSource()==button){
            counter.Reset();
        }
        if(event.getSource()==button2){
            counter.Tick();
        }
    }
}

Pythonでメインループを持つプログラムを作りました。ループの中に、現在の日付の秒数が変わったかどうかをチェックし、変わった場合は値を1つインクリメントするチェックを追加することで、"dirty"を行う方法を考えていました。

class timerclass {
    Timer timer1;
    private int timecounter = 0;

    TimerTask Task1 = new TimerTask() {
        @Override
        public void run() {
            setTimecounter(getTimecounter()+1);
        }
    };

    public timerclass(){
        timer1 = new Timer();

    }

    public int getTimecounter() {
        return timecounter;
    }

    public void setTimecounter(int timecounter) {
        this.timecounter = timecounter;
    }
}

ここまでが、新しいタイマーを作るまでの流れです。タスクを作成して、それをタイマーにスケジュールしなければならないことは理解できましたが、その方法が全く分かりません...。

どうすればいいのでしょうか?ご不明な点があり申し訳ありません。

どのように解決するのですか?

Timer は、次のように使用します。 タスクのスケジュール .. では、そのタスクはどこに書けばいいのでしょうか?そうですね、タスクは TimerTask クラスがあります...

混乱してる?分解してみましょう。

Timer timer = new Timer();

これで、Timerクラスのオブジェクトが作成されました。 さて、これから何か作業をしなければなりませんね?そのためには、次のようなオブジェクトを作成します。 TimerTask .

TimerTask task = new TimerTask()
{
        public void run()
        {
            //The task you want to do       
        }

};

これでタスクが作成され、runメソッドの中で実行したいタスクが定義されました。

なぜTimerTaskクラスそのものを書いたのでしょうか? それは、TimerTaskが3つのメソッドを持つ抽象クラスだからです。 そのため、どのメソッドを使用したいかを定義する必要があります...

タスクのスケジューリング

timer.schedule(task,5000l);

5000の後の'l'に注意してください。これは長いデータ型を表すものです。 schedule メソッドは次のように定義されています。

void schedule(TimerTask task,long milliseconds)

参考までに

https://docs.oracle.com/javase/7/docs/api/java/util/Timer.html

https://docs.oracle.com/javase/7/docs/api/java/util/TimerTask.html