Javafx 通过按钮滚动TableView

Javafx 通过按钮滚动TableView,javafx,scrollbar,tableview,Javafx,Scrollbar,Tableview,背景 使用JavaFX,我将一个和一个并排渲染 该表包含多个大于表大小的条目。因此,TableView会自动显示一个向下滚动的滚动条 问题 我想用按钮向下滚动表格。因此,按下按钮,向下滚动表格5个条目。我找到了这个方法,这个方法对于任务来说已经足够了,但是我需要一个可以滚动到的索引。据我所知,我没有“getfirstvisibleindex”方法(或者类似的方法,你可以理解) 如何确定要滚动到的表行索引 编辑 谢谢大家帮助我。为完整起见,我还发布了“我的”最终解决方案,该解决方案基于/复制了下面

背景

使用JavaFX,我将一个和一个并排渲染

该表包含多个大于表大小的条目。因此,TableView会自动显示一个向下滚动的滚动条

问题

我想用按钮向下滚动表格。因此,按下按钮,向下滚动表格5个条目。我找到了这个方法,这个方法对于任务来说已经足够了,但是我需要一个可以滚动到的索引。据我所知,我没有“getfirstvisibleindex”方法(或者类似的方法,你可以理解)

如何确定要滚动到的表行索引

编辑

谢谢大家帮助我。为完整起见,我还发布了“我的”最终解决方案,该解决方案基于/复制了下面提供的链接,以及。以下方法作为TableView扩展版本的一部分实现,并将通过按钮调用。(侧节点:我不确定是否确实需要检查端部。)

public void scrollbertest(){
TableViewSkin皮肤=(TableViewSkin)getSkin();
VirtualFlow vf=null;
ObservableList kids=skin.getChildren();
if(kids!=null&!kids.isEmpty())
{
vf=(VirtualFlow)kids.get(1);
}
如果(vf==null){return;}
if(vf.getFirstVisibleCell()==null){return;}
int first=vf.getFirstVisibleCell().getIndex();
int last=vf.getLastVisibleCell().getIndex();
int numberofrows=this.getItems().size();
如果(最后!=numberofrows-1){
这个。滚动到(第一个+1);
}
}

我以tableview教程为例:

TableView由您定义的某种对象类型的可观察列表支持。在本教程中,他们使用:

    final ObservableList<Person> data = FXCollections.observableArrayList(
    new Person("Jacob", "Smith", "jacob.smith@example.com"),
    new Person("Isabella", "Johnson", "isabella.johnson@example.com"),
    new Person("Ethan", "Williams", "ethan.williams@example.com"),
    new Person("Emma", "Jones", "emma.jones@example.com"),
    new Person("Michael", "Brown", "michael.brown@example.com")
);

数据列表对象有一个大小方法,它对您的情况很有用。在按钮操作中,可以查找列表的大小,并将scrollTo()索引向前设置为5个位置。只需跟踪按钮操作定义之外的起始索引。

谢谢您的回答,但我如何跟踪起始索引?据我所知,Tableview加载整个列表,然后相应地呈现它。请查看表格的getSelectionModel()。最初呈现表格时,不选择任何行。调用table.getSelectionModel().getSelectedIndex()将返回-1,表示未选择任何内容。您可以通过执行table.getSelectionModel().select(0)然后调用table.scrollTo(0)来选择第一行。对于按钮,将0替换为跟踪偏移量的某个变量。您可以通过一个小技巧获得第一个和最后一个可见单元格
    final ObservableList<Person> data = FXCollections.observableArrayList(
    new Person("Jacob", "Smith", "jacob.smith@example.com"),
    new Person("Isabella", "Johnson", "isabella.johnson@example.com"),
    new Person("Ethan", "Williams", "ethan.williams@example.com"),
    new Person("Emma", "Jones", "emma.jones@example.com"),
    new Person("Michael", "Brown", "michael.brown@example.com")
);
table.setItems(data);