JAVAFX:如何在不通知用户通知的情况下更新Vbox



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

相关内容

  • 没有找到相关文章

最新更新