Search code examples
javajavafxtimerlabeltimeline

Use TimeLine to trigger a void method every certain seconds JavaFX


Im trying to update a label every certain seconds, I tried using a normal Timer but since its in another thread it cannot make changes to the label, this is the Timer:

 public void setTimer(Timer timer, int seconds, String userName, String content, VBox tabContent,ArrayList<Integer> countTweetsArray, Label statusLabel) {
 TabContent tabContentObj = new TabContent();
 timer.schedule(new TimerTask() {
     @Override
     public void run() {
         setTweet(userName, content);
         //tabContentObj.createStatusScreen(tabContent, countTweetsArray, remainingTweets);
         System.out.println(content+"  after  "+seconds);
         System.out.println("countTweetsArray: "+countTweetsArray.get(0));
         statusLabel.setText(countTweetsArray.get(0).toString());
         countTweetsArray.set(0, (countTweetsArray.get(0)+1));
         tabContentObj.timersMap.put(userName, timer);
     }
 }, (seconds*1000));
 }

I read that I can make periodic changes to a label using TimeLine but I cant understand how it works the keyvalues and the keyframes, Is there a way to just trigger a void method without any animation involved?


Solution

  • You can use the KeyFrame constructor that takes a Duration and an event handler:

    Timeline timeline = new Timeline(
        new KeyFrame(Duration.seconds(seconds), e -> {
            // code to execute here...
        })
    );
    timeline.play();
    

    Update: if you need a button to stop it, you can do that with

    Button button = new Button("Stop");
    button.setOnAction(e -> timeline.stop());