2015-08-13 35 views
3

奇怪的一個在這裏,我不能解決如何解決這個問題。我有一個tableview,當一個可觀察列表的監聽者發現有變化時,它會被填充。因此,這是該代碼:JavaFX滾動到桌面視圖底部的項目被添加到它

userController.getAuthImpl().listOfMessages.addListener(new ListChangeListener<Message>() { 
    @Override 
    public void onChanged(ListChangeListener.Change<? extends Message> c) { 
     addMessageToTableView(tblvwBottomAdminNotifications, c.getList()); 
    } 
}); 


public void addMessageToTableView(TableView<Message> tblvw, ObservableList<? extends Message> observableList){ 
    tblvw.getItems().clear(); 
    for(Message msg: observableList) 
     tblvw.getItems().add(msg); 
} 
public ObservableList<Message> listOfMessages = FXCollections.observableArrayList(_listOfMessages); 

能正常工作和表格會自動更新,一旦某一項添加到listOfMessages。現在我想要做的是在更新時將列表視圖滾動到底部。我已經嘗試添加以下行addMessageToTableView方法:

tblvw.scrollTo(tblvw.getItems().size()-1); 

而且也試圖加入一個變化監聽到的tableview本身是這樣的:

tblvwBottomAdminNotifications.getItems().addListener(new ListChangeListener<Message>(){ 

    @Override 
    public void onChanged(javafx.collections.ListChangeListener.Change<? extends Message> c) { 
     tblvwBottomAdminNotifications.scrollTo(c.getList().size()-1); 

    } 

}); 

但以同樣的方式都與錯誤以下消息:

在線程異常 「RMI TCP連接(1)-192.168.56.1」 java.lang.IllegalStateException:不上FX應用程序線程; currentThread = RMI TCP連接(1)-192.168.56.1

從我的谷歌技能是JavaFX抱怨我從一個單獨的線程訪問tableview。我可以理解,但我應該如何訪問它,以便當tableview添加一個新項目時,它會滾動到它?

讓我知道你是否需要更多信息。

+0

爲了澄清,tblvw和tblvwBottomAdminNotifications都TableViews,是否正確? – Catch44

+1

您正在更改後臺線程的UI,這是非法的。閱讀http://stackoverflow.com/questions/30249493/using-threads-to-make-database-requests順便說一句,不要像你一樣在循環中添加項目(它會觸發添加的每個項目的事件),使用'tablevw.getItems().addAll(observableList);'(它觸發單個事件)。 –

+0

你是對的,他們都是桌面。一個在GUI的控制器中,處理實際的tableview。另一個是抽象類中的泛型方法,它處理來自其他類的泛型表視圖。 我知道我打電話給它的錯誤的線程,我的帖子的底部說,所以,但如何在桌面視圖自動更新時在主線程上調用它?我將通過添加全部代碼來刪除for循環 – Draken

回答

5

如何

Platform.runLater(() -> tblvw.scrollTo(c.getList().size()-1)); 
0

你可能會添加一個changelistener到tableview本身的Items列表中,這樣當它被更新時,它會被動地自動滾動?

tblvw.getItems().addListener(new ListChangeListener<Message>(){ 

     @Override 
     public void onChanged(javafx.collections.ListChangeListener.Change<? extends Message> c) { 
      tblvw.scrollTo(c.getList().size()-1); 

     } 

    }); 

因此,不要將此監聽器添加到tblvwBottomAdminNotifications,而是直接將其添加到tblvw。當tableview被更新時,它會調用監聽器中的onChanged方法並滾動到列表的底部。

+0

我應該澄清,tblvwBottomAdminNotifications是tableview。這也會導致錯誤,因爲我已經在上面嘗試過了 – Draken

相關問題