使用javafx并发性Task <void>

时间:2019-03-10 14:48:55

标签: java javafx

我试图每隔1秒使用Task concuurency更新JavaFX GUI。我有1.png2.png3.png等图标。我正在使用while循环增量i++。我想每1秒显示一次这些图标。我不知道如何更新图像。我正在使用label.setGraphic()方法。我不知道如何在这里使用绑定属性。我可能完全错了。请帮助我。

@Override
public void start() {
  ...
  image = new Image(getClass().getResourceAsStream("images/1.png"));
  imv=new ImageView(image);
  label1 = new Label();
  label1.setGraphic(imv);
  monitor(); //A SEPARATE METHOD CONTAINING TASK CODE
  ...
  new Thread(task1).start();
}

...
public void monitor() {
  task1=new Task<Void>() {
    @Override
    protected Void call() {
      int i=1;
      while(true) {
        try {
          Thread.sleep(1000);
          updateMessage(""+i+".png");
          System.out.println("i: "+i);
        }
        catch(Exception e) {
        }
        i++;
        }
     }
  };
  label1.textProperty().bind(task1.messageProperty());
  ...
}

1 个答案:

答案 0 :(得分:0)

错误是您无法将ReadOnlyStringProperty绑定到ObjectProperty<Image>

您应将更改侦听器(docs)添加到任务消息属性(docs)并创建图像,然后将其应用于图像视图:

public void monitor() {
    task1 = new Task<Void>() {
        @Override
        protected Void call() {
            System.out.println("run called");
            int i = 1;
            while (true) {
                try {
                    Thread.sleep(1000);
                    updateMessage(i + ".png");
                    System.out.println("i: " + i);
                } catch (Exception e) {

                }
                i++;
            }
        }
    };
    task1.messageProperty().addListener((observable, oldValue, newValue) -> {
        System.out.println(newValue);
        Image image = new Image(getClass().getResourceAsStream("images/" + newValue));
        imv.setImage(image);
    });
}

编辑:

ChangeListener由给定代码段中的Lambda表达式表示。请阅读提供的文档以获取更多信息。

相关问题