How to update tableview items outside JavaFX thread

I have a table view of list user friends. I need to update it every 5 seconds with the data I retrieve from the database

This is the code I use:

Main.java
   private List<Friend> userFriends;

FX controller:

ObservableList<FriendWrapper> friendList = FXCollections.observableList(
    new ArrayList<FriendWrapper>());

private void updateFriendList() {
    new Thread(new Runnable() {
        public void run() {
            while (Params.loggedUser != null) {
                Main.setUserFriends(Params.dao.listUserFriends(Params.loggedUser));
                friendList.clear();
                for (Friend friend : Main.getUserFriends()) {
                    friendList.add(new FriendWrapper(friend.getFriendName(),friend.getOnline(),friend.getFriendId(),friend.getWelcomeMessage()));
                }
                Params.dao.updateOnlineStatus(Params.loggedUser,3);
                try {
                    Thread.sleep(1000 * 5); 
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    },"updateFriendList").start();
}

Friends are database models Friendwrapper is an object for table rows

But I get the IllegalStateException: the FX application thread friendlist clear();

How do I change a tableview item from a thread running in the background?

Solution

You should use the task class instead of the fast platform Runlater() hacker attack:

protected class LoadFriendsTask extends Task<List<FriendWrapper>>
{

    @Override
    protected List<FriendWrapper> call() throws Exception {

        List<Friend> database = new ArrayList<>(); //TODO fetch from DB
        List<FriendWrapper> result = new ArrayList<>();
        //TODO fill from database in result
        return result;
    }

    @Override
    protected void succeeded() {
        getTableView().getItems().setAll(getValue());
    }

}

You can start this as a thread, for example:

new Thread(new LoadFriendsTask()).start()

For further reference:

> JavaFX – Background Thread for SQL Query > How can I do asynchrous database in JavaFX > Multithreading in JavaFX

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>