Как удалить MenuItems из меню с Javafx

Я пытаюсь сделать динамический размер MenuButton.

Я разрабатываю библиотечную программу. Книги идут по полкам. В течение программы количество полок может увеличиваться или уменьшаться.
Я хочу сделать кнопку Меню, которая может отражать полки в библиотеке-набор элементов меню должен увеличиваться, если количество полок увеличивается и уменьшаться, если количество полок уменьшается.
Это мой текущий код. Тем не менее, он не удаляет никаких MenuItems. Кроме того, он дублирует все уже включенные модули.

previous code omitted…
//the button “shelfBtn.getItems” is a MenuButton defined elsewhere

Button btn = new Button(“Refresh”);
            btn.setTranslateX(-20);
            btn.setOnAction(new EventHandler<ActionEvent>() {

                @Override
                public void handle(ActionEvent event) {                                             
                        for(String shelf : shelfs){
                            MenuItem newShelf = new MenuItem(shelf);
                            newShelf.setOnAction(new EventHandler<ActionEvent() {

                                @Override
                                public void handle(ActionEvent event) {
                                    // ignore this
                                    shelfField.setText(shelf);
                                }
                            });
                            shelfBtn.getItems().add(newShelf);
                        }
                    }
            });
remaining code omitted…

Я также попытался использовать итерацию, чтобы ограничить дополнительные menuItems от создания — безрезультатно.

Вдобавок:

1) Есть ли способ просто удалить menuItem?

2) Есть ли способ очистить MenuButton?

Спасибо

1 ответ

  1. Просто модифиций items ObservableList:

    @Override
    public void start(Stage primaryStage) {
        ListView<String> listView = new ListView<>();
        for (int i = 0; i < 26; i++) {
            listView.getItems().add(Character.toString((char) ('a'+i)));
        }
        listView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
    
        MenuButton menuButton = new MenuButton();
    
        Button btn = new Button("Modify");
        btn.setOnAction((ActionEvent event) -> {
            // create menu items from selection
            menuButton.getItems().clear();
            for (String s : listView.getSelectionModel().getSelectedItems()) {
                menuButton.getItems().add(new MenuItem(s));
            }
        });
    
        Scene scene = new Scene(new VBox(listView, menuButton, btn));
    
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    

    Как и в любом Listслучае есть несколько способов удаления и добавления элементов в список, напримерadd,,remove,clear, ect.


    Добавление дубликатов может быть предотвращено с помощью aSet, например

    Set<String> items = new shelfBtn.getItems().stream()
                                               .map(MenuItem::getText)
                                               .collect(Collectors.toCollection(HashSet::new));
    for(String shelf : shelfs){ 
        if (items.add(shelf)) {
            ...
        }
    }