获取JavaFX中tableview单元格的位置

获取JavaFX中tableview单元格的位置,java,javafx,javafx-8,Java,Javafx,Javafx 8,JavaFX新手,一直在尝试通过行、列和索引获取TableView单元格的位置。寻找类似Swing的JTable.getCellRect 我见过需要特定单元格值的情况下的解决方案, () 我还认为,获取相应行和列的TableCell,然后获取边界并使用localToScreen等就足够了,但也找不到获取特定table cell的方法 我很想得到任何帮助。 提前感谢根据设计,在JavaFX中没有直接的方法可以做到这一点。由于单元格仅为当前可见的数据创建,并且可以重复使用(例如,当用户在表格中滚动时

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

我见过需要特定单元格值的情况下的解决方案, ()

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

我很想得到任何帮助。
提前感谢

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

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

如果您真的想尝试这种方法(如果不清楚,我认为您应该找到另一种方法),您可以尝试在每个位置的单元格发生变化时跟踪它们,方法如下:

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...

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

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

如果您真的想尝试这种方法(如果不清楚,我认为您应该找到另一种方法),您可以尝试在每个位置的单元格发生变化时跟踪它们,方法如下:

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...

在JavaFX中没有真正的方法来做到这一点(至少,没有大量的黑客攻击)。问题在于,单元格仅为可见数据创建,并在用户滚动时重复使用。因此,某些行和列甚至可能不存在单元格。几乎可以肯定的是,有一种更简单的方法可以实现您想做的任何事情—为什么您认为您需要这个位置?实际上,我正在将使用Swing编写的旧GUI转换为JavaFX。我只是觉得这会让我的工作更简单:)-而且很奇怪,他们没有在FX中添加这个功能。但这并不能真正解释你想做什么。这些是不同的工具包,它们以不同的方式工作,因此您必须以不同的方式处理某些事情。没有直接的方法来满足你的要求,所以你需要一种不同的方法。基本上,您可以通过单元工厂(它使您能够编写创建或重用单元时执行的代码)或通过查找来访问单元。对于你要求做的事情,这两个都会变得非常丑陋,非常快。是的,我知道。我仍然没有弄清楚这个位置的最初用途,因为缺少文档。我认为翻译相同的功能会节省一些工作。查找方法看起来怎么样?一点也不奇怪——至少对我来说不是。一旦你意识到单元格与数据的关系不是1-1的,甚至在数据索引中不一致地显示来自同一位置的数据,那么直接访问单元格就没有意义了。在JavaFX中没有真正的方法可以做到这一点(至少,如果没有大量的黑客攻击的话)。问题在于,单元格仅为可见数据创建,并在用户滚动时重复使用。因此,某些行和列甚至可能不存在单元格。几乎可以肯定的是,有一种更简单的方法可以实现您想做的任何事情—为什么您认为您需要这个位置?实际上,我正在将使用Swing编写的旧GUI转换为JavaFX。我只是觉得这会让我的工作更简单:)-而且很奇怪,他们没有在FX中添加这个功能。但这并不能真正解释你想做什么。这些是不同的工具包,它们以不同的方式工作,因此您必须以不同的方式处理某些事情。没有直接的方法来满足你的要求,所以你需要一种不同的方法。基本上,您可以通过单元工厂(它使您能够编写创建或重用单元时执行的代码)或通过查找来访问单元。对于你要求做的事情,这两个都会变得非常丑陋,非常快。是的,我知道。我仍然没有弄清楚这个位置的最初用途,因为缺少文档。我认为翻译相同的功能会节省一些工作。查找方法看起来怎么样?一点也不奇怪——至少对我来说不是。一旦你意识到单元格与数据之间不是1-1关系,甚至在数据索引中不一致地显示来自同一位置的数据,那么直接访问单元格就没有什么意义了。大家好:)感谢“黑客”。我现在知道这个位置是用来在表格的单元格之间创建动画的(数值从一个单元格移动到另一个单元格的错觉)。我仍然想不出另一种方法来做这件事,但我想你可能会,如果是的话,我会很高兴地使用它。你好:)谢谢你的“黑客”。我现在知道这个位置是用来在表格的单元格之间创建动画的(数值从一个单元格移动到另一个单元格的错觉)。我仍然想不出另一种方法来做这件事,但我想你会的,如果是的话,我很乐意使用它。
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) {
    // ...
}
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....
    });