2013-05-26 13 views
17

Sto cercando di scrivere un codice che faccia apparire le cose sullo schermo ad intervalli predeterminati ma irregolari usando javafx. Ho provato a utilizzare un timer (java.util, non javax.swing) ma risulta che non è possibile modificare nulla nell'applicazione se si sta lavorando da un thread separato. (Come un timer) Qualcuno può dirmi come posso ottenere un timer per interagire con l'applicazione se sono entrambi thread separati?Timer e javafx

+1

Vedere [Come aggiornare un'etichetta ogni 2 secondi in JavaFX] (http://stackoverflow.com/questions/16128423/how-to-update-the-label-box-every-2-seconds-in-java -fx/16138351 # 16138351); cioè utilizzare [Platform.runLater] (http://docs.oracle.com/javafx/2/api/javafx/application/Platform.html#runLater (java.lang.Runnable)) per aggiornare l'interfaccia utente da un thread separato o utilizzare il [framework di animazione JavaFX] (http://docs.oracle.com/javafx/2/api/javafx/animation/package-summary.html) per mantenere tutto nel thread dell'interfaccia utente. – jewelsea

risposta

16

Se si tocca un componente JavaFX, è necessario farlo dal thread Platform (che è essenzialmente il thread di invio eventi per JavaFX). È possibile farlo facilmente chiamando Platform.runLater(). Così, per esempio, è perfettamente sicuro per fare questo:

new Thread() { 
    public void run() { 
     //Do some stuff in another thread 
     Platform.runLater(new Runnable() { 
      public void run() { 
       label.update(); 
       javafxcomponent.doSomething(); 
      } 
     }); 
    } 
}.start(); 
17

risposta berry120 lavora con java.util.Timer troppo in modo da poter fare

Timer timer = new java.util.Timer(); 

timer.schedule(new TimerTask() { 
    public void run() { 
     Platform.runLater(new Runnable() { 
      public void run() { 
       label.update(); 
       javafxcomponent.doSomething(); 
      } 
     }); 
    } 
}, delay, period); 

ho usato questo e funziona perfettamente

18

Non è necessario java.util.Timer o java.util.concurrent.ScheduledExecutorService per pianificare azioni future sul thread dell'applicazione JavaFX. È possibile utilizzare JavaFX Timeline come un timer:

new Timeline(new KeyFrame(
     Duration.millis(2500), 
     ae -> doSomething())) 
    .play(); 

In alternativa, è possibile utilizzare un metodo comodo da ReactFX:

FxTimer.runLater(
     Duration.ofMillis(2500), 
     () -> doSomething()); 

Si noti che non è necessario per avvolgere l'azione in Platform.runLater, perché è già stato eseguito sul thread dell'applicazione JavaFX.

+0

come si fa a mettere in pausa e riprendere il Timer e FxTimer di ReactFX se si utilizza ReactFX? Lo sto usando per salvare qualcosa periodicamente. C'è una pausa equivalente() e play() in ReactFX, proprio come la pausa di Timeline() e play()? – mk7