java 从组合框中选择多个项目

omqzjyyz  于 2023-03-21  发布在  Java
关注(0)|答案(4)|浏览(189)

我想知道如何改变javafxml组合框的selectionmodel,以便它可以允许多个seletion。任何贡献将不胜感激,谢谢。

vd2z7a6w

vd2z7a6w1#

您可以尝试ControlsFX CheckComboBoxControlsFX是JavaFX的第三方控件库)。

从CheckComboBox javadoc复制:
一个简单的UI控件,可以在类似ComboBox的控件中选择零个或多个项。每个行项都显示一个CheckBox,并且可以通过检查模型查询每行的状态。

// create the data to show in the CheckComboBox 
 final ObservableList<String> strings = FXCollections.observableArrayList();
 for (int i = 0; i <= 100; i++) {
     strings.add("Item " + i);
 }

 // Create the CheckComboBox with the data 
 final CheckComboBox<String> checkComboBox = new CheckComboBox<String>(strings);

 // and listen to the relevant events (e.g. when the selected indices or 
 // selected items change).
 checkComboBox.getCheckModel().getSelectedItems().addListener(new ListChangeListener<String>() {
     public void onChanged(ListChangeListener.Change<? extends String> c) {
         System.out.println(checkComboBox.getCheckModel().getSelectedItems());
     }
 });
 }

注意:JavaFX内置combobox控件上的JavaFX controls developer lead comments
你可以把任何你想要的选择模型示例放到ComboBox中,但只有单一选择将永远被支持。我们这样做是因为如果不对UI和UX进行重大更改,多重选择就没有意义了,我们认为未来可以开发一个单独的控件来更好地支持这种用例
ControlsFX中的CheckComboBox控件就是这样一个单独的控件。

cmssoen2

cmssoen22#

我需要类似的东西,这解决了我的问题。

@FXML
public MenuButton menuButton;  
......  
CheckBox cb0 = new CheckBox("x");  
CustomMenuItem item0 = new CustomMenuItem(cb0);  
CheckBox cb1 = new CheckBox("y");  
CustomMenuItem item1 = new CustomMenuItem(cb1);  
item0.setHideOnClick(false);  
item1.setHideOnClick(false);  
menuButton.getItems().setAll(item0,item1);
bq8i3lrv

bq8i3lrv3#

我知道这是一个老帖子,但这里只是一个极简主义的工作解决方案,正如@user82426评论所描述的那样,建议使用“加入”部分。这是使用http://javawiki.sowas.com/doku.php?id=javafx:combobox-multi-selection构建的。
如前所述,这不是一个组合框,但一个菜单按钮…然而,它确实填补了需要,我正在寻找一个更好的组合框,所以我认为它可以帮助其他;- )...
这就是:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.CheckMenuItem;
import javafx.scene.control.ListView;
import javafx.scene.control.MenuButton;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
import java.util.Arrays;
import java.util.List;

public class MultiSelectionComboDemo extends Application {
    final ListView<String> selectedItems = new ListView<>();
    
    @Override
    public void start(Stage primaryStage) {
        final String sMenuTextStart = "Fruit : ";
        final String sMenuTextEmpty = "[empty]";
        final MenuButton            choices = new MenuButton(sMenuTextStart+sMenuTextEmpty);
        final List<CheckMenuItem>   items   = Arrays.asList(new CheckMenuItem("Apple"), new CheckMenuItem("Banana"), new CheckMenuItem("Pear"), new CheckMenuItem("Kiwi"));
        choices.getItems().addAll(items);
        
        for (final CheckMenuItem item : items) {
            item.selectedProperty().addListener((observableValue, oldValue, newValue) -> {
                if (newValue) {
                    selectedItems.getItems().add(item.getText());
                } else {
                    selectedItems.getItems().remove(item.getText());
                }
                String sMenuText = sMenuTextStart + (selectedItems.getItems().size()>0?"":sMenuTextEmpty);
                choices.setText(sMenuText+String.join(", ", selectedItems.getItems()));
            });
        }
        
        BorderPane borderPane = new BorderPane();
        borderPane.setTop(choices);
        borderPane.setCenter(selectedItems);
        primaryStage.setScene(new Scene(borderPane, 400, 300));
        primaryStage.show();
    }
    
    public static void main(String[] args) {
        launch(args);
    }
}
6mw9ycah

6mw9ycah4#

如果你看一下ComboBox类的源代码,它说“一个ComboBox只支持单选”。所以你需要做一个自己的ComboBox,或者使用一个库,我推荐controlsFX。

相关问题