2016-04-12 3 views
0

Ich versuche, eine Bezeichnung alle bestimmten Sekunden zu aktualisieren, habe versucht, einen normalen Timer, aber da es in einem anderen Thread Änderungen an der Beschriftung vornehmen kann, ist dies der Timer:Verwenden Sie TimeLine, um eine void-Methode alle bestimmten Sekunden auszulösen JavaFX

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

ich gelesen, dass ich periodische Änderungen an einem Etikett mit Timeline machen kann, aber ich kann nicht verstehen, wie es die Schlüsselwerte und die Keyframes funktioniert, gibt es eine Möglichkeit nur ohne Animation beteiligt eine Lücke Methode auszulösen?

Antwort

3

Sie können die KeyFrame constructor verwenden, die eine Duration und einen Event-Handler nimmt:

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

Update: Wenn Sie auf eine Schaltfläche müssen sie stoppen, können Sie mit

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

tun, dass ich ein gebrauchtes Codeschnipsel wie der in Ihrer Antwort, die auch Lambda verwendet, das Problem ist, dass ich den Timer mit einer Schaltfläche stoppen möchte und wenn ich versuchte, das Timeline-Objekt zu deklarieren und es dann an den Konstruktor übergeben, sagte es, dass es sein musste Endlich, wenn ich Lambda benutzt habe, haben Sie eine Idee, wie Sie die Timeli referenzieren können ne um es zu stoppen? –

+0

Wenn Sie ihm nur einmal einen Wert zuweisen, ist es "effektiv final" und kann in einem Lambda verwendet werden. Ich sehe keinen Grund, dass Sie es trotzdem mehrfach zuweisen würden. Sie können immer eine Instanzvariable machen, wenn Sie wirklich brauchen. –

+0

Versetze ich den Code, den du postest, in das Update innerhalb der Konstruktormethode? –

Verwandte Themen