Вид таблицы видимых строк

Я хочу реализовать пользовательские функции прокрутки для таблицы. Поэтому необходим доступ к видимым строкам и ячейкам.

Как обнаружить видимые ячейки и строки в табличном представлении JavaFX? Я не нашел ничего об этом в описании API для tableview.

Спасибо

2 ответа

Попробуйте это в TableView, чтобы перейти к нужной строке. Я пробовал с table.scrollTo(index), но он не прокручивается должным образом, поскольку устанавливает желаемую строку в качестве первой видимой.

Я написал следующий код на моем контроллере.

Здесь вы также можете увидеть, как получить видимые строки.

/**
 * 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(index);

После добавления элементов в список не забудьте вызвать loadVirtualFlow перед вызовом scrollTo, чтобы VirtualFlow обновлялся и не вызывал исключение.

Я знаю, что это старый вопрос... в любом случае, если кому-то это нужно

Вы можете достичь этого без VirtualFlow (который является частным API, как упоминает "мурлыкающий голубь"). Просто используйте свой собственный RowFactory и сохраняйте ссылки на объекты TableRow по мере их создания (некоторые точки останова или вызовы System.out.println() здесь могут помочь быстро понять, как работает TableView).

В вашем классе контроллера создайте эти два поля:

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

... в TableRowFactory, хранить ссылки...

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

...!!! БЫТЬ ОСТОРОЖЕН!!! если вы вызываете его в каком-либо обработчике событий, где данные или порядок сортировки изменяются, проверьте, получаете ли вы старые координаты до изменения данных или новые после изменения.

Если вы используете стили CSS, как это...

.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%);
}

... полностью видимые строки должны быть зелеными, а частично видимые (вверху и внизу TableView) оранжевыми. Я надеюсь, что это помогает кому-то.

Другие вопросы по тегам