JavaFX 8 工具提示消除了舞台的透明度

Reg*_*ser 2 java javafx javafx-8

我很难弄清楚为什么我的透明舞台拒绝透明。最后我发现,这是由Tooltip安装到以下文件引起的ImageView

ImageView imageViewIcon = new ImageView();
imageViewIcon.setFitWidth(70);
imageViewIcon.setFitHeight(70);
imageViewIcon.setPreserveRatio(false);
imageViewIcon.setImage(new Image("./next.png"));

Tooltip tooltip = new Tooltip("Tooltip!");
if (this.config.getShowTooltip("true")) {
    Tooltip.install(imageViewIcon, tooltip);
}
Run Code Online (Sandbox Code Playgroud)

当我注释掉最后 4 行时,透明度按预期工作,但安装后Tooltip阶段背景呈灰色(例如默认窗口背景)。虽然按钮的作用很明显,而且工具提示对于我的布局来说并不是必需的,但如果有的话就很好了,只是为了提供一点提示......

有什么建议或解决方法吗?

jew*_*sea 5

解决方案

-fx-background-color: transparent在场景的根节点上设置样式。

背景

Oracle JavaFX 论坛有关 JavaFX 场景/填充颜色的帖子中讨论了类似的行为。

JavaFX CSS 功能的首席开发人员 David Grieve 的线程中的相关评论:

发生这种情况是因为modena.css设置了根节点的背景颜色。-fx-background-color: transparent在场景的根节点上设置样式就是解决方案。

BorderPane root = new BorderPane();  
root.setStyle("-fx-background-color: transparent;");  

Scene scene = new Scene(root, 600, 400, Color.BLACK); 
Run Code Online (Sandbox Code Playgroud)

第一次实例化控件时会加载默认的用户代理样式表。这样做的原因是为了避免加载样式表并减少包含不使用 CSS 的节点的场景图中的 CSS 开销。


其背后的历史是摩德纳主题的设计师认为控件在这种特定的背景颜色(非常浅的灰色)上看起来更好。不幸的是,场景的背景填充无法通过 CSS 设置样式,因此样式是在场景的根节点上设置的。JIRA 中记录了一个问题,用于制作场景以便可以通过 CSS 设置样式(RT-31282

以这种方式加载的优点是可以避免不使用控件的场景中的 CSS 开销。例如,这就是典型的闪屏。或者也许是一场游戏。这种设计选择是很久以前做出的,当时 CSS 性能是一个大问题,但它对于嵌入式设备仍然有意义。


就您的问题而言,Tooltip是一个控件,因此当您将其添加到场景时,它会隐式触发modena.css为场景加载默认样式表(它将场景根节点的背景设置为灰色,而不是 null 或透明填充,当场景中没有控件时使用)。为了在场景中使用控件时保留应用程序的透明背景,需要显式地将场景根节点背景设置为透明。


透明阶段的示例代码

//this is where the transparency is achieved:
//the three layers must be made transparent
//(i)  make the VBox transparent (the 4th parameter is the alpha)
root.setStyle("-fx-background-color: rgba(0, 0, 0, 0);");
//(ii) set the scene fill to transparent
scene.setFill(null);
//(iii) set the stage background to transparent
stage.initStyle(TRANSPARENT);
Run Code Online (Sandbox Code Playgroud)