19

javafxを使用して、所定の不規則な間隔で画面に表示されるコードを作成しようとしています。タイマー( javax.swingではなくjava.util )を使用しようとしましたが、別のスレッドから作業している場合、アプリケーションで何も変更できないことがわかりました(タイマーのように)誰か教えてくださいそれらが両方とも別々のスレッドである場合、アプリケーションと対話するタイマーを取得しますか?

4

3 に答える 3

22

JavaFX アプリケーションスレッドで将来のアクションをスケジュールjava.util.Timerする必要はありません。java.util.concurrent.ScheduledExecutorServiceJavaFX Timeline をタイマーとして使用できます。

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

または、 ReactFXの便利なメソッドを使用できます。

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

Platform.runLaterアクションはJavaFXアプリケーション・スレッドですでに実行されているため、 でラップする必要はありません。

于 2014-06-03T21:48:12.900 に答える
18

berry120の回答はjava.util.Timerでも機能するため、実行できます

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

私はこれを使用しましたが、完全に機能します

于 2013-09-06T09:51:31.300 に答える
18

JavaFX コンポーネントに触れる場合は、プラットフォーム スレッド (基本的には JavaFX のイベ​​ント ディスパッチ スレッド) から行う必要があります。これは、 を呼び出すことで簡単に実行できますPlatform.runLater()。したがって、たとえば、これを行うことは完全に安全です。

new Thread() {
    public void run() {
        //Do some stuff in another thread
        Platform.runLater(new Runnable() {
            public void run() {
                label.update();
                javafxcomponent.doSomething();
            }
        });
    }
}.start();
于 2013-05-27T11:03:36.400 に答える