如何在 JavaFX 中创建具有透明背景的启动画面

Posted

技术标签:

【中文标题】如何在 JavaFX 中创建具有透明背景的启动画面【英文标题】:How to create Splash screen with transparent background in JavaFX 【发布时间】:2013-02-05 00:03:43 【问题描述】:

我正在尝试创建一个启动屏幕,就像我提供的示例一样。 似乎 AnchorPane 不允许透明背景,我尝试将 AnchorPane 的 css 设置为 -fx-background-color: rgba(255,0,255,0.1) ; 但仍然显示白色背景。

我的 fxml 文件中只有一个带有 ImageView 的 AnchorPane,其中包含 png 图像

我到处寻找,但找不到任何解决方案,任何帮助将不胜感激。谢谢

【问题讨论】:

【参考方案1】:

为此,您需要有透明的 StageScenePane 本身没有颜色。

public void start(Stage primaryStage) 
    Button btn = new Button("Say 'Hello World'");

    AnchorPane root = new AnchorPane();
    root.getChildren().add(btn);

    // Java 8: requires setting the layout pane background style to transparent
    // https://bugs.openjdk.java.net/browse/JDK-8092764
    // "Modena uses a non-transparent background by default"
    root.setStyle("-fx-background-color: transparent;"); 

    Scene scene = new Scene(root, 300, 250, Color.TRANSPARENT);
    primaryStage.initStyle(StageStyle.TRANSPARENT);
    primaryStage.setScene(scene);
    primaryStage.show();

【讨论】:

我将如何对此进行单元测试。我只是尝试对此进行单元测试,但它没有显示 fx 应用程序线程错误。 @vinay 看看下一个问题:***.com/questions/11385604/… 和 ***.com/questions/10599724/…【参考方案2】:

试试这个为 *** 问题创建的 JavaFX splash sample:Designing a splash screen (java)。还有一个follow up sample,它还提供应用程序初始化进度反馈。

JavaFX 确实提供了Preloader 接口,用于从启动画面到应用程序的平滑传输,但上面的示例没有使用它。

上面的飞溅示例也没有做透明效果,但是这个dialog sample 向您展示了如何做到这一点,您可以将它与之前的飞溅示例结合以获得您想要的效果。

透明效果的创建者:

    stage.initStyle(StageStyle.TRANSPARENT)scene.setFill(Color.TRANSPARENT)。 确保您的根节点不是不透明的方形矩形。

这些都在 Sergey 的示例中得到了证明。

相关问题:

How to use javaFX Preloader with stand-alone application in Eclipse?

根据其他问题更新 2016 年 4 月

预加载器图像不在前台。我试过 stage.toFront(),但没有帮助。

在 Java 8u20 stage.setAlwaysOnTop(true) 中创建了一个新 API。我更新了linked sample 以在初始启动屏幕上使用它,这有助于更顺畅地过渡到主屏幕。

对于 Java8+

对于 modena.css(Java 8 中的默认 JavaFX 外观定义),为所有控件引入了轻微的阴影背景(如果加载了控件,还引入了窗格)。

您可以通过指定默认背景为透明来删除它。这可以通过将以下行添加到应用程序的 CSS 文件来完成:

.root  -fx-background-color: transparent; 

如果您愿意,您可以使用 CSS 样式类和规则或 setStyle 调用(如 Sergey 的回答中所示)来确保该设置仅适用于您的初始屏幕的根目录,而不是您的所有应用屏幕。

查看相关:

how to make transparent scene and stage in javafx?

【讨论】:

谢谢大家!两个答案都很好,但是scene.setFill(Color.TRANSPARENT). 你不需要指定场景的宽度和高度 当舞台显示时,我正在经历一个毫秒级的闪烁,背景可见。我设法通过调用:root.setCache(true); root.setCacheHint(CacheHint.SPEED); (其中 root 是父实例) 解决了这个问题。 当我使用 stage.initStyle(Transparent) 时,预加载器图像不在前台。我试过 stage.toFront(),但没有帮助。如果我切换回未装饰的,它工作正常。有什么想法吗? 不幸的是,这不起作用。我正在使用 Java 8u66。

以上是关于如何在 JavaFX 中创建具有透明背景的启动画面的主要内容,如果未能解决你的问题,请参考以下文章

如何在 javaFX 中创建具有左、中、右部分的工具栏?

在普通 Java 应用程序中创建 JavaFX 初级阶段

具有透明背景的 JavaFX 按钮

如何在pygame中制作具有透明背景的表面

WinForms 中具有 Alpha 通道透明度/不透明度的启动画面

具有透明背景和不透明前景的 iOS 模态 ViewController