我下面有这个简单的代码,它更新了TextArea
期间updateProgress
:
textArea = new TextArea();
textArea.setEditable(false);
textArea.setFocusTraversable(false);
StackPane root = new StackPane();
root.setPadding(new Insets(10));
root.getChildren().add(textArea);
Scene scene = new Scene(root, 600, 350);
primaryStage.setTitle("JavaFX Concurrency");
primaryStage.setScene(scene);
primaryStage.show();
task = new Task<Integer>(){
@Override
protected Integer call() throws Exception {
int i;
for(i = 1; i <= 100; i++){
updateProgress(i, 100);
}
return i;
}
};
task.stateProperty().addListener(new ChangeListener<State>(){
@Override
public void changed(ObservableValue<? extends State> observable, State oldValue, State state) {
System.out.println(state);
}
});
task.progressProperty().addListener(new ChangeListener<Number>(){
@Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number val) {
Platform.runLater(new Runnable(){
@Override
public void run() {
textArea.appendText("Value : " + val.intValue() + "\n");
}
});
}
});
new Thread(task).start();
但是不幸的是结果是错误的。这是输出:
我期望输出应该是Value:1到Value:100。
我只是想测试JavaFX中的并发包。有人可以告诉我怎么回事吗?
如果您插入一个简单的:
Thread.sleep(10);
致电后updateProgress(i, 100);
,一切都会好起来。这来自以下文档updateProgress
:
对updateProgress的调用被合并并稍后在FX应用程序线程上运行,并且即使从FX Application线程对updateProgress的调用也不一定会导致这些属性的立即更新,并且中间的workDone值可能会被合并以保存事件通知。max成为totalWork的新值。
此后,您可能会遇到更多的文本行追加到您的文本框,但是:
这不能确保所有更新都将在您的文本框中完成!
如果要确保这一点,请直接在块中call()
包装的任务中调用GUI更新Platform.runlater(...)
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句