Een timer toevoegen aan mijn programma (Javafx) [DUPLICEER]

Ik probeer een timer toe te voegen aan mijn programma. Ik heb geprobeerd Java.util.Timer te bellen, maar het frustreert me omdat ik de concepten erachter niet volledig begrijp. Ik heb net een semester gedaan van codering in Python, maar dit is een heel ander niveau voor mij.

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

Ik heb een programma gebouwd in python met een hoofdlus. Ik dacht aan een “vuile” manier om het te doen door een vinkje toe te voegen aan de lus die controleert of de seconden van de huidige datum zijn veranderd en als dat zo is, een waarde met één verhogen.

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;
    }
}

Dit is hoe ver ik ben gekomen met het maken van een nieuwe timer. Ik begreep dat ik een taak moest maken en deze op de timer moest plannen, maar ik heb geen flauw idee hoe…

Hoe zou ik dit aanpakken? Sorry voor het ongemak.


Antwoord 1, autoriteit 100%

Timerwordt gebruikt om taken in te plannen.. Dus waar schrijf je die taken op?? Nou, je moet die taken in een TimerTask-klasse schrijven…

Verward? Laat me het opsplitsen,

Timer timer = new Timer();

Nu heb je een object van timer-klasse gemaakt ..
Nu moet je wat taak doen? Dus om dat een voorwerp van TimerTaskcreëert.

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

Nu hebt u een taak aangemaakt waar u de taken moet definiëren die u in de Run-methode wilt doen ..

Waarom heb ik een timertask-klasse zelf geschreven ??
Dat is omdat Timertask een abstracte klasse met drie methoden is ..
Dus je moet het definiëren van welke methode die je wilt gebruiken.

Plan nu de taak

timer.schedule(task,5000l);

Noteer de ‘L’ na 5000. Het is om langatingstype aan te duiden omdat de schedulemethode is gedefinieerd als

void schedule(TimerTask task,long milliseconds)

Voor verdere referentie

https://docs.oracle.com/ Javase / 7 / DOCS / API / JAVA / UTIL / TIMER.HTML

https://docs.oracle.com/ Javase / 7 / docs / API / JAVA / UTIL / TIMERTASH.HTML

Other episodes