java - 获取 JavaFX 中表格 View 单元格的位置

标签 java javafx javafx-8

JavaFX 新手,一直在尝试通过行、列索引获取 TableView 单元格的位置。寻找类似 Swing 的 JTable.getCellRect;

我已经看到了需要特定单元格值的情况的解决方案, ( JavaFX Simplest way to get cell data using table index )

我还认为获取相应行和列的 TableCell 就足够了,然后获取边界并使用 localToScreen 等,但找不到也是获取特定table-cell的方法。

希望得到任何帮助。 提前致谢

最佳答案

根据设计,JavaFX 中没有直接的方法可以做到这一点。由于单元格仅为当前可见的数据创建,并且会重复使用(例如,当用户在表格中滚动时),因此任何给定单元格和“位置”之间不存在 1-1 甚至一致的关系。 “在表的支持数据中。因此,您实际上甚至不应该尝试查找给定数据项的单元格,而应该尝试找到另一种方法来完成您想要做的任何事情。

(从 MVC 设计方法来看,这也是有道理的:您要求从模型(数据)中找到 View (单元格);模型应该完全不知道 View .)

如果您确实想尝试此操作(并且,如果不清楚,我认为您应该找到另一种方法),您可以尝试使用如下所示的方法来跟踪每个位置的单元格的变化:

TableView<SomeDataType> table = new TableView<>();

Map<TableColumn<SomeDataType, ?>, Map<Number, TableCell<SomeDataType, ?>>> cells = new HashMap<>();

TableColumn<SomeDataType, SomeColumnDataType> column = new TableColumn<>(...);
cells.put(column, new HashMap<>();

column.setCellValueFactory(...);

column.setCellFactory(tc -> {
    TableCell<SomeDataType, SomeColumnDataType> cell = new TableCell<SomeDataType, SomeColumnDataType>() {
        @Override
        protected void updateItem(SomeColumnDataType item, boolean empty) {
            super.updateItem(item, empty) ;
            if (empty) {
                setText(null);
            } else {
                setText(item.toString());
            }
        }
    };

    cell.indexProperty().addListener((obs, oldIndex, newIndex) -> {
        if (oldIndex != null) {
            cells.get(column).remove(oldIndex);
        }
        if (newIndex != null && newIndex.intValue() != -1) {
            cells.get(column).put(newIndex, cell);
        }
    });

    return cell ;
});

// repeat for other columns...

然后你就可以了

TableCell<SomeDataType, ?> cell = cells.get(someColumn).get(someIndex);

获取特定列和行索引的单元格。请注意,您需要检查是否为 null(如果该数据当前没有单元格)。

这可能需要非常仔细的调试,但该方法应该可行。

更新:我使用这种技术制作了 SSCCE here .

您也可以通过查找来尝试。查找不是很强大,并且在将 CSS 应用到场景图之前根本不起作用,但您可以尝试如下操作:

TableColumn<...> columnOfInterest = ... ;
int rowIndexOfInterest = ... ;

TableCell<?, ?> cell = null ;
for (Node n : table.lookupAll(".table-cell")) {
    TableCell<?,?> c = (TableCell<?,?>) n ;
    if (c.getTableColumn() == columnOfInterest 
            && c.getIndex() == rowIndexOfInterest) {
        cell = c ;
        break ;
    }
}

if (cell != null) {
    // ...
}

或者采用更 Java 8 的方法:

table.lookupAll(".table-cell").stream()
    .map(TableCell.class::cast)
    .filter(c -> c.getTableColumn() == columnOfInterest && c.getIndex() == rowIndexOfInterest)
    .findAny()
    .ifPresent(cell -> {
        // do whatever you need with the cell....
    });

关于java - 获取 JavaFX 中表格 View 单元格的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46158015/

相关文章:

java - 读取网站列表,去掉 HTML 标签并将其全部写入 txt 文件

java - 如何为 TableView/TreeTableView 启用 focusLost 提交?

JavaFX : Is it possible to use variable resolution in "fx:define"

java - 如何生成用于计算最短距离的数据

java - Spring集成分离器的事务边界

java - 尝试使用 Task 更新 JavaFX 场景图,在调用任务对象外部的事件处理程序时出现错误

java - 在 WSL 上运行时如何解决 "Graphics Device initialization failed for : es2, sw"?

java - 禁用 Pane 子项上的所有鼠标事件

java - 无法在 Java 中播放声音

java - 如何修复使用 JavaFX 12 在 Swing 中创建 JFXPanel 时出现的异常