2015-08-13 36 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

相关问题