java - 同步 textArea.clear() 后跟 textArea.setText() 不会清除文本

标签 java textarea java-11 javafx-11

当单击按钮时,我想清除文本区域,做一些工作,然后在文本区域中打印结果,所有这些都以相同的方法同步进行。

public void resetClicked(MouseEvent mouseEvent) {
    textArea.clear();
    String result = someSynchronousWork();
    textArea.setText(result);
}

发生的情况是,textArea 已更新,但清除操作不可见。这项工作需要几秒钟的时间。如果我注释掉除 textArea.clear() 之外的所有内容,它就会起作用。

最佳答案

正如我在评论中提到的,JavaFX 不会渲染下一帧,直到 "pulse"发生。当您清除文本、运行长时间运行的任务,然后用一种方法全部设置文本时,不会发生这种情况;脉冲发生在所有这些发生之后,这意味着渲染的是新文本。此外,在 JavaFX 应用程序线程上运行几秒长的任务也不是一个好主意。所有阻塞和/或长时间运行的任务都应该在后台线程上完成,否则您的 GUI 会变得无响应(并且您的用户会变得不高兴/紧张)。

如果此任务太简单而无法使用 Task 来完成,那么您可以尝试 CompletableFuture ,这可能会让您更轻松地异步调用简单的事情。

public void resetClicked(MouseEvent event) {
    event.consume();

    textArea.clear();
    CompletableFuture.supplyAsync(this::someSynchronousWork)
            .whenCompleteAsync((result, error) -> {
                if (error != null) {
                     // notify user
                } else {
                    textArea.setText(result);
                }
            }, Platform::runLater);
}

根据您想要如何处理错误,您可以执行不同的操作。例如:

// can't ever be an error
supplyAsync(this::someSynchronousWork)
        .thenAcceptAsync(textArea::setText, Platform::runLater);

// just want to show "Error" in text area on error
supplyAsync(this::someSynchronousWork)
        .exceptionally(error -> "ERROR")
        .thenAcceptAsync(textArea::setText, Platform::runLater);

注意:这些示例将使用通用的ForkJoinPool执行someSynchronousWork()。您可以通过将 Executor 传递给 supplyAsync 来自定义此设置。

注意:您可能希望在任务运行时禁用某些 UI 组件(例如按钮),以防止同时启动多个任务。任务完成后启用 UI 组件。

<小时/>

此外,您似乎正在使用 ButtononMouseClicked 属性来处理操作。考虑改用 onAction 属性; onAction 处理程序不仅仅会收到鼠标点击的通知(例如,当按钮获得焦点并且按下 SpaceEnter 时)。

关于java - 同步 textArea.clear() 后跟 textArea.setText() 不会清除文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56707948/

相关文章:

java - 使用结构化元素名称解析 XML

layout - 将 TextArea 高度绑定(bind)到其内容

homebrew - 如何使用 Homebrew 升级 AdoptOpenJDK8 和 Java11

java - 使用流对内部对象的 Map 属性进行分组?

java - 将枚举转换为迭代器

java - Phonegap 与 servlet 和数据库连接 java 文件

php - 使用 nl2br 将 textarea 新行保存到 mysql ...如何很好地将数据返回到文本框?

javascript:获取textarea的内容,textContent vs. innerHTML vs. innerText

Java SE 11 - Java 语言规范中类型转换的新案例

java - 如何将特定算法与流进行转换