奇怪的一個在這裏,我不能解決如何解決這個問題。我有一個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添加一個新項目時,它會滾動到它?
讓我知道你是否需要更多信息。
爲了澄清,tblvw和tblvwBottomAdminNotifications都TableViews,是否正確? – Catch44
您正在更改後臺線程的UI,這是非法的。閱讀http://stackoverflow.com/questions/30249493/using-threads-to-make-database-requests順便說一句,不要像你一樣在循環中添加項目(它會觸發添加的每個項目的事件),使用'tablevw.getItems().addAll(observableList);'(它觸發單個事件)。 –
你是對的,他們都是桌面。一個在GUI的控制器中,處理實際的tableview。另一個是抽象類中的泛型方法,它處理來自其他類的泛型表視圖。 我知道我打電話給它的錯誤的線程,我的帖子的底部說,所以,但如何在桌面視圖自動更新時在主線程上調用它?我將通過添加全部代碼來刪除for循環 – Draken