Javafx 8 Popup Transparency问题

时间:2014-01-09 04:17:11

标签: javafx-8

我正在尝试将我的javafx2应用程序移植到javafx8,但是已经注意到Linux上有一些弹出控件的问题。

screenshot 屏幕截图显示了弹出窗口周围是否有白色框,通常应该是透明的和阴影效果。 这只发生在我的Slackware14 Linux上,我在同一台机器上运行的Windows VM上进行了测试,并且渲染得很好。

我认为这个问题与这些问题有关 https://javafx-jira.kenai.com/browse/RT-33709 https://javafx-jira.kenai.com/browse/RT-33750

我的问题是,在修复之前是否有任何解决方法?

1 个答案:

答案 0 :(得分:4)

问题是什么

默认的JavaFX 8(modena.css)没有考虑透明窗口功能在某些平台(特别是某些Linux平台)上是可选的。

在Java 9发布之前,不太可能更改默认的css。

如何修复

这是仅适用于Java 8+的解决方案。

提供您自己的css来覆盖默认的css,以便您可以支持这些平台,而不会在某些控件周围显示丑陋的白色边框区域。您提供的css可以假设透明窗口不是底层平台的一个功能,并为UI设置样式,以便它在这些平台上看起来仍然很好。由于transparent window feature是ConditionalFeature,在应用程序启动时check to see if the conditional feature is supported,如果不是,请通过Application.setUserAgentStyleSheet()应用自定义样式表。

示例应用

我只在Mac上测试了这个(它支持透明窗口功能),所以我无法真正验证它是否会在Linux上按预期工作,但我希望它能正常工作: - )

import javafx.application.Application;
import javafx.application.ConditionalFeature;
import javafx.application.Platform;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.ColorPicker;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class SolidPick extends Application {

    public static void main(String[] args) { launch(args); }

    @Override public void start(Stage stage) throws Exception {
        ColorPicker picker = new ColorPicker();

        if (Platform.isSupported(ConditionalFeature.TRANSPARENT_WINDOW)) {
            Application.setUserAgentStylesheet(
                this.getClass().getResource(
                        "solid-pick.css"
                ).toExternalForm()
            );
        }    

        StackPane layout = new StackPane(picker);
        layout.setPadding(new Insets(10));

        stage.setScene(new Scene(layout));
        stage.show();
    }

}

然后文件solid-pick.css是整个modena.css的精确副本,并在末尾添加以下附加行:

.color-palette {
    -fx-background-radius: 0, 0;
    -fx-effect: null;
}

这些行:

  1. 将颜色选择器弹出窗口设置为方形背景而不是圆角背景。
  2. 删除通常围绕弹出窗口的半透明阴影效果。
  3. 这些东西的组合为弹出窗口提供了一个形状和边框,在不提供透明窗口的环境中看起来更好。

    solid-pick.css文件应与SolidPick应用程序放在同一目录中,以便它被捆绑到应用程序jar中,并可供应用程序类加载器使用。

    示例输出

    以下是我的Mac上的一些渲染示例输出,在弹出窗口中有和没有dropshadow边框。

    标准渲染=>

    standard rendering

    修改后的渲染,带方形边框,无阴影=>

    rendering without shadow

    建议的方法

    浏览整个应用程序(可能还有整个modena.css样式表),并使用与上面针对颜色选择器所做的类似的方法,修复在透明窗口无法使用的环境中出现的任何渲染问题。然后在您的应用程序中使用生成的样式表(如果许可允许),通过将自定义样式表提交给第三方项目(例如ControlsFX),将自定义样式表提供给社区。