繁体   English   中英

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

[英]Show ContextMenu via ENTER key on selected row 2nd column in TableView (JavaFX)

直到现在,我只用该代码按ENTER按钮后,就使contextMenu出现在TableView的框架中了; contextMenu.show(tableView, Side.RIGHT, 0, 0); 但是这样,上下文菜单仅在静态位置弹出。

1.如何获取所选行第二列的xy位置

我希望contextmenu动态显示,也就是说,每当用户在选定的行上按ENTER键时,contextmenu就会在第二行选定行中显示:请查看下面的图片。 在此处输入图片说明

有这样的东西吗

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

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

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

lookupAll可用于从TableView获取所有TableRow 找到选定的一个,并获得一个tableColumn与该列匹配的子TableCell 这将为您提供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);
            }
        }
    }
});

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM