gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:49:13 28 4
gpt4 key购买 nike

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

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com