Странное поведение элементов на основе JavaFX ObservableList

У меня есть приложение JavaFX, в котором есть несколько элементов (один ListView, два ChoiceBox) на основе одного и того же универсального типа.

@FXML private ListView<Department> departmentList;
@FXML private ChoiceBox<Department> employeeAddDepartment;
@FXML private ChoiceBox<Department> employeeEditDepartment;

Я заполняю их все одним обс. список:

List<Department> ds = db.getDepartmentList();
ObservableList<Department> ds1 = FXCollections.observableArrayList(ds);
departmentList.setItems(ds1);
employeeAddDepartment.setItems(ds1);
employeeEditDepartment.setItems(ds1);

Проблема в том, что когда вы добавляете элемент в один элемент (например, DepartmentList) с помощью

departmentList.getItems().add(dep);

, он также автоматически добавляется в поля выбора, и вы получаете 3 повторяющихся элемента в списке и в обоих полях выбора. Почему это происходит? Пробовал смотреть обс. список документации, но не нашел ничего связанного, также искал stackoverflow. Я попытался добавить методы equals/hashCode в класс Employee, но похоже, что это не влияет на него.

Еще более странным является тот факт, что иногда эта синхронизация перестает работать. Мол, это работало в прошлый раз, когда вы его запускали, но сегодня вы вообще не видите элементы, добавленные в поля выбора (если вы добавляете элементы только в один из элементов, чтобы предотвратить дублирование). Итак, вы пытаетесь изменить свой код и попытаться добавить элементы в поля выбора, если они не синхронизированы сегодня по какой-либо причине. Затем вы запускаете свое приложение и снова видите 3 повторяющихся элемента. Вы возвращаете свой код, и теперь ваше приложение работает как вчера. Звучит очень странно, но так оно и работает.

Итак, вопрос в том, почему это происходит/не происходит случайным образом и как отключить/включить его, чтобы убедиться, что при следующем запуске он будет работать должным образом?


person Community    schedule 08.01.2016    source источник
comment
У вас есть только один список. Все, что вы добавите к нему, повлияет на все три переменные, поскольку все они ссылаются на один и тот же объект.   -  person resueman    schedule 08.01.2016
comment
Да, но посмотрите предыдущий абзац, он перестал работать. Почему?   -  person    schedule 08.01.2016
comment
Никто не может ответить на эту часть (спорадическую часть), если вы не предоставите достаточно кода для ее воспроизведения (т.е. минимальный воспроизводимый пример< /а>). Это поведение не вызвано кодом, который вы разместили.   -  person James_D    schedule 08.01.2016
comment
Да, похоже на очень индивидуальный случай, потому что он работал, а теперь не работает без каких-либо изменений кода...   -  person    schedule 08.01.2016


Ответы (1)


Это происходит потому, что 3 компонента используют один и тот же список. Создайте его следующим образом:

List<Department> ds = db.getDepartmentList();
departmentList.getItems().addAll(ds);
employeeAddDepartment.getItems().addAll(ds);
employeeEditDepartment.getItems().addAll(ds);
person Mateus Viccari    schedule 08.01.2016