java - 将窗口最小化到 JavaFX 应用程序时图像消失
问题描述
我正在 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();
});
}
它也不起作用。请,欢迎任何建议。
我知道,我写了一个很长的问题,但也许一个建议可能是在窗口集中时移动窗口。在这种情况下,请给出正确的方法,因为我尝试过但也没有工作(使用同步和 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 小时。
解决方案
推荐阅读
- python - Python如何将这种类型的列表转换为字典
- php - 从给定的日期时间创建相同的时间差异
- scala - 在 Spark 中计算 Hive 表的统计信息
- kotlin - 如何用 kotlin 调用不同版本的类似扩展方法
- php - VsCode PHP-Intellisense 使用 composer 和 autoload.php
- spring-data-jpa - 如何将规范传递给 spring 数据的存储库接口上的自定义查询?
- sql - DB2/400 SQL:“分配”指令
- c# - 如何在不旋转的情况下改变 Unity 中 VerticalLayoutGroup 的扩展方向?
- oracle - 在存储过程中执行 oracle dbms_scheduler.create_job() 错误
- javascript - 使用相同的键进行分组,并用逗号连接值