2014-10-02 7 views
1

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

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

Благодаря

+0

Можете ли вы объяснить «видимые ячейки и строки»? – ItachiUchiha

+0

Я имею в виду видимые элементы. Например, если у вас есть 100 элементов в таблице, и только 10 видимы. Из-за экранов. Вам нужно перейти к другому. Если хотите узнать индекс первой и последней видимой строки. – seeseost

ответ

4

Попробуйте это в 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 обновляется и Безразлично 'исключение.

+2

Это частный API - есть ли способ сделать аналогичную вещь с открытым API? –

1

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

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

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

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

... в TableRowFactory, хранящие ссылки ...

... теперь называют это, где вам нужно это ...

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) оранжевого цвета. Я надеюсь, что это помогает кому-то.

Смежные вопросы