【问题标题】:JavaFX wait after setting imageview设置 imageview 后 JavaFX 等待
【发布时间】:2017-05-12 07:21:17
【问题描述】:

设置Imageview后我需要等待,但是如果我使用

Thread.sleep(1000)

设置 imageView 后,整个应用程序会休眠一秒钟,但在此期间不会设置 imageView。

我想知道如何在设置 imageview 后暂停整个应用程序。

例如,这是一场纸牌游戏 (briscola),在计算机打出一张牌或我打出一张牌后,应用程序应该暂停以显示盘子上的牌以及谁赢得了这手牌。

提前致谢。

更新: 这是我尝试的任务,没有成功的图像

    private void setImages(BriscolaModel model) {
    Set<Map.Entry<Player, BriscolaCard>> entries = model.getPlate().entrySet();


    // set images

    Task<Integer> task = new Task<Integer>() {
        @Override protected Integer call() throws Exception {
            for(Map.Entry<Player, BriscolaCard> entry : entries){
                plate.getImageViews().add(new ImageView(new Image(getClass().getClassLoader().getResourceAsStream(entry.getValue().getRelativePath()),200,100,true, false)));
            }
            plate.getCards().getChildren().setAll(plate.getImageViews());
            return 0;
        }
    };

    Thread th = new Thread(task);
    th.start();

    // clear images 

    Task <Integer> clearTask = new Task<Integer>() {
        @Override
        protected Integer call() throws Exception {
            clearImages();
            return 0;
        }
    };
    Thread clearThread = new Thread(clearTask);
    if(entries.size()==2){
        Platform.runLater(clearTask);
    }else {
        clearThread.start();
    }
}

第二次更新:

这似乎效果更好(我在被清除之前随机看到图像几毫秒),但是如何设置在 Platform.runLater() 之前等待的最短时间?

private void setImages(BriscolaModel model) {
    Set<Map.Entry<Player, BriscolaCard>> entries = model.getPlate().entrySet();

    for (Map.Entry<Player, BriscolaCard> entry : entries) {
        plate.getImageViews().add(new ImageView(new Image(getClass().getClassLoader().getResourceAsStream(entry.getValue().getRelativePath()), 200, 100, true, false)));
    }
    plate.getCards().getChildren().setAll(plate.getImageViews());

    Task<Void> waitTask = new Task<Void>() {
        @Override
        protected Void call() throws Exception {
            clearImages();
            return null;
        }
    };

    if(entries.size() == 2){
        Platform.runLater(waitTask);
    }

}

【问题讨论】:

  • 你必须在你的应用程序中使用任务
  • 使用任务来设置图像或等待?
  • 用于设置图像,然后使用 platform.runlater 以便您的应用程序 UI 不会冻结
  • 但是我想等图片设置好之后,而不是之前。
  • 然后做相反的正常运行应用程序设置图像,然后在一个任务中等待或在 platform.runlater 中运行,因为这将有助于 UI 不冻结

标签: java multithreading javafx wait


【解决方案1】:

我找到了解决方案,感谢 Rahul Singh 的建议!

private void setImages(BriscolaModel model) {
    Set<Map.Entry<Player, BriscolaCard>> entries = model.getPlate().entrySet();
    plate.getImageViews().clear();

    for (Map.Entry<Player, BriscolaCard> entry : entries) {
        plate.getImageViews().add(new ImageView(new Image(getClass().getClassLoader().getResourceAsStream(entry.getValue().getRelativePath()), 200, 100, true, false)));
    }
    plate.getCards().getChildren().setAll(plate.getImageViews());

    Task<Void> waitTask = new Task<Void>() {
        @Override
        protected Void call() throws Exception {
            Timeline timeline = new Timeline(new KeyFrame(
                    Duration.millis(2000),
                    ae -> clearImages()));
            timeline.play();
            return null;
        }
    };

    if(entries.size() == 2){
        Platform.runLater(waitTask);
    }

}

【讨论】:

  • 如果您使用的是Timeline,则不需要Task。只需将call() 方法中的代码放在if (entries==2) 块中即可。
猜你喜欢
  • 2016-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-09
  • 2020-11-29
相关资源
最近更新 更多