【问题标题】:JavaFX ObservableList based elements weird behavior基于 JavaFX ObservableList 的元素奇怪的行为
【发布时间】:2016-04-13 09:41:31
【问题描述】:

我有一个 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);

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

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

那么,问题是为什么会随机发生/不会随机发生,以及如何禁用/启用它以确保它在下次启动时会按预期工作?

【问题讨论】:

  • 你只有一个列表。您添加到其中的任何内容都会影响所有三个变量,因为它们都引用同一个对象。
  • 是的,但是看前一段,它停止工作了。为什么?
  • 除非您提供足够的代码来重现它(即minimal reproducible example),否则没有人可以回答该部分(零星部分)。该行为不是由您发布的代码引起的。
  • 是的,看起来像一个非常个别的案例,因为它有效,而且现在没有任何代码更改...

标签: java list javafx observablelist


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 2019-01-14
    • 2016-05-22
    • 2012-11-13
    • 1970-01-01
    相关资源
    最近更新 更多