2016-11-23 1 views
2

Ich versuche, eine einfache App zu machen, die 2 Bildschirme hat, eine, die die App lädt, eine, die die Preise der eingegebenen Elemente mit nur Java und CSS (keine FXML) summiert, aber ich bin auf dem Begrüßungsbildschirm stecken. Ich weiß, dass dieseWas verhindert die Änderung von primaryStage.initStyle() in javafx?

primaryStage.initStyle(StageStyle.UNDECORATED); 

von diesem Beitrag die Tasten oben auf dem Fenster loswird.

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

Sobald der Begrüßungsbildschirm schließt (ich habe es in 5 Sekunden gesetzt, um zu schließen), möchte ich die 3 Tasten für den Benutzer sichtbar sein. Es wäre also naheliegend, dies zu tun.

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

primaryStage.show(); 

Aber ich bekomme diesen Stack-Trace:

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) 

Ich weiß, dass ein Splash-Screen nicht nur soll n Sekunden warten, dann die App öffnen, aber das ist nicht der Punkt.

Was mir am meisten auffällt, ist die erste Zeile des Stack-Trace: "Style kann nicht eingestellt werden, nachdem die Stufe sichtbar gemacht wurde". Warum kann ich den Stil nicht ändern? Was verhindert, dass JavaFX eine Bar und 3 Tasten hinzufügt?

Ich habe auch schon versucht, diese zu tun:

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

in dem Bemühen um das Fenster zu verstecken, die initStyle ändern, dann zeigen, aber ich bekomme den gleichen Fehler noch einmal.

Also noch einmal, meine Frage ist, warum kann ich den Stil nicht ändern? Was verhindert, dass JavaFX eine Bar und 3 Tasten hinzufügt?

Ich bin dankbar für jede Hilfe.

Antwort

3

JavaFX kann keine Leiste und 3 Tasten hinzufügen, weil es nicht weiß, wie. Es weiß nicht einmal, dass Fensterdekoration aus diesen Dingen besteht. Wenn die Bühne zum ersten Mal sichtbar gemacht wird, fordert JavaFX den Fenstermanager auf, das Fenster ("Bühne") zu erstellen und übergibt ihm einige Eigenschaften wie Größe, Position, Typhinweis, Fensterdekoration usw. Wenn Fensterdekoration angefordert wurde, dann ist es Der Window Manager, der Ihre Bar und 3 Tasten zeichnet. Wenn also die Ausnahme nicht ausgelöst wurde, hat das Ändern des Dekorations-Stils sowieso keine Auswirkungen, da das Fenster (ohne Dekoration) bereits vom Window Manager erstellt wurde. Dies zu ändern, nachdem der Window Manager das Fenster verwaltet, würde Implementierungen für alle Plattformen erfordern, auf denen JavaFX läuft (falls sie dies unterstützen).

Und ich denke, Sie können Ihr individuelles Problem nur durch die Verwendung einer zweiten Stufe lösen.

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

Haha danke, du hast meine Frage beantwortet UND mir Kopfschmerzen erspart! Ich dachte immer, dass primaryStage die einzige verwendbare Stufe ist, da es der einzige Parameter ist, aber jetzt weiß ich, dass ich mehr als diese eine Stufe verwenden kann. Ich werde jetzt sehen, ob ich es mit FXML und einem Controller replizieren kann. –

+0

Wenn du zwei Stufen verwendest, solltest du sie tauschen, damit deine App in die erste Stufe geht und der Begrüßungsbildschirm in die Wegwerfphase geht – Poundex

Verwandte Themen