Javafx Tableview可见行

Javafx Tableview可见行,javafx,Javafx,我想为tableview实现自定义滚动功能。因此,需要访问可见的行和单元格 如何在JavaFX tableview中检测可见的单元格和行?我在tableview的API描述中没有发现任何与此相关的内容 谢谢在表格视图中尝试此操作,以滚动到想要的行。我试过使用table.scrollTo(索引),但它没有正确滚动,因为它将想要的行设置为第一个可见的行 我已经在控制器上编写了下一个代码 在这里,您还可以看到如何获取可见行 /** * Used to manually scroll the Tabl

我想为tableview实现自定义滚动功能。因此,需要访问可见的行和单元格

如何在JavaFX tableview中检测可见的单元格和行?我在tableview的API描述中没有发现任何与此相关的内容


谢谢

在表格视图中尝试此操作,以滚动到想要的行。我试过使用table.scrollTo(索引),但它没有正确滚动,因为它将想要的行设置为第一个可见的行

我已经在控制器上编写了下一个代码

在这里,您还可以看到如何获取可见行

/**
 * Used to manually scroll the Table
 */
private TableViewSkin<?> tableSkin;
private VirtualFlow<?> virtualFlow;

@Override
public void initialize(URL location, ResourceBundle resources) {
    ...
    ...
    Platform.runLater( ()-> { loadVirtualFlow(); });
}

/**
 * Loads the actual VirtualFlow
 */
private void loadVirtualFlow(){
    tableSkin = (TableViewSkin<?>) tableContent.getSkin();
    virtualFlow = (VirtualFlow<?>) tableSkin.getChildren().get(1);
}

/**
 * Scrolls the table until the given index is visible
 * @param index to be shown
 */
private void scrollTo(int index){
    int first = virtualFlow.getFirstVisibleCell().getIndex();
    int last = virtualFlow.getLastVisibleCell().getIndex();
    if (index <= first){
        while (index <= first && virtualFlow.adjustPixels(-1) < 0){
            first = virtualFlow.getFirstVisibleCell().getIndex();
        }
    } else {
        while (index >= last && virtualFlow.adjustPixels(1) > 0){
            last = virtualFlow.getLastVisibleCell().getIndex();
        }
    }
}

将元素添加到列表后,请记住在调用scrollTo之前调用loadVirtualFlow,这样VirtualFlow会得到更新并且不会引发异常。

我知道这是一个老问题。。。无论如何,如果有人需要它:

您可以在不使用VirtualFlow的情况下实现它(这是“purring鸽子”提到的私有API)。只需使用您自己的RowFactory并在创建TableRow对象时存储对这些对象的引用(此处的一些断点或System.out.println()调用有助于快速了解TableView的工作原理)

在控制器类中,创建以下两个字段:

private ArrayList<TableRow<Person>> tblViewPersonsTableRows = new ArrayList<>();
private boolean headerTableRowCreated = false;

。。。完全可见的行应为绿色,部分可见的行(在TableView的顶部和底部)应为橙色。我希望这对某人有所帮助。

你能解释一下可见的单元格和行吗?我指的是可见的项目。例如,如果表中有100个项目,而只有10个是可见的。因为屏幕尺寸。你必须滚动到另一个。如果想知道第一行和最后一行的索引。这是使用私有API-有没有一种方法可以用公共API做类似的事情?我已经搜索了很多年了!
private ArrayList<TableRow<Person>> tblViewPersonsTableRows = new ArrayList<>();
private boolean headerTableRowCreated = false;
final TableRow<Person> tableRow = new TableRow<Person>() {
    ...
}

if (!headerTableRowCreated) {
    headerTableRowCreated = true; //the first TableRow corresponds to TableView's header so ignore it
} else {
    int myIdx = tblViewPersonsTableRows.size();
    tblViewPersonsTableRows.add(tableRow);
}
double tblViewHeight = fxTblViewPersons.getHeight();
double headerHeight = fxTblViewPersons.lookup(".column-header-background").getBoundsInLocal().getHeight();
double viewPortHeight = tblViewHeight - headerHeight;
for (TableRow tableRow : tblViewPersonsTableRows) {
    double minY = tableRow.getBoundsInParent().getMinY();
    double maxY = tableRow.getBoundsInParent().getMaxY();

    if ((maxY < 0) || (minY > viewPortHeight)) {
        //row invisible
    } else if ((maxY <= viewPortHeight) && (minY >= 0)) {
        tableRow.getStyleClass().add("fullyVisibleRow");
    } else {
        tableRow.getStyleClass().add("partiallyVisibleRow");
    }
}
.fullyVisibleRow {
    -fx-control-inner-background: palegreen;
    -fx-accent: derive(-fx-control-inner-background, -40%);
    -fx-cell-hover-color: derive(-fx-control-inner-background, -20%);
}

.partiallyVisibleRow {
    -fx-control-inner-background: orange;
    -fx-accent: derive(-fx-control-inner-background, -40%);
    -fx-cell-hover-color: derive(-fx-control-inner-background, -20%);
}