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

时间:2016-01-08 16:22:18

标签: java list javafx observablelist

我有一个JavaFX应用程序,它具有很少的元素(一个ListView,两个ChoiceBox' es)基于相同的泛型类型。

@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);

,它也会自动添加到选择框中,您可以在listview和两个选项框中获得3个重复项。 为什么会这样?我试着看看obs。列出文档,但没有找到任何相关的,也搜索到stackoverflow。我试图将equals / hashCode方法添加到Employee类,但看起来它并没有影响它。

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

所以,问题是为什么会发生这种情况/不是随机发生的,以及如何禁用/启用它以确保它能按预期在下次启动时运行?

1 个答案:

答案 0 :(得分:0)

这是因为3个组件共享相同的列表。像这样创建它:

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