我使用单例作为Employee对象的虚假数据库。
在这个伪数据库中,有一个ObservableMap,利用Employees的社会安全号作为其唯一密钥。
我有ComboBoxes,TableViews和ListViews我想填充这个数据库,并确保数据库中的任何更改都会反映在这些TableViews,Listviews等中。
组合框,电视和LV需要一个ObservableArraylist,但是,我怎么能从HashMap中得到它呢?我可以通过迭代器手动提取值并将它们添加到新的ObservableArraylist中,但如果在数据库中进行了任何更改,我也必须手动调整ObservableArraylist。我宁愿让同步手动。
关于我应该做什么的任何想法?
修改
显然这很有效(我必须非常具体。也不确定为什么我必须使用通配符而不仅仅是作为通用参数。
employeeMap
.addListener((
MapChangeListener.Change<? extends Integer, ? extends Employee> listener) -> {
System.out.println("CHANGED");
});
答案 0 :(得分:1)
这未经过测试,但尝试类似:
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应用程序线程上的ObservableMap
。如果您需要在不同的线程上修改它,则需要将调用包含在listView.getItems().add(...)
listView.getItems().remove(...)
和Platform.runLater(...)