基于 JavaFX ObservableList 的元素奇怪的行为

JavaFX ObservableList based elements weird behavior

我有一个 JavaFX 应用程序,它有几个基于相同泛型的元素(一个 ListView,两个 ChoiceBox)。

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

我用一个obs填满了它们。名单:

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 个重复的项目。 为什么会这样?我试着看obs。列出文档,但没有找到任何相关内容,还搜索了Whosebug。我尝试将 equals/hashCode 方法添加到 Employee class,但看起来它不会影响它。

更奇怪的是有时同步会停止工作。就像,它在您上次启动它时有效,但今天您根本看不到添加到选择框的项目(如果您仅将元素添加到其中一个元素以防止重复)。 因此,您尝试修改代码并尝试将元素添加到选择框(如果它们由于某种原因今天未同步)。 接下来,您启动您的应用程序并再次看到 3 个重复项。您恢复代码,现在您的应用程序像昨天一样运行。 这听起来很奇怪,但它是这样工作的。

所以,问题是为什么 happen/not 随机发生以及如何 disable/enable 确保它在下次启动时按预期工作?

发生这种情况是因为 3 个组件共享同一个列表。像这样创建它:

List<Department> ds = db.getDepartmentList();
departmentList.getItems().addAll(ds);
employeeAddDepartment.getItems().addAll(ds);
employeeEditDepartment.getItems().addAll(ds);