首页 > 解决方案 > 将窗口最小化到 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 小时。

标签: javaswingjavafxjavafx-8javafx-2

解决方案


推荐阅读