到目前为止,我只设法使contextMenu出现在
一旦按下代码contextMenu.show(tableView, Side.RIGHT, 0, 0);
按ENTER按钮,便会出现TableView。但是这样,上下文菜单仅在静态位置弹出。
1.如何获得所选行第二列的x y位置
我希望contextmenu动态显示,也就是说,每当用户在选定的行上按ENTER键时,contextmenu就会在其第二列的选定行中显示:请查看下面的给定图片。
有这样的东西吗
contextMenu.show(tableView,x-SelectedRow2ndCol,y-SelectedRow2ndCol);
2. Howto Contextmenu全部显示在可见区域
例如,如果选定的行是TableView的最后一行,因此其位置在屏幕的最下部,则contextmenu仍将在最后一行的上方弹出其所有项目。
最佳答案
lookupAll
可用于从TableRow
获取所有TableView
。找到选定的一个,并获得与该列匹配的TableCell
子tableColumn
。这使您获得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);
}
}
}
});
请注意,如果没有可见的选定表行,则此操作无效。