【问题标题】:Context Menu on a row of TableView?一行 TableView 上的上下文菜单?
【发布时间】:2014-01-09 00:20:00
【问题描述】:

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

我有什么...

在 Scene Builder 中,我有一个在激活上下文菜单时运行的方法,但这并不是我想要的。这真的很好,因为我可以随时以编程方式从表中抓取选定的项目。如果我保留现有的内容,问题是让上下文菜单在所选元素处弹出。

contextMenu 是带有菜单项的上下文菜单。 connectedUsers 是 TableView

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

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

【问题讨论】:

标签: java javafx contextmenu


【解决方案1】:

我相信最好的解决方案是here 中讨论的。

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;
    }
});

【讨论】:

  • 由于这会在创建行时设置菜单标签,因此您似乎无法轻松地制作反映每行数据的自定义菜单。前任。像这样的提示:“删除行 ID 123”......还是我遗漏了一些明显的东西?
  • JavaFX 将多次调用此回调,导致仅为上下文菜单不必要地渲染每一行,对吗?
【解决方案2】:

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);

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

【讨论】:

  • 您要导入什么库以使用Item? Intellij 没有任何建议
  • @Robb1,Item是我自己创建的一个类。它是您的表包含的任何内容。帖子已编辑。看看docs.oracle.com/javase/8/javafx/api/javafx/scene/control/…
  • 漂亮而简单。然而,这个问题是上下文菜单在你点击表格的任何地方都可用,即使在单元格之外:/
【解决方案3】:

试试这个..

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());
        }
    }
});

【讨论】:

  • 完美运行!您能否添加一个setOnAction 的示例给其中一个项目?谢谢
  • 这不是安装在行上而是在表中。因此,如果表格为空,则将显示上下文菜单...
  • 如果您的 IDE 无法识别 MouseButton,导入 javafx.scene.input.* 会找到它
  • 即使表中没有行,此解决方案也会显示上下文菜单。此外,它不会基于行添加上下文菜单,而是基于右键单击添加。因此,如果您也右键单击表格标题,您仍然会看到上下文菜单,这似乎不合适。
猜你喜欢
  • 1970-01-01
  • 2015-02-06
  • 2012-12-08
  • 2019-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多