如何使 JavaFX 场景中的内容透明?

How do I make content within a JavaFX Scene transparent?

下面的程序是我实际尝试实现的示例。

我想做的是在 JavaFX 中重新创建上面的图片。但是我遇到了困难,因为当我将舞台的内容设置为透明时,它实际上并没有变得透明,它仍然是白色的。

@Override
public void start(Stage stage) {        
    try {
        BorderPane root = new BorderPane();

        Scene scene = new Scene(root,400,400);

        root.setStyle("-fx-background-color: rgba(0,0,0,0);");

        scene.setFill(Color.TRANSPARENT);

        stage.setScene(scene);
        stage.show();
    } catch(Exception e) {
        e.printStackTrace();
    }
}

从这段代码可以看到舞台。我还将内容设置为透明并将根窗格的默认样式更改为透明。

我不明白为什么这不起作用,我将内容设置为透明但背景仍然不透明。

我发布的代码的结果显示了这一点,如您所见,它不是透明的。

这个问题几乎与以下问题重复:

  • how to make transparent scene and stage in javafx?

不同之处在于它还要求保留原生 window 装饰,这在 StageStyle.TRANSPARENT 中是不可能的。

如果仔细查看问题中提供的示例 windows,装饰区域会略有不同(例如,一个在左上角包含舞台图标,另一个则没有)。我的猜测是问题中描绘的透明 window 实际上根本没有使用 OS window 装饰,而是呈现自己的装饰,看起来很像 OS window 装饰品(虽然这只是一个猜测)。

无论如何,要用 JavaFX 实现类似的效果,有必要使用 JavaFX 来呈现 window 装饰而不是 OS window 管理器。为此,请参考以下问题:

  • JavaFX entirely customized windows?

特别看看 Undecorator 库:

您永远无法获得与 OS Window 经理装饰完全匹配的 window 装饰,但您可以创建外观不同但功能相似的东西。如果你努力工作,你可能能够实现与 OS window 装饰非常匹配的东西,类似于你问题中的 window 屏幕截图。不过,如果是我,我会选择一种不同的外观,它仍然干净且用户容易理解,类似于 Undecorator 提供的默认外观。

Do you think this could be pulled off by creating an ImageView and using some sort of stage listener so when the stage is moved the imageview displays a new image of what's behind the application? Or is that overly complicating it?

将背景捕获到 imageView 方法是一种合理的替代方法。

如果您确实想使用 imageView 捕获方法,您可以使用以下答案中的一些想法:

  • JavaFX effect on background

请注意,上面链接的 imageView 捕获类型答案不会完全实现您的愿望,您仍然需要做一些额外的自定义工作才能在您移动舞台或桌面或windows 根据你的 window 变化。可能您可能需要求助于 JavaFX 之外的逻辑来完全实现您的目标,而关于如何做到这一点的讨论超出了我准备(或能够)在这里讨论的范围。

不管你做什么都很复杂,我真的没有推荐 undecorator 或 imageView 捕获方法。


也许如果您混合使用 JavaFX 和 Swing/AWT,您可以使用 JFXPanel and the AWT PERPIXEL_TRANSPARENT feature. I haven't tried this combo, but per pixel settings for AWT are demonstrated in this oracle sample as discussed in How to Implement Per-Pixel Translucency.