【问题标题】:Append text to JavaFX TextArea during updateProgress在 updateProgress 期间将文本附加到 JavaFX TextArea
【发布时间】:2016-08-28 01:09:28
【问题描述】:

我在下面有这个简单的代码,它在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 to Value : 100.

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

【问题讨论】:

  • 您是否尝试将 textArea.setEditable(false); 更改为 textArea.setEditable(true);
  • @Mxsky,有什么意义?
  • 来自文档:“设置或指示用户是否可以编辑文本字段中的文本。”
  • this

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


【解决方案1】:

如果你插入一个简单的:

Thread.sleep(10);

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    相关资源
    最近更新 更多