什么阻止改变javafx中的primaryStage.initStyle()?

时间:2016-11-23 20:15:45

标签: java eclipse javafx

我正在尝试创建一个简单的应用程序,它有2个屏幕,一个加载应用程序,一个用Java和CSS(没有FXML)总计输入项目的价格,但我仍然坚持不懈屏幕。我知道这个

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个按钮??

我感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

JavaFX无法添加栏和3个按钮,因为它不知道如何操作。它甚至不知道窗户装饰是由那些东西组成的。当舞台首次可见时,JavaFX要求窗口管理器创建窗口(“舞台”)并传递一些属性,如大小,位置,类型提示,窗口装饰等。如果请求窗口装饰,那么它是绘制栏和3个按钮的窗口管理器。因此,如果没有抛出异常,那么改变装饰样式无论如何都没有效果,因为窗口管理器已经创建了窗口(没有装饰)。在Window Manager管理窗口之后更改此窗口将需要实现JavaFX运行的所有平台(如果它们支持它)。

我认为你可以通过使用第二阶段来解决你的个人问题。

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