我正在制作聊天应用程序,其中聊天存储在mysql中并定期获取应用程序。
我从数据库中获取聊天,我迭代消息,然后在vbox中逐个放置。在此之前,我要清除Vbox,以避免显示重复的消息。我使用另一个线程使用executor并计划在每2秒钟后进行一次。
清除Vbox的效果并将消息引起问题,因为首先清除Vbox,然后插入消息并在每2秒钟后继续进行。
是否有任何解决方案,因此这种效果并不明显。
我在与Javafx的同一线程上尝试过,并且它起作用,清算和插入消息之间的延迟不是明显的,而仅在少数消息中。由于有大量消息,因此它们上的迭代会导致GUI冻结。
使用gui元素,其中节点的数量不会随元素数量而增加。
例如。您可以使用ListView
/TableView
或编写类似的控件,该控件仅显示可见的孩子。(Cell
中的Javadocs中描述的行为)。
a ListView<Message> messageList
(其中 Message
是包含单个消息的数据的类;需要的 Message.toString
实现或需要cellFactory
)可以从非应用线程中刷新:
final Message[] messages = retrieveMessages();
Platform.runLater(() -> messageList.getItems().setAll(messages));
您还可以减少例如通过例如传输所需的数据量。将时间戳添加到表的行中,其中包含指示其创建时间的消息,并仅检索自上次检索数据以来已修改的消息,这些消息已取消了替换整个数据集的需求,并允许您添加只有新消息,例如
final Message[] messages = retrieveNewMessages();
Platform.runLater(() -> messageList.getItems().addAll(messages));