Javafx 删除几个相同的元素组合框

Javafx 删除几个相同的元素组合框,javafx,combobox,javafx-2,javafx-8,Javafx,Combobox,Javafx 2,Javafx 8,我有4个组合框,每个组合框中有5个元素:“1”、“1”、“2”、“3”、“4”。 如果在组合框中选择了项目“1”,则该项目将自动从其他项目中排除。如果在组合框中选择了项目“”,则必须在名称中进行设置 它会自动返回到另一个。因此,除了“.”之外,其他项目的需求相同。 我试着这么做这是代码: 如果您遵循当前的方法,那么您的代码将相当长,并且很难调试。目前看来: 您只删除项目,从不退还项目 不存储以前选择的值。想象一下,在您的第一个组合框中,选择了“1”(随后从其他组件中排除),您决定将其更改回“”

我有4个组合框,每个组合框中有5个元素:“1”、“1”、“2”、“3”、“4”。 如果在
组合框
中选择了项目“1”,则该项目将自动从其他项目中排除。如果在
组合框
中选择了项目“”,则必须在名称中进行设置 它会自动返回到另一个。因此,除了“.”之外,其他项目的需求相同。
我试着这么做这是代码:



如果您遵循当前的方法,那么您的代码将相当长,并且很难调试。目前看来:

  • 您只删除项目,从不退还项目
  • 不存储以前选择的值。想象一下,在您的第一个组合框中,选择了“1”(随后从其他组件中排除),您决定将其更改回“”。无法直接从组合框中获取上一个值,因为
    .getSelectedItem()
    将只返回当前值,该值已经是“”
  • 我将向您介绍我的方法,并简要介绍其工作原理

    public class JavaFXApplication extends Application {
    
        public static void main(String[] args) {
            Application.launch(args);
        }
    
        @Override
        public void start(Stage primaryStage) {
            FlowPane root = new FlowPane();
    
            ArrayList<String> items = new ArrayList<>();
            Collections.addAll(items, " ", "1", "2", "3", "4");
    
            List<ComboBox> comboBoxList = new ArrayList<>();
            for (int i = 0; i < 4; i++) {
                ComboBox c = new ComboBox(FXCollections.observableArrayList(items));
                c.setValue(c.getItems().get(0));
                c.valueProperty().addListener(removeFromOtherCombo(comboBoxList, c));
                comboBoxList.add(c);
            }
    
            root.getChildren().addAll(comboBoxList);
            Scene scene = new Scene(root, 200, 100);
    
            primaryStage.setScene(scene);
            primaryStage.show();
        }
    
        public static ChangeListener removeFromOtherCombo(List<ComboBox> boxes, ComboBox current) {
            return (o, oldVal, newVal) -> {
                if (newVal.equals(oldVal)) {
                    return;
                } 
    
                if (!oldVal.equals(" ")) {
                    boxes.stream()
                            .filter(c -> !c.equals(current))
                            .forEach((ComboBox) -> {
                                ComboBox.getItems().add(oldVal);
                            });
                }
    
                if (!newVal.equals(" ")) {
                    boxes.stream()
                            .filter(c -> !c.equals(current))
                            .forEach((ComboBox) -> {
                                ComboBox.getItems().remove(newVal);
                            });
                }
            };
        }
    }
    
    每当您选择新值时,
    ChangeListener
    都会收到通知,幸运的是,它同时接收旧值和新值

    如果旧值等于新值,那么我们就没什么可做的了

    if (newVal.equals(oldVal)) {
        return;
    }
    
    如果旧值是一个数字(例如,我们正在从“1”更改为“2”),那么我们必须将以前选择的数字返回到每个
    组合框
    ,但其中一个已过滤

    if (!oldVal.equals(" ")) {
        boxes.stream()
                .filter(c -> !c.equals(current))
                .forEach((ComboBox) -> {
                    ComboBox.getItems().add(oldVal);
                });
     }
    

    当我们更改为一个数字时,也会采用相同的方法,但这次我们必须从每个
    组合框中删除它,只有一个除外

    首先,不要通过
    =
    比较
    字符串
    =,改为使用equals:
    vub1.getSelectionModel().getSelectedItem().equals(“”
    @MBec OK i rewrite:?'如果(vub1.getSelectionModel().getSelectedItem().equals(“”){}else{'但是程序仍然给我一个例外你有一个
    索引自动边界异常
    ,所以检查你的循环是否只在列表的最大大小上迭代!我使用场景生成器和FXML文件并初始化
    组合框
    ,所以你能重写这部分代码:
    列表组合框列表=新的ArrayList();例如(int i=0;i<4;i++){ComboBox c=new ComboBox(FXCollections.observearraylist(items));c.setValue(c.getItems().get(0));c.valueProperty().addListener(removeFromOtherCombo(comboBoxList,c));comboBoxList.add(c);
    然后更改此行
    ComboBox c=new ComboBox(FXCollections.observearraylist(items));
    to
    ComboBox c=comboBoxList.get(i);
    并在循环开始之前将您的
    ComboBox
    添加到列表中:
    comboBoxList.add(comboBox1)
    等。在这种情况下,您可以使用foreach循环。好的,非常感谢我重写了自己的代码,但我一直是
    异常
    s,因为我的程序应该自动选择
    组合框
    的一个元素,但是复制您的代码会重写这些
    异常
    s,我不会出现
    组合框的初始值de>为空。因为我不想处理它,所以我显式地将所选项目设置为第一个,如下:
    c.setValue(c.getItems().get(0));
    。我在开始时使用您的代码
    初始化
    ,然后更改我的选择:
    公共无效初始化(){您的代码…q1vub1.getSelectionModel().clearAndSelect(q1cprvar1);q1vub2.getSelectionModel().clearAndSelect(q1cprvar2);q1vub3.getSelectionModel().clearAndSelect(q1cprvar3);q1vub4.getSelectionModel().clearAndSelect(q1cprvar4);
    q1cprvar1
    q1cprvar2
    和其他变量是程序在程序开始时读取文件的
    int
    变量。因此,使用
    ActionListener
    c.valueProperty().addListener(removeFromOtherCombo(comboBoxList, c));
    
    if (newVal.equals(oldVal)) {
        return;
    }
    
    if (!oldVal.equals(" ")) {
        boxes.stream()
                .filter(c -> !c.equals(current))
                .forEach((ComboBox) -> {
                    ComboBox.getItems().add(oldVal);
                });
     }