使用ObservableMap填充TableView,并将ObservableList作为值

时间:2018-11-17 14:32:27

标签: java javafx observable

我正在尝试创建一个ObservableMap,它具有自定义对象的ObservableList作为这样的值

Map<String, ObservableList<MyClass>> myMap = new HashMap<>();
ObservableMap<String, ObservableList<MyClass>> myObservableMap = FXCollections.observableMap(myMap);

在搜索了ObservableMap与tableview的绑定之后,我还没有发现值是集合的情况。我所看到的只是具有自定义类值的可观察地图的绑定。我认为它应该没有什么不同,因为我只希望将键的值绑定到表视图,并跟踪键及其内部值的变化。

这是我到目前为止所做的:

Map<String, ObservableList<DMSchedule>> myMap = new HashMap<>();
ObservableMap<String, ObservableList<DMSchedule>> myObservableMap = FXCollections.observableMap(myMap);

TableColumn<DMSchedule, String> dayColumn;
TableColumn<DMSchedule, String> subjectNameColumn;
TableColumn<DMSchedule, String> startTimeColumn;
TableColumn<DMSchedule, String> endTimeColumn;
@FXML
private TableView<DMSchedule> myTable;

@Override
public void initialize(URL url, ResourceBundle rb) {
    final ListChangeListener<DMSchedule> listListener = new ListChangeListener<DMSchedule>() {
        @Override
        public void onChanged(ListChangeListener.Change<? extends DMSchedule> change) {
            System.out.println("Detected a change!");
            while (change.next()) {
                System.out.println(change.getFrom());
                System.out.println("Added on list? " + change.wasAdded());
                System.out.println("Removed on list? " + change.wasRemoved());
            }
        }
    };

    dayColumn = new TableColumn<DMSchedule, String>("Day");
    subjectNameColumn = new TableColumn<DMSchedule, String>("Subject");
    startTimeColumn = new TableColumn<DMSchedule, String>("Start Time");
    endTimeColumn = new TableColumn<DMSchedule, String>("End Time");

    myObservableMap.addListener((MapChangeListener<String, ObservableList<DMSchedule>>) mapChange -> {
        if (mapChange.wasAdded()) {
            mapChange.getValueAdded().addListener(listListener);
        }
        if (mapChange.wasRemoved()) {
            mapChange.getValueRemoved().addListener(listListener);
        }
    });

    myObservableMap.put("M", FXCollections.observableArrayList());
    myObservableMap.get("M").add(new DMSchedule("M", "07:00", "08:30", "testSubj", "testSection"));
    myListOfMap.addAll(myObservableMap);

    myTable.getColumns().addAll(dayColumn, subjectNameColumn, startTimeColumn, endTimeColumn);

    myTable.setItems(myObservableMap);

我有点迷茫,如何将我的ObservableList值设置为表和列。

我想与表进行交互,就像将ObservableList绑定到tableview一样。就像选择表行将返回MyClass对象(假设已建立行工厂)。我已经想出了如何为映射中的键和值的值添加侦听器。我剩下的唯一问题是将ObservableList<MyClass>内的每个键的myObservableMap绑定在一起。我怎么可能呢?我希望你能帮助我。谢谢!

0 个答案:

没有答案