Вид таблицы видимых строк
Я хочу реализовать пользовательские функции прокрутки для таблицы. Поэтому необходим доступ к видимым строкам и ячейкам.
Как обнаружить видимые ячейки и строки в табличном представлении 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) оранжевыми. Я надеюсь, что это помогает кому-то.