在 updateProgress 期间将文本附加到 JavaFX TextArea
Append text to JavaFX TextArea during updateProgress
我在下面有这个简单的代码,它在 updateProgress
期间更新 TextArea
:
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
:
的文档
Calls to updateProgress are coalesced and run later on the FX application thread, and calls to updateProgress, even from the FX Application thread, may not necessarily result in immediate updates to these properties, and intermediate workDone values may be coalesced to save on event notifications. max becomes the new value for totalWork.
在此之后您可以体验到更多的文本行附加到您的文本框,但是:
这不能确保您的所有更新都在您的文本框上完成!
如果要确保这一点,请直接在包裹在 Platform.runlater(...)
块中的任务 call()
中调用 GUI 更新。
我在下面有这个简单的代码,它在 updateProgress
期间更新 TextArea
:
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
:
Calls to updateProgress are coalesced and run later on the FX application thread, and calls to updateProgress, even from the FX Application thread, may not necessarily result in immediate updates to these properties, and intermediate workDone values may be coalesced to save on event notifications. max becomes the new value for totalWork.
在此之后您可以体验到更多的文本行附加到您的文本框,但是:
这不能确保您的所有更新都在您的文本框上完成!
如果要确保这一点,请直接在包裹在 Platform.runlater(...)
块中的任务 call()
中调用 GUI 更新。