如何确定 JavaFX 8 中 TableView 中一行的 X 和 Y 坐标

How can I determine the X & Y coordinates of a row in a TableView in JavaFX 8

我想在 TableView 中弹出一个与选定行相关的节点。我们关注的 UI 使用编辑按钮打开弹出窗口,我想根据行在 TableView 中的位置将其放置在行下方或行上方。

我似乎无法在不单击该行的情况下找到该行的 X 和 Y 坐标。

由于我的应用程序需要完全可通过键盘导航,因此我需要能够从所选行确定该位置,即使它是通过键盘选择的。

即像这样

myTableView.getSelectionModel().getSelectedItem().location() or something like that.

我在这里看了几个例子,但是 none 似乎提供了足够的细节来说明如何根据屏幕上其他地方的点击来获取坐标。

谢谢!

您可以按照以下方式做一些事情:

TableView<T> table = ... ;

ObjectProperty<TableRow<T>> lastSelectedRow = new SimpleObjectProperty<>();
table.setRowFactory(tableView -> {
    TableRow<T> row = new TableRow<T>();
    row.selectedProperty().addListener((obs, wasSelected, isNowSelected) -> {
        if (isNowSelected) {
            lastSelectedRow.set(row);
        } 
    }
    return row ;
});

然后在任何时候 lastSelectedRow.get() 将 return 表示最后选择的行的实际节点,或者 null 如果没有选择任何行(在 [=14 的当前实现下) =] 的行为,我认为这不会发生)。然后,您可以使用各种 getBoundsIn*() 方法,也许结合 localTo*() 方法,在需要时获取行的位置:例如

TableRow<?> row = lastSelectedRow.get();
Bounds bounds = row.localToScreen(row.getBoundsInLocal());

将给出最后选定行相对于屏幕坐标的边界。

如果用户用鼠标选择某些内容,然后将所选行滚动到视图之外,可能会发生奇怪的事情;但是你需要弄清楚如何处理这个问题,但是你得到了坐标。