我想将选定的行保留在 TableView 控件的中间,无论选择如何变化。我必须使用 TableView 上方的按钮(PREV、NEXT)来移动更改选定的行。问题是 TableView 滚动条不遵循此选择,所以我需要调用
TableView.scrollTo(int)
保持所选行可见。然而,在调用scrollTo(int)后,选定的行最终出现在视口的顶部。我想把它放在视口的中间。
这在 Swing 中是可能的,如下所示: http://www.java2s.com/Code/Java/Swing-JFC/ScrollingaCelltotheCenterofaJTableComponent.htm
不幸的是,我无法使用 JavaFX 8 解决这个问题。
嗯,这似乎有效。它使用非公共 API,所以我仍然对是否有人有更好的解决方案感兴趣。
table.getSelectionModel().selectedIndexProperty().addListener((observable, oldValue, newValue) -> Platform.runLater(() -> {
TableViewSkin<?> ts = (TableViewSkin<?>) table.getSkin();
VirtualFlow<?> vf = (VirtualFlow<?>)ts.getChildren().get(1);
int first = vf.getFirstVisibleCellWithinViewPort().getIndex();
int last = vf.getLastVisibleCellWithinViewPort().getIndex();
if((newValue.intValue() - ((last - first) / 2)) >= 0) {
vf.scrollTo(newValue.intValue() - ((last - first) / 2));
}
}));
Run Code Online (Sandbox Code Playgroud)
限制是所有行必须具有相同的高度。