我的类扩展了 JavaFX Stage。在开发环境中,它永远不会加载和处理失败,但我的用户经常报告有时它无法正确显示 which looks like this on 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() Hook ,并且没有抛出异常,只是用户有时无法看到屏幕上的内容和控件。
我在看什么?这是我的代码的问题还是 JavaFX 的错误?用户笔记本电脑上的图形有问题吗?您能想出一种方法来防止或至少检测到这种状态并以某种方式强制刷新吗?
或者,在什么情况下 JavaFX 阶段可能会无错误地传递其 show() 方法,但实际上并不显示其内容?
受影响的环境:最新 JDK 14 GA、Corretto 11(自定义 jlink 创建的镜像)和 JavaFX 11.0.2 或 14.0.1 的所有组合 - 没有区别。无论应用程序是使用 jpackage 还是高级安装程序通过 jlinked JRE 安装,也会发生这种情况。
最佳答案
热烈感谢伙计们,你们的光荣尝试提供了帮助。九个月后,现在有点冷了,但我相信它值得结束,以防以后有人偶然发现这个问题。我的结论:
- 问题不是由我的应用程序引起的,并且
- 我已经找到了解决方法。
我们逐渐成功地将问题与硬件隔离,即我们注意到,如果涉及插拔显示外围设备和扩展坞,这种情况会更频繁地发生。有时也会因 sleep /电池电量耗尽而奇怪地触发。
这让我们相信问题出在 Prism 的硬件加速和显卡之间。最后,我们通过将应用程序的 GraphicsPipeline 从 com.sun.prism.d3d.D3DPipeline
更改为 com.sun.prism,成功避免了这种渲染卡住。 .sw.SWPipeline
。对于我们来说这不是问题,因为应用程序不会渲染复杂的 3D 图形,切换到软件渲染后问题就消失了。
这可以通过在启动时将 -Dprism.order=sw
设置为 JVM 参数来实现。您可以通过记录 com.sun.prism.GraphicsPipeline.getPipeline().getClass().getName()
来确认正在使用的管道。
关于JavaFX 阶段*有时*在 Win10 上显示为空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61387601/