在updateProgress期间将文本附加到JavaFX TextArea

时间:2016-05-03 05:45:11

标签: java multithreading javafx javafx-2 javafx-8

我在下面有这个简单的代码,在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();

但遗憾的是结果是错误的。这是输出:

enter image description here

我原以为输出应该是值:1到值:100。

我只是想在JavaFX中测试并发包。有人能告诉我发生了什么吗?

1 个答案:

答案 0 :(得分:3)

如果你插入一个简单的:

Thread.sleep(10);

致电updateProgress(i, 100);后,一切都会好起来的。 这来自updateProgress的文档:

  

对updateProgress的调用被合并并稍后在FX应用程序线程上运行,并且甚至从FX Application线程调用updateProgress可能不一定会立即更新这些属性,并且可以合并中间workDone值以节省事件通知。 max成为totalWork的新值。

在此之后,您可以体验到更多文本行会附加到文本框中,但是:

这并不能确保您的所有更新都在您的文本框中完成!

如果要确保这一点,请直接在call()块中包含的Platform.runlater(...)任务中调用GUI更新。