我想在聊天窗口的每个时间(例如:每2秒)更新JAVAFX场景中的窗格视图。我有一个Display()函数从db调用observableList,我想每2秒调用它,以便用户可以看到其他消息,而不仅仅是他发送的消息(我显然可以调用Display( )每次用户发送消息,但他不会得到其他人的消息)。 无论如何搜索,我发现你显然可以用时间轴做到这一点,所以我创建了这个功能:
public void RefreshTimer(){
Timeline timeline = new Timeline(
new KeyFrame(Duration.seconds(5), e -> {
DisplayChat(1);
})
);
timeline.setCycleCount(Animation.INDEFINITE);
timeline.play();
}
我在初始化函数中调用它,但是它使得场景太慢而且我认为它不适合调用它。所以我的问题是,我在哪里调用这个函数?
答案 0 :(得分:1)
Timeline
在负责更新GUI的应用程序线程上运行它的KeyFrame
的处理程序。如果您在此线程上执行长时间运行操作,则GUI将无响应。获取不同线程上的数据,并使用Platform.runLater
更新GUI,以便以一种允许您快速更新GUI的方式准备好信息。
ListView<String> listView = ...
ThreadFactory tFactory = r -> {
// use daemon threads
Thread t = new Thread(r);
t.setDaemon(true);
return t;
};
// use executor to schedule updates with 2 sec delay in between
ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(tFactory);
service.scheduleWithFixedDelay(() -> {
String[] newMessages = getNewMessagesFromDB(); // long running operation here
// do fast GUI update
Platform.runLater(() -> listView.getItems().addAll(newMessages));
}, 0, 2, TimeUnit.SECONDS);