我的类扩展了一个JavaFX Stage。在开发环境中,它从未发生过加载和处理失败的情况,但我的用户经常报告说,有时它不能正确地显示出 在Windows 10上,它看起来像这样.
类本身是一个相当标准的事情,我用Platform.runLater()触发它,线程按预期处理。每一个日志输出都会被写出来,并且可以按照程序与屏幕交互,或者关闭屏幕,这不会触发任何错误或异常。
阶段构造函数非常基本。
log.debug("Constructing the screen.");
setTitle("Screen");
setAlwaysOnTop(true);
initStyle(StageStyle.UNDECORATED);
try {
FXMLLoader fxmlLoader = new FXMLLoader();
fxmlLoader.setLocation(getClass().getResource("....fxml"));
Pane panel = fxmlLoader.load();
controller = fxmlLoader.getController();
controller.postInit(currentIdle); // some elements processed
Scene scene = new Scene(panel);
setScene(scene);
scene.setOnKeyPressed(controller::handleKeyEvent);
setOnHiding((WindowEvent e) -> processor::leaveScreen);
log.debug("Showing the screen.");
show();
log.debug("Screen shown.");
requestFocus();
log.debug("Finished constructing the screen.");
} catch (IOException e) {
// ...doesn't go here
}
从日志上看,所有的东西似乎都在按预期工作,包括控件,键盘快捷键和leaveScreen()钩子,也没有异常,除了用户有时看不到屏幕上的内容和控件。
我到底在看什么?是我的代码有问题,还是JavaFX的bug?是用户笔记本上的图形问题?你能不能想办法防止或至少检测到这种状态,并以某种方式强制刷新?
另外,在什么情况下,一个JavaFX阶段没有出错地通过了show()方法,但实际上没有显示其内容?
受影响的环境。所有最新的JDK 14 GA、Corretto 11(自定义jlink创建的图像)和JavaFX 11.0.2或14.0.1的组合--这没有区别。无论应用程序是否使用jpackage或Advanced Installer安装jlinked JRE,这种情况也会发生。
很难帮助没有更多的信息,但2件事,我不得不使用在过去的Windows问题是
Thread.currentThread().setContextClassLoader(App.class.getClassLoader());
垫底 start(Stage stage)
方法,其中 App
显然是用您的扩展类的名称替换为 Application
我使用的另一个 "修复方法 "是
System.setProperty("glass.accessible.force", "false");
以此来解决点击失焦节点的问题。