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