gpt4 book ai didi

java - 是什么阻止了在 javafx 中更改 primaryStage.initStyle()?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:04:42 25 4
gpt4 key购买 nike

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

感谢您的帮助。

最佳答案

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

关于java - 是什么阻止了在 javafx 中更改 primaryStage.initStyle()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40773411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com