将计时器添加到我的程序(javafx)

将计时器添加到我的程序(javafx),java,javafx,timer,counter,Java,Javafx,Timer,Counter,我正在尝试为我的程序添加计时器。我尝试调用java.util.Timer,但它让我很沮丧,因为我不完全理解它背后的概念。我刚刚用python编写了一学期的代码,但这对我来说是一个完全不同的水平 import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.

我正在尝试为我的程序添加计时器。我尝试调用java.util.Timer,但它让我很沮丧,因为我不完全理解它背后的概念。我刚刚用python编写了一学期的代码,但这对我来说是一个完全不同的水平

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();
        }
    }
}
这就是我在创建新计时器方面取得的进展。我知道我必须创建一个任务并将其安排到计时器上,但我一点也不知道如何


我该怎么办?很抱歉出现这种不方便。

计时器用于安排任务。。那么你在哪里写这些任务??您必须在
TimerTask
类中编写这些任务

困惑?让我把它分解一下

Timer timer = new Timer();
现在您已经创建了Timer类的对象。。 现在你必须做一些工作,对吗?为此,创建一个
TimerTask
对象

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

};
现在您已经创建了一个任务,您应该在其中定义要在run方法中执行的任务

为什么我自己写了一个TimerTask类?? 这是因为TimerTask是一个具有三个方法的抽象类。。 因此,您需要定义要使用的方法

现在安排任务

timer.schedule(task,5000l);
注意5000后面的“l”。表示长数据类型,因为
计划
方法定义为

void计划(TimerTask任务,长毫秒)

供进一步参考


您不需要计时器,可以使用计时器。Tomas的博客(忽略其中的ReactFX内容)。你不应该将awt类导入JavaFX应用程序。你应该提供一个(完整的代码,通过复制和粘贴进行编译)。你不应该“向循环添加检查”,因为这可能会冻结你的应用程序或不必要地消耗CPU周期。遵循你的代码。你就是那个人,伙计!谢谢你帮我。我学习6个月就要成为一名程序员了,正是像你这样的人帮助我掌握了这些东西。谢谢如果使用计时器,请确保使用完成可能影响活动场景图的任何修改,否则可能会得到不可预测的结果。。是的,@jewelsea声明,如果您对任何节点进行更新,您必须调用此方法。。任何与JavaFX接口相关的东西(节点、场景等)@Dennis Lukas很乐意帮助..!!:)很好的解释+效果很好。
timer.schedule(task,5000l);