如何在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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |