【问题标题】:What prevents changing primaryStage.initStyle() in javafx?是什么阻止了在 javafx 中更改 primaryStage.initStyle()?
【发布时间】:2017-04-07 23:46:44
【问题描述】:

我正在尝试制作一个具有 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 个按钮??

感谢您的帮助。

【问题讨论】:

    标签: java eclipse javafx


    【解决方案1】:

    JavaFX 无法添加条形图和 3 个按钮,因为它不知道如何添加。它甚至不知道窗户装饰是由那些东西组成的。当舞台第一次可见时,JavaFX 要求窗口管理器创建窗口(“舞台”)并传递一些属性,例如大小、位置、类型提示、窗口装饰等。如果请求了窗口装饰,那么它是绘制您的栏和 3 个按钮的窗口管理器。因此,如果没有抛出异常,那么更改装饰样式无论如何都不会产生影响,因为窗口管理器已经创建了窗口(没有装饰)。在窗口管理器管理窗口之后更改此设置将需要运行 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();
    

    【讨论】:

    • 哈哈,谢谢,您回答了我的问题,为我节省了数小时的头痛!我一直认为 primaryStage 是唯一可用的阶段,因为它是唯一的参数,但现在我知道我可以使用不止一个阶段。我现在将看看是否可以使用 FXML 和控制器复制它。
    • 如果你最终使用了两个阶段,你应该交换它们,所以你的应用程序进入初级阶段,启动屏幕进入丢弃阶段
    猜你喜欢
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多