Как использовать контекстные меню в сочетании с редактируемыми ячейками? - PullRequest
0 голосов
/ 06 мая 2019

Я довольно новичок в Java / JavaFX и пытаюсь создать пользовательский интерфейс, который управляет различными лабораторными настройками.В конечном счете, я хотел бы иметь ListView, который содержит элементы, которые могут иметь контекстное меню с одним вариантом переименования рассматриваемого элемента списка.

Я нашел этот учебник , который будет полезен длясоздавать контекстные меню.В настоящее время я реализовал только две опции: «Удалить» и «Переименовать».Тем не менее, я не могу заставить переименование работать.Я чувствую, что это связано с тем, как учебник обернул cellFactory, но мне сложно найти хорошее объяснение того, как клеточные фабрики работают с самого начала.

Я нашел много людей, предлагающих использовать "startEdit" или "forListView" для выполнения того, что я пытаюсь сделать, но моя IDE не может найти методы, даже когда я @ переопределяю их вContextMenuListCell или классы DefaultListCell (так что есть большая вероятность, что я делаю это неправильно).

У меня есть файл .fxml с ListView ('LabSetupList').Контроллер содержит:

 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, но ячейка не становится редактируемой, как я ожидаю.

Кто-нибудь видит, где я это неправильно понимаю?Я попытался включить только соответствующий код, но дал мне знать, если чего-то не хватает (либо по случайному исключению, либо потому, что я никогда не писал это с самого начала!).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...