我有一个 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/