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

标签 java multithreading exception javafx

我有一个 TableView ,其中列出了用户的 friend ,我需要每 5 秒使用从数据库中检索的数据更新一次。

这是我使用的代码:

Main.java
   private List<Friend> userFriends;

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

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

但是我在 friendList.clear(); 行上得到 IllegalStateException: Not on FX application thread

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

最佳答案

与其使用快速的 Platform.runLater() hack,不如使用 Task类:

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

进一步引用:

关于java - 如何在 JavaFX 线程之外更新 TableView 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28453344/

相关文章:

C++ 标准线程和列表段错误(核心转储)

c++ - std::shared_mutex 是否有利于作者而不是读者?

java - 向 Servlet 中抛出异常

android - DB-Activity 架构和/或 Context 泄漏的 ContentProvider 解决方案

java - 为什么 Java 会抛出 NumberFormatException

java - 从命令行进行 Junit 测试 无可运行方法异常

java - 有没有办法获得 Java 通过所有 JVM 使用的总 RAM 内存

java - Java 中全文 MSSQL 表上的PreparedStatement 仅需要 3 个参数

Java 编程风格与 Objective C

java - Xtend 语法澄清