直到现在我才设法让contextMenu出现在框架内
使用此代码contextMenu.show(tableView, Side.RIGHT, 0, 0);
按ENTER按钮后,TableView。但是这样,contextmenu只会在静态位置弹出。
我希望上下文菜单动态显示,即每当用户在所选行上按ENTER键时,上下文菜单将显示在第二列的选定行:请查看给定的图片下方。
有类似的东西
contextMenu.show(tableView,x-SelectedRow2ndCol,y-SelectedRow2ndCol);
例如,如果所选行是TableView的最后一行,因此它的位置位于屏幕的最低位,那么contextmenu仍会弹出最后一行上方的所有项目。
答案 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);
}
}
}
});
请注意,如果没有选定的表格行可见,则此方法无效。