【问题标题】:How do I make content within a JavaFX Scene transparent?如何使 JavaFX 场景中的内容透明?
【发布时间】:2016-11-01 19:12:30
【问题描述】:

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

我正在尝试在 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();
    }
}

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

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

我发布的代码结果显示了这一点,您可以看到它不透明。

【问题讨论】:

  • 您需要确保场景的父节点(和任何相关的子节点)以及舞台本身是透明的。不过,我不知道如何在舞台上做到这一点。
  • 但是如果舞台是透明的,你就看不到舞台了。你也不能移动舞台。
  • 是的。不确定您要在图像中实现的目标(将舞台背景设置为透明)是否真的可行。很感兴趣。调查它:)
  • 我发布了我正在尝试做的更多细节。我只是想制作一个简单的 JavaFX 程序来复制上面的程序。它只有一个可见的舞台和透明的内容。

标签: javafx transparent


【解决方案1】:

这个问题几乎是重复的:

不同之处在于它还要求保留原生窗口装饰,而 StageStyle.TRANSPARENT 则无法做到这一点。

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

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

特别是看看 Undecorator 库:

您将永远无法使窗口装饰与操作系统窗口管理器装饰完全匹配,但您可以创建看起来不同并提供类似功能的东西。如果您使用它,您可能能够实现与操作系统窗口装饰非常匹配的东西,类似于您问题中的窗口屏幕截图。不过,如果是我,我会选择一种不同的外观,它仍然干净且用户易于理解,类似于 Undecorator 提供的默认外观。

您是否认为这可以通过创建 ImageView 并使用某种舞台侦听器来实现,这样当舞台移动时,imageview 会显示应用程序背后的新图像?还是太复杂了?

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

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

请注意,上面链接的 imageView 捕获类型答案不会完全满足您的要求,您仍然需要做一些额外的自定义工作才能在移动舞台或作为桌面或窗口下的窗口时获得所需的效果你的窗口改变。您可能需要借助 JavaFX 之外的逻辑来完全实现您的目标,而关于如何做到这一点的讨论超出了我准备(或能够)在此讨论的范围。

无论你做什么都很复杂,我真的不推荐在 undecorator 或 imageView 捕获方法之间。


如果你混合使用 JavaFX 和 Swing/AWT,你也许可以通过使用 JFXPanel 和 AWT PERPIXEL_TRANSPARENT 功能来做到这一点。我还没有尝试过这个组合,但是this oracle sample 中演示了 AWT 的每个像素设置,正如How to Implement Per-Pixel Translucency 中所讨论的那样。

【讨论】:

  • 对不起,我的标题有点误导,我的意思是说场景而不是舞台。我不关心窗口,我只希望场景的内容像图片中一样透明..
  • 是的,我理解(至少我认为我理解 ;-),这就是我试图回答的问题。可能我的回答不清楚,但你不能直接做,你只能有没有装饰的透明阶段。如果你想要透明度和装饰,你需要自己渲染装饰。
  • 你认为这可以通过创建一个 ImageView 并使用某种舞台侦听器来实现,因此当舞台移动时,imageview 会显示应用程序背后的新图像?还是说太复杂了?
猜你喜欢
  • 2016-03-06
  • 1970-01-01
  • 2020-07-12
  • 1970-01-01
  • 1970-01-01
  • 2017-03-08
  • 1970-01-01
  • 2021-10-17
  • 2012-07-27
相关资源
最近更新 更多