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));
我正在制作一个聊天应用程序,其中聊天存储在 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));