将窗口最小化到JavaFX应用程序

时间:2018-06-12 20:52:27

标签: java swing javafx javafx-8 javafx-2

我正在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小时。

0 个答案:

没有答案