使用ObservableMap填充和同步ComboBox?

时间:2014-07-08 03:25:45

标签: java arraylist javafx hashmap javafx-8

我使用单例作为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");
            });

1 个答案:

答案 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(...)