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

时间:2016-06-29 21:34:10

标签: javafx transparent

以下程序是我实际尝试实现的一个例子。 enter image description here

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

// Setup
  var testString = "There are 3 cats but 4 dogs.";

  var expression = /\d+/g;
  var digitCount = testString.match(expression).length;

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

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

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

enter image description here

1 个答案:

答案 0 :(得分:3)

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

不同之处在于它还要求保留原生窗口装饰,这是StageStyle.TRANSPARENT无法实现的。

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

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

特别要看看Undecorator库:

您将永远无法使窗口装饰与OS窗口管理器装饰完全匹配,但您可以创建看起来不同并提供类似功能的内容。如果你正在使用它,你可能能够非常接近地实现与OS窗口装饰相匹配的东西,类似于你问题中的窗口截图。虽然,如果是我,我会选择一种不同的外观,用户仍然很干净,容易理解,类似于Undecorator提供的默认外观。

  

您是否认为可以通过创建ImageView并使用某种舞台侦听器来实现这一点,因此当移动舞台时,imageview会显示应用程序背后的新图像?或者这会让它过于复杂吗?

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

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

请注意,上面链接的imageView捕获类型答案将无法完全达到您的目的,您仍需要做一些额外的自定义工作,以便在移动舞台或桌面或窗口时获得所需的效果。你的窗户改变了。可能你可能需要求助于JavaFX之外的逻辑来完全实现你的目标,并且讨论如何做到这一点超出了我在这里准备(或能够)讨论的范围。

无论你做什么都很复杂,我在undecorator或imageView捕获方法之间并没有真正的建议。

也许如果你混合使用JavaFX和Swing / AWT,你可以使用JFXPanel和AWT PERPIXEL_TRANSPARENT功能来实现这一点。我没有尝试过这个组合,但AWT的每个像素设置都在this oracle sample中进行了演示,如How to Implement Per-Pixel Translucency中所述。