2015-02-11 76 views
2

我有一個列表用戶的朋友的表視圖,我需要每5秒更新一次數據從數據庫中檢索。如何更新JavaFX之外的TableView項目線程

這是我使用的代碼:

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

Friend是數據庫模型。 FriendWrapper是用於表格行的對象。

但是我得到的線IllegalStateException: Not on FX application threadfriendList.clear();

我怎樣才能改變TableView中的項目在後臺運行的線程?

回答

2

使用此...

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

    } 
}); 
+1

http://docs.oracle.com/javafx/2/api/javafx/application/Platform.html#runLater%28java.lang。 Runnable%29 – rns 2015-02-11 11:56:39

9

取而代之的是快速Platform.runLater()黑客,你應該利用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()); 
    } 

} 

可以啓動這個作爲Thread,爲例如:

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

如需進一步參考:

+1

upvote用於提供更好更簡化的方法 – ItachiUchiha 2015-02-11 12:25:30

+0

在調用方法的重寫中,定義比Exception更好的異常可能會更好。就像快速回憶一樣,'RuntimeException'擴展了'Exception',因此捕獲'Exception'意味着你也捕獲所有未經檢查的異常。 – fge 2015-02-11 12:42:53

+0

@fge這是'Task's' call()'方法的默認簽名。 – eckig 2015-02-11 12:44:39

相關問題