我尝试做的是在JavaFX中重新创建上面的图片。但是我遇到了困难,因为当我将舞台的内容设置为透明时,它实际上并不透明,它仍然是白色的。
// Setup
var testString = "There are 3 cats but 4 dogs.";
var expression = /\d+/g;
var digitCount = testString.match(expression).length;
此代码可以看到舞台。我还将内容设置为透明,并将根窗格的默认样式更改为透明。
我不明白为什么这不起作用,我将内容设置为透明但背景仍然不透明。
我发布的代码的结果显示了这一点,因为您可以看到它不透明。
答案 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中所述。