如何使用 Javafx 从 MenuButtons 中删除 MenuItems
How to remove MenuItems from MenuButtons with Javafx
我正在尝试制作动态大小的 MenuButton。
我正在设计一个图书馆程序。书在书架上。在程序的过程中,货架的数量可能会增加或减少。
我想制作一个可以反映图书馆中货架的菜单按钮 - MenuItems 集应该在货架数量增加时增加,如果货架数量减少则减少。
这是我当前的代码。但是,它不会删除任何 MenuItem。此外,它会复制所有已包含的 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…
我也尝试过使用迭代来限制创建额外的菜单项 - 但无济于事。
此外:
1) 有没有办法只删除一个菜单项?
2) 有没有办法清除 MenuButton?
谢谢
只需修改 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
等。
可以使用 Set
来防止添加重复项,例如
Set<String> items = new shelfBtn.getItems().stream()
.map(MenuItem::getText)
.collect(Collectors.toCollection(HashSet::new));
for(String shelf : shelfs){
if (items.add(shelf)) {
...
}
}
我正在尝试制作动态大小的 MenuButton。
我正在设计一个图书馆程序。书在书架上。在程序的过程中,货架的数量可能会增加或减少。 我想制作一个可以反映图书馆中货架的菜单按钮 - MenuItems 集应该在货架数量增加时增加,如果货架数量减少则减少。 这是我当前的代码。但是,它不会删除任何 MenuItem。此外,它会复制所有已包含的 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…
我也尝试过使用迭代来限制创建额外的菜单项 - 但无济于事。
此外:
1) 有没有办法只删除一个菜单项?
2) 有没有办法清除 MenuButton?
谢谢
只需修改 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
等。
可以使用 Set
来防止添加重复项,例如
Set<String> items = new shelfBtn.getItems().stream()
.map(MenuItem::getText)
.collect(Collectors.toCollection(HashSet::new));
for(String shelf : shelfs){
if (items.add(shelf)) {
...
}
}