Я хочу использовать 3 комбинированных списка с одинаковым набором вариантов. После того, как один выбран из одного из выпадающих списков, выбор отменяется в других, или все они сохраняют тот же выбор, но только один разрешен этот определенный выбор за раз. Итак, для второго варианта, если первое поле выбрало «желтый», а второе - «желтый», первое поле теперь ожидает выбора. Я пробовал несколько вещей с использованием comboboxes, Jcomboboxes и observablelists / observableitemlists и все еще не мог понять этого. Я подумал, может быть, использовать слушателя, но и там был в тупике.

Я установил свой код вот так

    ObservableList<String> c = FXCollections.observableArrayList("Blue", "Green", "Grey", "Red", "Black", "Yellow");

    ComboBox col = new ComboBox(c);

    ComboBox col2 = new ComboBox(c);

    ComboBox col3 = new ComboBox(c);

Вот как выглядят все выпадающие списки

После некоторого тестирования и пересмотра помощи Сая Дандема это последний код для всех, кто следит за этим постом. Его код в основном работал, но была проблема с исключениями нулевого указателя, и код иногда не очищал все поля, как хотелось.

    col.getSelectionModel().selectedItemProperty().addListener((obs, old, val)-> {
        if(col2.getSelectionModel().getSelectedItem() != null && col2.getSelectionModel().getSelectedItem().equals(val)) {
            col2.setValue(null);
        }
        if(col3.getSelectionModel().getSelectedItem() != null && col3.getSelectionModel().getSelectedItem().equals(val)) {
            col3.setValue(null);
        }
    });
    col2.getSelectionModel().selectedItemProperty().addListener((obs, old, val)-> {
        if(col.getSelectionModel().getSelectedItem() != null && col.getSelectionModel().getSelectedItem().equals(val)) {
            col.setValue(null);
        }
        if(col3.getSelectionModel().getSelectedItem() != null && col3.getSelectionModel().getSelectedItem().equals(val)) {
            col3.setValue(null);
        }
    });
    col3.getSelectionModel().selectedItemProperty().addListener((obs, old, val)-> {
        if(col.getSelectionModel().getSelectedItem() != null && col.getSelectionModel().getSelectedItem() != null && col.getSelectionModel().getSelectedItem().equals(val)) {
            col.setValue(null);
        }
        if(col2.getSelectionModel().getSelectedItem() != null && col2.getSelectionModel().getSelectedItem().equals(val)) {
            col2.setValue(null);
        }
    });
-2
kefspar 25 Май 2021 в 04:47

1 ответ

Лучший ответ

Я не тестировал приведенный ниже код, но вы можете сделать это примерно так ...

col.valueProperty().addListener((obs, old, val)->updateValue(val, col));
col2.valueProperty().addListener((obs,old,val)->updateValue(val,col2));
col3.valueProperty().addListener((obs,old,val)->updateValue(val,col3));

private void updateValue(String val, ComboBox combo){
    Stream.of(col,col2,col3).forEach(c->{
        if(c!=combo && c.getValue().equals(val){
            c.setValue(null);
        }
    });
}
1
Sai Dandem 25 Май 2021 в 07:20