我使用单例作为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(...)
中