我使用单例作为Employee对象的错误数据库。

在此伪数据库中,有一个ObservableMap,它使用员工的社会保险号作为其唯一密钥。

我有要使用此数据库填充的ComboBoxes,TableViews和ListView,以及确保数据库中的任何更改都将反映在这些TableViews,Listviews等中。

但是,组合框,电视和LV需要ObservableArraylist,所以我应该如何从HashMap中删除它?我可以通过迭代器手动提取值,并将其添加到新的ObservableArraylist中,但是如果数据库中进行了任何更改,我也必须手动调整ObservableArraylist。我宁愿手动进行同步。

关于我应该做什么的任何想法?

编辑:

显然,这有效(我必须非常具体。也不确定为什么必须使用通配符而不是将其用作通用参数。

    employeeMap
            .addListener((
                    MapChangeListener.Change<? extends Integer, ? extends Employee> listener) -> {
                System.out.println("CHANGED");
            });

最佳答案

这未经测试,但尝试类似的方法:

ObservableMap<String, Employee> employeeMap = DataBase.getInstance().getEmployeeMap();
ListView<Employee> listView = new ListView<>();
listView.getItems().addAll(employeeMap.values());

employeeMap.addListener((Change change) -> {
    if (change.wasAdded()) {
        listView.getItems().add(change.getValueAdded());
    } else if (change.wasRemoved()) {
        listView.getItems().remove(change.getValueRemoved());
    }
});


现在注意,您只能在FX Application Thread上修改ObservableMap。如果需要在其他线程上对其进行修改,则需要将对listView.getItems().add(...)listView.getItems().remove(...)的调用包装在Platform.runLater(...)

10-05 20:58
查看更多