我的课程扩展了 JavaFX 阶段。在开发环境中,它永远不会加载和处理失败,但我的用户经常报告说有时它不能正确显示在 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 错误?用户笔记本电脑上的图形有问题吗?你能想出一种方法来防止或至少检测到这种状态并以某种方式强制刷新吗?
或者,在什么情况下,JavaFX 阶段可能会通过其 show() 方法而没有错误,但实际上并未显示其内容?
受影响的环境:最新的 JDK 14 GA、Corretto 11(自定义 jlink 创建的映像)和 JavaFX 11.0.2 或 14.0.1 的所有组合 - 没有区别。无论应用程序是否使用 jpackage 或 Advanced Installer 安装了 jlinked JRE,它也会发生。