我试图每隔1秒使用Task concuurency更新JavaFX GUI。我有1.png
,2.png
,3.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());
...
}
答案 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表达式表示。请阅读提供的文档以获取更多信息。