我正在JDK 8上修复JavaFX应用程序。该应用程序使用" jLabel.setIcon(new Image(...))"等显示多个图像。我知道它们是在JavaFX中显示图像的组件,但它不是问题(因为我不允许从源代码和FXML文件中修改该部分)。
我的问题是当最小化或更改窗口((使用ALT + TAB))并等待一段时间(甚至大约1小时)回到窗口时,这不再显示图像。但是,如果我移动窗口,图像会回来。
为了解决问题(独立于使用最小化按钮或ALT + TAB),我在init()方法的最后添加了这段代码:
public void init() {
...
stage.focusedProperty().addListener((observable, oldvalue, newvalue) -> {
if (newvalue) repaintImages();
});
}
private void repaintImages() {
Object obj = new Object();
synchronized (obj) {
jLabel.repaint();
jLabel.revalidate();
obj.notify();
}
try {
obj.wait();
} catch (Exception e) {
}
}
在窗口聚焦之后运行repaintImages()之前的代码。我使用了与想法同步以确保代码在线程安全中执行(独立于滞后),无论如何不能解决问题(图像缺失)。之后,我将代码更改为使用runLater():
public void init() {
...
stage.focusedProperty().addListener((observable, oldvalue, newvalue) -> {
if (newvalue) Platform.runLater(()->{repaintImages();});
});
}
private void repaintImages() {
Platform.runLater(() -> {
jLabel.repaint();
jLabel.revalidate();
});
}
它也不起作用。请提出任何建议。
我知道,我写了一个很长的问题,但也许建议可能是在重点关注时移动窗口。在这种情况下,请提供正确的方法来执行此操作,因为我尝试过但没有工作(使用synchronized和runLater())。这是我用来移动窗口的代码片段(将它放入同步块或runLater()中的lambda函数中):
Translate elements = null;
if (positive_flag) {
elements = new Translate(1, 0, 0);
positive_flag = false;
} else {
elements = new Translate(-1, 0, 0);
positive_flag = true;
}
anchorPane.getTransforms().addAll(elements);
最后,考虑到要证明任何解决方案是否有效,我需要等待1小时。