0

I am using JavaFX to show images on the screen. My FxScreenController code concept is like:

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));
        }
    }
}

I am displaying an image that comes from the Subscriber method.

In order to show image on JavaFX Screen, I am calling Platform.runLater(). The image is shown properly.

I would like to show my previous image back after a 2-seconds pause like this:

@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));    
}

However, here it doesn't show my newImage because it doesn't refresh the screen.

How can I can refresh the FX screen before calling Thread.sleep, so that I can show my newImage for 2 seconds on the FX screen?

0009laH
  • 1,960
  • 13
  • 27
Fatih
  • 21
  • 6

1 Answers1

0

Creating new Thread solved my problem.

    @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);
        
    }
Fatih
  • 21
  • 6
  • Using a pure `Thread` works but wouldn't be recommended in `JavaFX`. `Task` or `Service` is preferred over a pure `Thread`. In this case, you are altering a `Node`. The preferred route would be something from the `Animation` API. `Timeline` or `PauseTransitiion` would have gotten the job done. – SedJ601 Oct 20 '20 at 13:29