2016-11-23 11 views
2

2つの画面を持つ単純なアプリケーションを作成しようとしています.1つはアプリケーションを読み込み、もう1つは入力された項目の価格をJavaとCSS(FXMLなし)で合計しますが、スプラッシュ画面には止まっています。私はこれを知っていますjavafxでprimaryStage.initStyle()を変更できないのはなぜですか?

primaryStage.initStyle(StageStyle.UNDECORATED); 

このポストからウィンドウの上のボタンを取り除きます。スプラッシュ画面が閉じたら、

How to remove JavaFX stage buttons (minimize, maximize, close)

(私はそれが5秒で閉じるように設定されている)、私は、ユーザーに見えるように3つのボタンが欲しいです。だから、明らかにこれがこれです。

PauseTransition delay = new PauseTransition(Duration.seconds(5)); 
delay.setOnFinished(e -> { 
    primaryStage.setScene(mainScene); 
    primaryStage.initStyle(StageStyle.DECORATED); 
}); 
delay.play(); 

primaryStage.show(); 

しかし、私はこのスタックトレースを取得:

Exception in thread "JavaFX Application Thread" java.lang.IllegalStateException: Cannot set style once stage has been set visible 
at javafx.stage.Stage.initStyle(Stage.java:493) 
at splash.SplashScreen.lambda$0(SplashScreen.java:42) 
at javafx.animation.Animation.impl_finished(Animation.java:1132) 
at javafx.animation.AnimationAccessorImpl.finished(AnimationAccessorImpl.java:49) 
at com.sun.scenario.animation.shared.SingleLoopClipEnvelope.timePulse(SingleLoopClipEnvelope.java:103) 
at javafx.animation.Animation.impl_timePulse(Animation.java:1102) 
at javafx.animation.Animation$1.lambda$timePulse$25(Animation.java:186) 
at java.security.AccessController.doPrivileged(Native Method) 
at javafx.animation.Animation$1.timePulse(Animation.java:185) 
at com.sun.scenario.animation.AbstractMasterTimer.timePulseImpl(AbstractMasterTimer.java:344) 
at com.sun.scenario.animation.AbstractMasterTimer$MainLoop.run(AbstractMasterTimer.java:267) 
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:506) 
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:490) 
at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$404(QuantumToolkit.java:319) 
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) 

私は、アプリを開くスプラッシュ画面がちょうどN秒待つことになっていないことを知っているが、それはポイントではありません。

スタックトレースの最初の行は、「ステージが表示されたらスタイルを設定できません」ということです。なぜスタイルを変更できないのですか? JavaFXでバーと3つのボタンを追加できないのは何ですか?私もこれをやってみました

:ウィンドウを非表示に努めて

PauseTransition delay = new PauseTransition(Duration.seconds(5)); 
delay.setOnFinished(e -> { 
    primaryStage.hide(); 
    primaryStage.setScene(mainScene); 
    primaryStage.initStyle(StageStyle.DECORATED); 
    primaryStage.show(); 
}); 
delay.play(); 

primaryStage.show(); 

を、initStyleを変更し、それを示しているが、私はもう一度同じエラーを取得します。

私の質問は、なぜ私はスタイルを変更できないのですか? JavaFXでバーと3つのボタンを追加できないのは何ですか?

ご協力いただき、ありがとうございます。

答えて

3

JavaFXは、方法とわからないので、バーと3つのボタンを追加できません。それは、窓装飾がそれらのもので構成されていることさえ知りません。ステージが最初に可視になると、JavaFXはウィンドウマネージャーにウィンドウ(「ステージ」)を作成し、サイズ、位置、タイプヒント、ウィンドウ装飾などのいくつかのプロパティを渡します。ウィンドウ装飾が要求された場合、バーと3つのボタンを描画するウィンドウマネージャ。したがって、例外がスローされなかった場合、装飾スタイルを変更すると、ウインドウ(装飾なし)が既にウィンドウマネージャによって作成されているため、何の効果もありません。ウィンドウマネージャがウィンドウを管理した後でこれを変更するには、JavaFXが動作するすべてのプラットフォーム(実装している場合)の実装が必要です。

私は、2番目のステージを使用するだけで、個々の問題を解決できると思います。

Stage mainAppStage = new Stage(); 
mainAppStage.setScene(mainScene); 

PauseTransition delay = new PauseTransition(Duration.seconds(5)); 
delay.setOnFinished(e -> { 
    primaryStage.hide(); 
    mainAppStage.show(); 
}); 
delay.play(); 

primaryStage.show(); 
+0

おかげさまで、あなたは私の質問に答え、頭痛の数時間を節約しました!私はいつもprimaryStageが唯一のパラメータだったので唯一の使用可能なステージだと思っていましたが、今ではそれ以上のものを使うことができます。私は今FXMLとコントローラでそれを複製できるかどうかを見ていきます。 –

+0

2つのステージを使用して終了する場合は、スワップする必要があります。そのため、アプリはメインステージに入り、スプラッシュスクリーンはスローアウェイステージに入ります – Poundex

関連する問題