我正在尝试将我的javafx2应用程序移植到javafx8,但是已经注意到Linux上有一些弹出控件的问题。
屏幕截图显示了弹出窗口周围是否有白色框,通常应该是透明的和阴影效果。 这只发生在我的Slackware14 Linux上,我在同一台机器上运行的Windows VM上进行了测试,并且渲染得很好。
我认为这个问题与这些问题有关 https://javafx-jira.kenai.com/browse/RT-33709 https://javafx-jira.kenai.com/browse/RT-33750
我的问题是,在修复之前是否有任何解决方法?
答案 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;
}
这些行:
这些东西的组合为弹出窗口提供了一个形状和边框,在不提供透明窗口的环境中看起来更好。
solid-pick.css
文件应与SolidPick应用程序放在同一目录中,以便它被捆绑到应用程序jar中,并可供应用程序类加载器使用。
示例输出
以下是我的Mac上的一些渲染示例输出,在弹出窗口中有和没有dropshadow边框。
标准渲染=>
修改后的渲染,带方形边框,无阴影=>
建议的方法
浏览整个应用程序(可能还有整个modena.css样式表),并使用与上面针对颜色选择器所做的类似的方法,修复在透明窗口无法使用的环境中出现的任何渲染问题。然后在您的应用程序中使用生成的样式表(如果许可允许),通过将自定义样式表提交给第三方项目(例如ControlsFX),将自定义样式表提供给社区。 p>