在TableView(JavaFX)中选定行第2列上通过ENTER键显示ContextMenu

时间:2016-07-24 15:48:04

标签: java javafx tableview contextmenu keypress

直到现在我才设法让contextMenu出现在框架内 使用此代码contextMenu.show(tableView, Side.RIGHT, 0, 0);按ENTER按钮后,TableView。但是这样,contextmenu只会在静态位置弹出。

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

我希望上下文菜单动态显示,即每当用户在所选行上按ENTER键时,上下文菜单将显示在第二列的选定行:请查看给定的图片下方。enter image description here

有类似的东西

  

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

2。 Howto Contextmenu完全显示在可见区域

例如,如果所选行是TableView的最后一行,因此它的位置位于屏幕的最低位,那么contextmenu仍会弹出最后一行上方的所有项目。

1 个答案:

答案 0 :(得分:1)

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

来自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);
            }
        }
    }
});

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