如何在JavaFX中设置Timer来执行显示功能

时间:2018-03-19 11:31:18

标签: arrays javafx timer javafx-8 chat

我想在聊天窗口的每个时间(例如:每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();
}

我在初始化函数中调用它,但是它使得场景太慢而且我认为它不适合调用它。所以我的问题是,我在哪里调用这个函数?

1 个答案:

答案 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);