TableView上的一行上下文菜单?

Mic*_*ott 11 java javafx contextmenu

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

是)我有的...

在Scene Builder中,我有一个方法,可以在激活上下文菜单时运行,但这不是我想要的.这很好,因为我可以随时以编程方式从表中获取所选项目.问题,如果我保留我目前拥有的,就是在所选元素上弹出上下文菜单.

contextMenu是包含菜单项的上下文菜单.connectedUsers是TableView

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

contextMenu.show(connectedUsers, Side.BOTTOM, 0, 0);
Run Code Online (Sandbox Code Playgroud)

Luc*_* S. 14

我认为,最好的解决办法是将此作为讨论这里.

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(rowMenu)
              .otherwise((ContextMenu)null));
            return row;
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 由于这会在创建行时设置菜单标签,因此您似乎无法轻松地执行反映每行数据的自定义菜单.防爆.像这样的提示:"删除行ID 123"......或者我错过了一些明显的东西? (2认同)

Ans*_*har 10

试试这个..

ContextMenu cm = new ContextMenu();
MenuItem mi1 = new MenuItem("Menu 1");
cm.getItems().add(mi1);
MenuItem mi2 = new MenuItem("Menu 2");
cm.getItems().add(mi2);

table.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {

    @Override
    public void handle(MouseEvent t) {
        if(t.getButton() == MouseButton.SECONDARY) {
            cm.show(table, t.getScreenX(), t.getScreenY());
        }
    }
});
Run Code Online (Sandbox Code Playgroud)


cek*_*ock 10

JavaFX 8(带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);
Run Code Online (Sandbox Code Playgroud)

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