奇怪的一个在这里,我不能解决如何解决这个问题。我有一个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