表视图行上的上下文菜单?

2022-09-04 05:13:01

我正在使用JavaFX,我的应用程序有一个表,我可以向表中添加元素,但我想创建一个上下文菜单,当我右键单击该行时,该菜单将显示在该行上。

我拥有什么...

在场景生成器中,我有一个在激活上下文菜单时运行的方法,但这并不是我想要的。这实际上很好,因为我可以随时以编程方式从表中获取所选项目。如果我保留当前拥有的内容,问题是让上下文菜单在所选元素处弹出。

上下文菜单是包含菜单项的上下文菜单。连接用户是表视图

以下是我能得到的最接近的,但这显示了TableView底部的上下文菜单

contextMenu.show(connectedUsers, Side.BOTTOM, 0, 0);

答案 1

我相信最好的解决办法是这里讨论的。

table.setRowFactory(
    new Callback<TableView<Person>, TableRow<Person>>() {
        @Override
        public TableRow<Person> call(TableView<Person> tableView) {
            final TableRow<Person> row = new TableRow<>();
            final ContextMenu rowMenu = new ContextMenu();
            MenuItem editItem = new MenuItem("Edit");
            editItem.setOnAction(...);
            MenuItem removeItem = new MenuItem("Delete");
            removeItem.setOnAction(new EventHandler<ActionEvent>() {
        
                @Override
                public void handle(ActionEvent event) {
                    table.getItems().remove(row.getItem());
                }
            });
            rowMenu.getItems().addAll(editItem, removeItem);
            
            // only display context menu for non-empty rows:
            row.contextMenuProperty().bind(
              Bindings.when(row.emptyProperty())
              .then((ContextMenu) null)
              .otherwise(rowMenu);
            return row;
    }
});

答案 2

JavaFX 8 (with Lambda):

MenuItem mi1 = new MenuItem("Menu item 1");
mi1.setOnAction((ActionEvent event) -> {
    System.out.println("Menu item 1");
    Object item = table.getSelectionModel().getSelectedItem();
    System.out.println("Selected item: " + item);
});

ContextMenu menu = new ContextMenu();
menu.getItems().add(mi1);
table.setContextMenu(menu);

另请参见:https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/ContextMenu.html


推荐