2013-05-26 16 views
17

Ekranda bazı şeyleri javafx kullanarak önceden belirlenmiş ancak düzensiz aralıklarla gösterecek bir kod yazmaya çalışıyorum. Bir zamanlayıcı (java.util, değil javax.swing) kullanmayı denedim, ancak ayrı bir iş parçacığı çalışıyorsanız uygulamada bir şey değiştiremezsiniz çıkıyor. (Timer gibi) Herkes bana nasıl bir Zamanlayıcı alabilirim Her ikisi de ayrı iş parçacığı olan uygulama ile etkileşim?Zamanlayıcılar ve javafx

+1

[JavaFX'te her iki saniyede bir etiket nasıl güncellenir] bölümüne bakın (http://stackoverflow.com/questions/16128423/how-to-update-the-label-box-every-2-seconds-in-java -fx/16138351 # 16138351); Örneğin kullanıcı arabirimini ayrı bir iş parçacığından güncelleştirmek için [Platform.runLater] (http://docs.oracle.com/javafx/2/api/javafx/application/Platform.html#runLater (java.lang.Runnable)) kullanın veya kullanın Her şeyi UI iş parçacığında tutmak için [JavaFX animasyon çerçevesi] (http://docs.oracle.com/javafx/2/api/javafx/animation/package-summary.html). – jewelsea

cevap

16

Herhangi bir JavaFX bileşenine dokunursanız, bunu Platform iş parçacığından yapmanız gerekir (temelde JavaFX için olay gönderme iş parçacığıdır.) Bunu Platform.runLater() numaralı telefonu arayarak kolayca yapabilirsiniz. Eğer

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); 
bunu kullandım

yapabilirsiniz böylece

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

berry120 cevap çok java.util.Timer ile çalışır ve mükemmel

18
çalışır: Yani, örneğin, bunu yapmak tamamen güvenli

JavaFX uygulama dizisindeki gelecekteki eylemleri planlamak için java.util.Timer veya java.util.concurrent.ScheduledExecutorService'a ihtiyacınız yoktur. Eğer ReactFX bir kolaylık yöntemi kullanabilirsiniz, Alternatif

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

: Bir zamanlayıcı olarak JavaFX Zaman Çizelgesi kullanabilirsiniz, sen Platform.runLater harekete sarmak gerekmez

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

Not bunun nedeni JavaFX uygulama iş parçacığında zaten yürütülür.

+0

ReactFX'i kullanıyorsanız, ReactFX'in Zamanlayıcısı ve FxTimer'i nasıl duraklatır ve devam ettirirsiniz? Periyodik bir şey kaydetmek için kullanıyorum. Timeline'ın duraklatma() ve play() gibi, ReactFX'de eşdeğer bir duraklama() ve oynatma() var mı? – mk7