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

标签 java multithreading javafx javafx-2 javafx-8

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

但不幸的是结果是错误的。这是输出:

enter image description here

我原以为输出应该是 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(...) block 中包装的任务的 call() 中调用 GUI 更新。

关于java - 在 updateProgress 期间将文本附加到 JavaFX TextArea,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36996502/

相关文章:

c++ - 用原子做饱和运算

css - JavaFX 从资源文件夹加载 CSS 样式

java - 运行 javafx 11 程序时出现 InspirationTargetException

JavaFx 对 SwingUtilities.invokeLater 的响应

java - 我如何在 Java 中使用字符串来做到这一点?

java - 在 Netbeans 7.3.1 中解析文件 JSP 或 JAVA 时出错

c++ - 所有用例的双重检查锁是否都已损坏?

Java参数唯一参数

java - 如何使用 Jackson 将 JSON 字符串解析为 java 对象?

multithreading - Clang 线程安全注解和共享功能