加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

如何在JavaFX Thread之外更新TableView项

发布时间:2020-12-15 05:12:33 所属栏目:Java 来源:网络整理
导读:我有一个列表用户朋友的表视图,我需要每隔5秒用我从数据库中检索的数据更新它. 这是我使用的代码: Main.java private ListFriend userFriends; fx控制器: ObservableListFriendWrapper friendList = FXCollections.observableList( new ArrayListFriendWra
我有一个列表用户朋友的表视图,我需要每隔5秒用我从数据库中检索的数据更新它.

这是我使用的代码:

Main.java
   private List<Friend> userFriends;

fx控制器:

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();
}

朋友是数据库模型. FriendWrapper是用于表行的对象.

但是我得到IllegalStateException:不在线上的FX应用程序线程friendList.clear();

如何从后台运行的线程更改TableView的项目?

解决方法

您应该使用 Task类,而不是快速的Platform.runLater()黑客攻击:

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());
    }

}

您可以将此作为线程启动,例如:

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

供进一步参考:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读