我试图将我的javafx2应用程序移植到javafx8,但是注意到Linux上带有弹出控件的一些问题。
屏幕截图显示了弹出窗口周围如何有一个白框,该白框通常应该是透明的并具有阴影效果。这仅在我的Slackware14 Linux上发生,我已经在运行于同一台计算机上的Windows VM上进行了测试,并且呈现良好。
我认为这个问题与这些问题有关 https://javafx-jira.kenai.com/browse/RT-33709 https://javafx-jira.kenai.com/browse/RT-33750
我的问题是在解决之前是否有任何解决方法?
问题是什么
默认的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)
这些行:
这些东西的组合为弹出窗口提供了形状和边框,在没有透明窗口的环境中看起来要好得多。
该solid-pick.css文件应与SolidPick应用程序放置在同一目录中,以便将其捆绑到应用程序jar中,并可供应用程序类加载器使用。
样本输出
这是我的Mac上渲染的一些示例输出,在弹出窗口上带有或不带有阴影边框。
标准渲染=>

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

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