Javafx8弹出透明性问题

fra*_*Opt 4 javafx-8

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

屏幕截图 屏幕截图显示了弹出窗口周围如何有一个白框,该白框通常应该是透明的并具有阴影效果。这仅在我的Slackware14 Linux上发生,我已经在运行于同一台计算机上的Windows VM上进行了测试,并且呈现良好。

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

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

jew*_*sea 5

问题是什么

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

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

如何修复

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

提供您自己的CSS来覆盖默认的CSS,以便您可以支持那些平台,而无需在某些控件周围显示难看的白色边框区域。您提供的css可以假定透明窗口不是基础平台的功能,并且可以对UI进行样式设置,以便在此类平台上看起来仍然不错。由于透明窗口功能是ConditionalFeature,因此在应用程序启动时,请检查是否支持该条件功能,如果不支持,请通过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();
    }

}
Run Code Online (Sandbox Code Playgroud)

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

.color-palette {
    -fx-background-radius: 0, 0;
    -fx-effect: null;
}
Run Code Online (Sandbox Code Playgroud)

这些行:

  1. 为颜色选择器弹出窗口提供正方形背景,而不是圆形背景。
  2. 删除通常围绕弹出窗口的半透明阴影效果。

这些东西的组合为弹出窗口提供了形状和边框,在没有透明窗口的环境中看起来要好得多。

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

样本输出

这是我的Mac上渲染的一些示例输出,在弹出窗口上带有或不带有阴影边框。

标准渲染=>

标准渲染

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

渲染无阴影

建议的方法

遍历整个应用程序(可能还需要遍历整个modena.css样式表),并使用与上述颜色选择器类似的方法,解决在无透明窗口的环境中出现的所有渲染问题。然后在您的应用程序中使用生成的样式表,并且(如果许可许可)将您的自定义样式表提交给社区,方法是将其提交给第三方项目(例如ControlsFX)