当前位置: 首页 > 知识库问答 >
问题:

如何在JavaFX线程之外更新TableView项目

宗翔宇
2023-03-14

我有一个列出用户朋友的表格视图,我需要每5秒更新一次从数据库中检索的数据。

这是我使用的代码:

Main.java
   private List<Friend> userFriends;

外汇控制器:

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

Friend是数据库模型。FriendWrapper是用于表行的对象。

然而,我在第friendList.clear()行上得到IllegalStateException:Not on FX应用程序线程

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


共有2个答案

侯令雪
2023-03-14

用这个…

Platform.runLater(new Runnable() {
    @Override
    public void run() {

    }
});
公羊招
2023-03-14

除了快速的Platform.runLater()hack,您可能应该使用任务类:

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-SQL查询的后台线程
  • 如何在JavaFX中进行异步数据库
  • JavaFX中的多线程
 类似资料:
  • 我刚刚创建了一个TablView,我成功地将数据放入其中。问题是当我双击一个单元格(要更新)时,它会显示更新的数据,但当我单击离开时,更新的单元格会显示旧数据! 这里的代码: 有人能帮帮我吗?厚度

  • 我有一个表视图 以下是我的表格创建: 我的自定义细胞工厂代码:

  • 问题内容: 我有这个常见的问题,看来是这样。重置项目后,我的表格视图不会刷新我的项目。我检查了数据,这是新的数据。 我尝试了多种互联网解决方案,但没有成功。 无法重置所有列,因为它会额外增加一个空一(不知道为什么),并且调整大小会中断。 我的表不可编辑。新数据已更改。 如果更改项目的顺序并且行更改(:|),则刷新数据。 我只是没有想法。 目前,刷新代码非常简单。 同样,新数据是正确的。当我对tab

  • 我有这个共同的问题,因为它似乎是。我的表视图将不会刷新我的项目后,我重置他们。我查过资料了,是新的。 我从网上尝试了多种解决方案,但没有成功。 目前,刷新代码非常简单。 新的数据也是正确的。当我选择tableView时,它返回新的正确项。

  • 我知道有人在不同的日期问过类似的问题,但我会在这里放一个SSCCE,尽量简单地问这个问题。 我希望能够更新数据模型,并使其上的任何视图自动更新,这样任何更新模型的调用者都不会知道当前有任何视图。这是我到目前为止学到/尝试的,并且没有调用它不会更新。我错过了什么? 主要的java: 全体船员Java语言

  • 我有一个表视图,每次都很好地填充, 我的主控制器: 我的测试类: 扩展测试类并覆盖其运行的Test1类: 我的aHandler: 因为tbl1绑定到Handler。getInstance()。GetData(),第一次初始化该类时,我看到列Test填充了值1,因为TestData=1;但当计时器开始更改测试数据时,表视图不会获得新的赋值。我做错了什么? 我尽我所能解释这个问题,请让我知道,如果它仍