使用tableView javafx的滚动锁定功能

时间:2018-07-31 03:03:17

标签: javafx

我想创建一个tableView并在该视图中提供滚动锁定功能,以防出现数据流。

我已经创建了视图,并且如果将滚动条放置在任何位置(不在末尾),则视图不会滚动,但是如果我将滚动条拖到末尾,并且连续出现数据,则滚动条将保留在最终导致显示数据。

即使滚动条在尽头,如果有人可以帮助停止在视图中获取新数据。

谢谢

1 个答案:

答案 0 :(得分:0)

  

Java 9

您可以使用此方法在添加任何新数据之前获得第一个可见行:

public static <T> int getFirstVisibleRow(final TableView<T> table) {
    TableViewSkin<T> skin = (TableViewSkin<T>) table.getSkin();

    if (skin != null) {
        ObservableList<Node> children = skin.getChildren();
        for (Node node : children) {
            if (node instanceof VirtualFlow<?>) {
                VirtualFlow<?> virtualFlow = (VirtualFlow<?>) node;
                IndexedCell firstVisibleCell;
                if ((firstVisibleCell = virtualFlow.getFirstVisibleCellWithinViewPort()) != null) {
                    int firstVisibleCellIndex = firstVisibleCell.getIndex();
                    int totalItemsSize = table.getItems().size();

                    return firstVisibleCellIndex < totalItemsSize
                            ? firstVisibleCellIndex
                            : totalItemsSize - 1;
                }
                break;
            }
        }
    }

    return 0;
}

然后,您可以使用结果在添加新数据时使表格滚动到该行。

int firstVisibleRow = getFirstVisibleRow(table);
table.getItems().addAll(newData);
table.scrollTo(firstVisibleRow);

您也可以通过在table.getItems()上添加侦听器来实现此目的