如何在睡眠后刷新JavaFX屏幕两次?
我正在使用JavaFX在屏幕上显示图像。我的如何在睡眠后刷新JavaFX屏幕两次?,javafx,javafx-8,reactive-programming,Javafx,Javafx 8,Reactive Programming,我正在使用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
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));
}
}
}
但是,在这里它不会显示我的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);
}
在哪个线程上调用了
accept(…)
?我不确定,但听起来好像你想每两秒钟更改一次图像。请将此解决方案发布到Hey@Sedrick,内容有点类似。在某些情况下可以使用它。使用纯线程
是可行的,但在JavaFX
中不推荐使用<代码>任务或服务
优于纯线程
。在本例中,您正在更改节点
。首选路径是来自动画API的内容<代码>时间线
或暂停翻译
可以完成工作。
@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);
}