睡眠后如何刷新JavaFX屏幕两次?

问题描述

我正在使用JavaFX在屏幕上显示图像。我的FxScreenController代码概念类似于:

package my.image.concept;

import java.util.function.Consumer;

import javafx.application.Platform;
import javafx.fxml.FXML;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;

import org.springframework.stereotype.Component;

@Component
public class FxScreenController {
    private ImageSenderClient imageClient;

    @FXML
    private ImageView imageView;

    private Image image;

    public FxScreenController(Image image) {
        this.image = image;
    }

    @FXML
    public void initialize(){
        final ImageSubscriber imageSubscriber = new ImageSubscriber(image);
        imageClient.GetimageFrom().subscribe(imageSubscriber);
    }

    private static class ImageSubscriber implements Consumer<Image> {
        private ImageView imageFile;

        public ImageSubscriber(Image newImage) {
            this.imageFile.setimage(newImage);
        }

        @Override
        public void accept(Image newImage) {
            Platform.runLater(() -> imageFile.setimage(newImage));
        }
    }
}

我正在显示来自Subscriber方法的图像。

为了在JavaFX Screen显示图像,我打电话给Platform.runLater()图片显示正确。

我想在2秒钟的暂停后将我的前一张图像显示回去:

@Override
public void accept(Image newImage) {
    Platform.runLater(() -> imageFile.setimage(newImage));

    try {
        Thread.sleep(2000); // Wait for 2 sec before updating back to prev image
    } catch (InterruptedException ignored) {
        //
    }

    Platform.runLater(() -> imageFile.setimage(prewImage));    
}

但是,这里没有显示我的newImage,因为它没有刷新屏幕。

如何在致电Thread.sleep之前刷新FX屏幕,以便在FX屏幕上显示newImage 2秒钟?

解决方法

创建新的Thread解决了我的问题。

    @Override
    public void accept(Image newImage) {
        Thread timerThread = new Thread(() -> displayImage(newImage));
        timerThread.start();
    }

    private void displayImage(Image newImage) {
        Platform.runLater(() ->
                imageBg.setImage(newImage)
        );

        try {
            Thread.sleep(2000); // Wait for 2 sec before updating back to main
        }
        catch (InterruptedException ignored) {
        }
        imageBg.setImage(prevImage);
        
    }