当前位置: 首页 > 知识库问答 >
问题:

从任务中逐行更新TextArea的最佳方法是什么?

齐朝明
2023-03-14

我正在从我的应用程序中执行一个脚本,并通过Task value属性上的更改监听器用输出更新一个文本区域,但并不是所有行都显示出来。

this.valueProperty().addListener(new ChangeListener<String>() {

    @Override
    public void changed(ObservableValue observable, String oldValue, String newValue) {
        if (!(newValue == null)) {
            output.appendText(newValue + "\n");
        }
    }

});

我的问题基本上在JavaFX ChangeListener中得到了解决,并不总是有效,但我有一个后续问题。

    while ((line = outputReader.readLine()) != null) {
        updateValue(line);
        Thread.sleep(250);
    }

共有1个答案

王航
2023-03-14

task.updateValue确保将来会发生更新。由于调度这些更新是昂贵的,它只是确保将对上次传递的值进行更新。它的工作原理与此类似

void updateValue(T value) {
    setNewValue(value);
    if (lastUpdateFinished()) {
        Platform.runLater(() -> doUpdate());
    }
}

其中LastUpdateFinished返回false,当且仅当有一个计划的更新尚未检索新值时。理论上讲,睡眠时间越长,就越有可能在每次调用updateValuelastupdateFinished()时生成true...

在您的示例中,platform.runlater需要多次使用,以确保应用程序线程看到每一个更新:

String line;
while ((line = outputReader.readLine()) != null) {
    final String lineFinal = line + "\n";
    Platform.runLater(() -> output.appendText(lineFinal));
}

注意,如果更新太频繁,这可能会降低JavaFX的速度。

 类似资料:
  • 问题内容: 如果您将数组作为状态的一部分,并且该数组包含对象,那么通过更改其中一个对象来更新状态的简便方法是什么? 示例,从关于react的教程中修改而来: 问题答案: 在更新状态时,关键部分是将其视为不变。如果可以保证,任何解决方案都可以。 这是我使用immutability-helper的解决方案: jsFiddle:

  • 问题内容: 在我的PHP应用程序中,我需要 从许多文件 (主要是日志) 的末尾开始读取多行 。有时我只需要最后一个,有时我需要数十或数百。基本上,我想像Unix 命令一样灵活。 这里有一些关于如何从文件中获取最后一行的问题(但是我需要 N 行),并给出了不同的解决方案。我不确定哪一个最好,哪个表现更好。 问题答案: 方法概述 在互联网上搜索时,我遇到了不同的解决方案。我可以将它们分为三种方法: 天

  • 问题内容: 我有一个有趣的任务,要求我将服务器(ASP.NET)的动态生成文件下载到客户端。在客户端,它只是JavaScript(jQuery),并且客户端能够生成很多参数来定制数据的导出方式。 我不知道如何在不重新加载页面的情况下下载文件(我不确定$.ajax在这种情况下是否可以工作)。有人可以给我一些关于这个话题的指导吗?谢谢。 问题答案: 首先,您可以从处理程序创建文件 假设您有要下载的文件

  • 问题内容: 我想使用JavaScript 重新加载。到目前为止,我发现的最好方法是将iframe的属性设置为其自身,但这并不是很干净。有任何想法吗? 问题答案: 注意,在Firefox中,不能通过id进行索引,而只能通过名称或索引进行索引

  • 问题内容: 说我有一个类似的任务: 并行化每个compute()的最简单方法是什么(假设它们已经可以并行化了)? 我不需要严格匹配上面代码的答案,而只是一个常规答案。但是,如果您需要更多信息:我的任务是IO绑定的,这是针对Spring Web应用程序的,这些任务将在HTTP请求中执行。 问题答案: 我建议看一下ExecutorService。 特别是这样的事情: 请注意,如果列表很大,使用可能会很

  • 问题内容: 我发现自己想在许多应用程序中滚动删除早于(x)天的行。在交通繁忙的桌子上最有效地做到这一点的最佳方法是什么? 例如,如果我有一个存储通知的表,而我只想将其保留7天。还是我只想保留31天的高分。 现在,我继续存储存储的纪元时间,并运行一个cron作业,该作业每小时运行一次,并按如下所示增量删除它们: 我这样做直到mysql_affected_rows返回0。 我曾经一次完成所有操作,但是