如何将上下文菜单与可编辑单元格结合使用?

时间:2019-05-06 16:59:33

标签: java listview javafx

我对Java / JavaFX很陌生,正在尝试创建一个管理不同实验室设置的UI。最终,我希望拥有一个ListView,其中包含可以具有上下文菜单的项目,其中一个选项是重命名有问题的列表项目。

我发现this tutorial对创建上下文菜单很有帮助。目前,我仅实现了两个选项,即“删除”选项和“重命名”。但是,我无法重命名。我觉得这与本教程包装cellFactory的方式有关,但是我很难找到关于单元工厂如何工作的良好解释。

我发现很多人建议人们可以使用“ startEdit”或“ forListView”来完成我想做的事情,但是我的IDE无法找到这些方法,即使我在ContextMenuListCell或DefaultListCell类(所以我做错的机会很大)。

我有一个带ListView('LabSetupList')的.fxml文件。控制器包含:

 public ListView LabSetupList;

    public void newSetup() {
        if (LightHBox.getChildren().size() > 0) {
            LabSetupList.getItems().add("New Setup");

            // Create a MenuItem and place it in a ContextMenu
            MenuItem renameItem = new MenuItem("Rename");
            MenuItem deleteItem = new MenuItem("Delete");
            ContextMenu contextMenu = new ContextMenu(renameItem, deleteItem);
            LabSetupList.setCellFactory(ContextMenuListCell.<LabSetup>forListView(contextMenu));

            renameItem.setOnAction(new EventHandler<ActionEvent>() {
                @Override public void handle(ActionEvent e) {

           LabSetupList.edit(LabSetupList.getSelectionModel().getSelectedIndex());
                        System.out.println("Selected item: " + LabSetupList.getSelectionModel().getSelectedItem());

                }
            });

            deleteItem.setOnAction(new EventHandler<ActionEvent>(){
                @Override public void handle(ActionEvent e) {
                    LabSetupList.getItems().remove(LabSetupList.getSelectionModel().getSelectedIndex());
                    System.out.println("Deleting: " + LabSetupList.getSelectionModel().getSelectedItem());
                }
            });

        }
    }

在CellFactory的ContextMenuListCell类中:

public class ContextMenuListCell<T> extends ListCell<T> {


    public static <T> Callback<ListView<T>,ListCell<T>> forListView(ContextMenu contextMenu) {
        return forListView(contextMenu, null);
    }

    public static <T> Callback<ListView<T>,ListCell<T>> forListView(final ContextMenu contextMenu, final Callback<ListView<T>,ListCell<T>> cellFactory) {
        return new Callback<ListView<T>,ListCell<T>>() {
            @Override public ListCell<T> call(ListView<T> listView) {
                ListCell<T> cell = cellFactory == null ? new DefaultListCell<T>() : cellFactory.call(listView);
                cell.setContextMenu(contextMenu);
                return cell;
            }
        };
    }


    public ContextMenuListCell(ContextMenu contextMenu) {
        setContextMenu(contextMenu);
    }
}

当我添加新设置并右键单击该单元格时,我将看到预期的上下文菜单。当我单击“重命名”时,我仍然得到println输出,但是单元格没有像我期望的那样可编辑。

有人看到我误解了吗?我试图只包含相关代码,但是让我知道是否缺少某些内容(由于意外排除,或者因为我从未写过!)。

0 个答案:

没有答案