首页 > 解决方案 > 使用具有 ObservableList 作为值的 ObservableMap 填充 TableView

问题描述

我正在尝试创建一个 ObservableMap,其中包含自定义对象的 ObservableList 作为这样的值

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

在搜索了 ObservableMap 到 tableview 的绑定之后,我还没有发现如果该值是一个集合会怎么样。我所看到的只是绑定具有自定义类值的可观察地图。我认为它不应该如此不同,因为我只想将键的值绑定到 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 相同的方式与 table 交互。就像选择 tablerow 会返回MyClass对象(假设已经创建了行工厂)。我已经想出了如何为地图中键值和值的变化添加侦听器。我剩下的唯一问题是将ObservableList<MyClass>每个键的myObservableMap. 我怎么可能做到?我希望你能帮助我。谢谢!

标签: javajavafxobservable

解决方案


推荐阅读