当项目添加到桌面视图时,JavaFX滚动到tableview的底部

时间:2015-08-13 15:36:38

标签: java javafx

奇怪的是,我无法解决如何解决这个问题。我有一个tableview,当一个可观察列表的监听器发现有变化时,它会被填充。所以这就是代码:

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

    }

});

但是两个错误都以同样的方式出现以下消息:

  

线程中的异常&#34; RMI TCP连接(1)-192.168.56.1&#34; java.lang.IllegalStateException:不在FX应用程序线程上; currentThread = RMI TCP连接(1)-192.168.56.1

我的谷歌技能是JavaFX抱怨我从一个单独的线程访问tableview。我可以理解,但是如何以这样的方式访问它:当tableview确实添加了一个新项目时,它会向下滚动到它?

如果您需要更多信息,请与我们联系。

2 个答案:

答案 0 :(得分:9)

怎么样

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

答案 1 :(得分:0)

你可以在tableview本身的Items列表中添加一个changelistener,这样当它更新时,它会被动滚动自己?

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方法并滚动到列表的底部。