JavaFX:如何在不通知用户的情况下更新 VBox

JavaFX: How to Update VBox without notice of user

我正在制作一个聊天应用程序,其中聊天存储在 MYSQL 中并定期在应用程序中获取。

我从数据库中获取聊天信息,遍历消息并一条一条地放入 VBox。 在放置之前,我必须清除 VBox 以避免显示重复的消息。 我使用了另一个使用执行器的线程,并安排它每 2 秒执行一次。

清除 VBox 和放置消息的效果会导致问题,因为首先清除 VBox,然后插入消息,并在每 2 秒后继续进行。

有什么解决办法可以让这个效果不明显吗

我在与 javafx 相同的线程上进行了尝试,它成功了,清除和插入消息之间的延迟并不明显,但仅适用于少数消息。由于有大量消息,因此对它们进行迭代将导致 GUI 冻结。

使用节点数不随元素数增加的 GUI 元素。

例如您可以使用 ListView/TableView 或编写仅显示可见子项的类似控件。 (the javadocs for Cell 中描述的行为)。

A ListView<Message> messageList(其中 Message 是包含单个消息数据的 class;需要适当的 Message.toString 实施或 cellFactory)从非应用程序线程像这样刷新:

final Message[] messages = retrieveMessages();
Platform.runLater(() -> messageList.getItems().setAll(messages));

您还可以减少需要传输的数据量,例如通过向 table 的行添加一个时间戳,其中包含指示其创建时间的消息,并且仅检索自上次检索数据以来已修改的那些消息,从而无需替换整个数据集,并且允许您仅添加新消息,例如

final Message[] messages = retrieveNewMessages();
Platform.runLater(() -> messageList.getItems().addAll(messages));