到目前为止,我只设法使contextMenu出现在
一旦按下代码contextMenu.show(tableView, Side.RIGHT, 0, 0);按ENTER按钮,便会出现TableView。但是这样,上下文菜单仅在静态位置弹出。

1.如何获得所选行第二列的x y位置

我希望contextmenu动态显示,也就是说,每当用户在选定的行上按ENTER键时,contextmenu就会在其第二列的选定行中显示:请查看下面的给定图片。java - 通过ENTER键在TableView(JavaFX)的选定第2列上显示ContextMenu-LMLPHP

有这样的东西吗


contextMenu.show(tableView,x-SelectedRow2ndCol,y-SelectedRow2ndCol);


2. Howto Contextmenu全部显示在可见区域

例如,如果选定的行是TableView的最后一行,因此其位置在屏幕的最下部,则contextmenu仍将在最后一行的上方弹出其所有项目。

最佳答案

lookupAll可用于从TableRow获取所有TableView。找到选定的一个,并获得与该列匹配的TableCelltableColumn。这使您获得TableCell。使用ContextMenu方法显示show(Node anchor, Side side, double dx, double dy)。这也可以使菜单保持在屏幕上。

从javadoc:


如果没有足够的空间,则将菜单移到另一侧,并且不应用偏移。


TableView上的键侦听器示例:

ContextMenu contextMenu = ...

TableColumn secondColumn = tableView.getColumns().get(1);

tableView.setOnKeyReleased(evt -> {
    if (evt.getCode() == KeyCode.ENTER) {
        Set<Node> rows = tableView.lookupAll(".table-row-cell");
        Optional<Cell> n = rows.stream().map(r -> (Cell) r).filter(Cell::isSelected).findFirst();

        if (n.isPresent()) {
            Optional<Node> node = n.get().getChildrenUnmodifiable().stream()
                    .filter(c -> c instanceof TableCell && ((TableCell) c).getTableColumn() == secondColumn)
                    .findFirst();

            if (node.isPresent()) {
                Node cell = node.get();
                Bounds b = cell.getLayoutBounds();
                contextMenu.show(cell, Side.BOTTOM, b.getWidth() / 2, b.getHeight() / -2);
            }
        }
    }
});


请注意,如果没有可见的选定表行,则此操作无效。

10-07 13:09
查看更多