В настоящее время я пытаюсь реализовать какое-то поведение "двунаправленного исключения" между двумя комбинированными списками, однако происходит сбой, когда пользователь выбирает значение в обоих комбинированных списках.
Основная идея заключается в том, что если вы выберете элемент в выпадающем списке A, он больше не будет доступен для выбора в выпадающем списке B, и наоборот.
Мой текущий код выглядит следующим образом (внешний класс для простоты опущен):
@Override
public void initialize(URL location, ResourceBundle resources)
{
final var sourceList = baseList.filtered(new ExclusionPredicate(null));
final var targetList = baseList.filtered(new ExclusionPredicate(null));
initChangeListener(sourceSelection, targetList);
initChangeListener(targetSelection, sourceList);
sourceSelection.setItems(sourceList);
targetSelection.setItems(targetList);
}
private void initChangeListener(ComboBox<Item> comboBox, FilteredList<Item> targetList)
{
comboBox.valueProperty().addListener(((observable, oldValue, newValue) -> {
if(newValue != null)
{
targetList.setPredicate(((ExclusionPredicate) targetList.getPredicate()).updateExclusion(newValue));
}
}));
}
private class ExclusionPredicate implements Predicate<Item>
{
private final Item excluded;
private ExclusionPredicate(Mailbox excluded)
{
this.excluded = excluded;
}
@Override
public boolean test(Item item)
{
if(item == null)
{
return true;
}
return item.equals(excluded);
}
private ExclusionPredicate updateExclusion(Item excluded)
{
return new ExclusionPredicate(excluded);
}
}
Когда только один комбинированный список содержит значение, все в порядке - вы больше не можете видеть выбранное значение в комбинированном окне 2.
Однако, как только я выбираю значение в выпадающем списке 2, ОБА выпадающие списки теряют свое значение.
Я делаю что-то ужасно неправильное или невозможно реализовать такое поведение в JavaFX? При поиске здесь / в Google можно было найти ответы только о зависимых выпадающих списках, а не о двунаправленных.