2016-08-30 19 views
0

私は本当にjavaFXの初心者ですが、おそらく私は何か不足していますが、私の問題は次のとおりです。Platform.runLaterの実行後に遅延を追加します

私のコードは、この(各メソッドは、GUIの変更を行いますが、最終的な結果はもちろんの最後の方法で与えられる)ようになっています。それぞれの実行の間であれば

public void updateGui() 
{ 
    Platform.runLater(() -> { 
     doFirstStuff(); 
     doSecondStuff(); 
     doThirdStuff(); 
    }); 
} 

それはいいだろうメソッドには、アプリケーションに何が起こったかをユーザーに知らせるために少し遅れていました(1,2秒または3秒)。各メソッド呼び出しの後

Thread.sleep(1000); 

が、スレッドはJavaFXのアプリケーションスレッドであるため、結果はひどいです:

私の試みが置かれました。

私の心に今まで来て別の解決策は次のとおりです。

は、このようなRunnableを持つ別のスレッドで各メソッドを実行します。

() -> { 
    Platform.runLater(() -> { 
     doFirstStuff(); 
    }); 
    Thread.sleep(1000); 
}); 

updateGui()newSingleThreadExecutor()にタスクを送信して待ちます各タスクの終了のために。しかし、私は知らない、それは良い解決策に見えない。

私の目標を達成する最良の方法は何ですか?

答えて

4

最も簡単な方法は、ちょうどTimelineを使用することです:

public void updateGui() { 
    final KeyFrame kf1 = new KeyFrame(Duration.seconds(0), e -> doFirstStuff()); 
    final KeyFrame kf2 = new KeyFrame(Duration.seconds(1), e -> doSecondStuff()); 
    final KeyFrame kf3 = new KeyFrame(Duration.seconds(2), e -> doThirdStuff()); 
    final Timeline timeline = new Timeline(kf1, kf2, kf3); 
    Platform.runLater(timeline::play); 
} 

私は(そうでない場合は、単にPlatform.runLater(...)を削除し、直接timeline.play()を呼び出す)updateGui()は、バックグラウンドスレッドで呼び出されていることを、ここで想定しています。

あなたは本当にスレッドを持つ手が汚れて取得したい場合は、あなたが

public void updateGui() { 

    Thread thread = new Thread(() -> { 
     try { 
      Platform.runLater(() -> doFirstStuff()); 
      Thread.sleep(1000); 
      Platform.runLater(() -> doSecondStuff()); 
      Thread.sleep(1000); 
      Platform.runLater(() -> doThirdStuff()); 
     } catch (InterrupedException exc) { 
      // should not be able to get here... 
      throw new Error("Unexpected interruption"); 
     } 
    }; 
    thread.start(); 
} 

と同じ(多かれ少なかれ)を達成でしたが、私はこのようなユースケースで考える、のTimeline(または他のパーツアニメーションAPI)ははるかにクリーンです(新しいスレッドを作成しないため、リソースを少なくします)。

+0

これはどのように機能していますか? 'Platform.runLater(タイムライン::再生); } '初めて見た.. – GOXR3PLUS

+1

@ GoXr3Plus [メソッド参照](https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html)です。 'Platform.runLater(() - > timeline.play())'と同等です。 'timeline.play()'のシグネチャ(パラメータなし、戻り値なし)は 'Runnable'の抽象メソッドのシグネチャと同じであるため、' Runnable.run () 'を返します。 –

+0

ありがとう!ちょうど私が必要なもの!私は両方と、私の 'newSingleThreadExecutor()'ソリューションを試してみましたが、すべて私の目的のためにうまくいきますが、私は 'タイムライン 'の方法がこの種の問題に最適だと思います。はい、バックグラウンドスレッドから 'updateGui()'を呼び出しています(おそらく、指定する必要があります、残念です)。最後のこと: 'KeyFrames'と' Timeline'の 'final'修飾子はなぜですか? –

関連する問題