Заполните TableView с ObservableMap, который имеет ObservableList в качестве значения - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь создать ObservableMap, который имеет ObservableList пользовательских объектов в качестве значения, подобного этому

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

После поиска привязки ObservableMap к табличному представлению я не нашел, как это было бы, если значение является коллекцией. Все, что я видел, это привязка наблюдаемой карты, которая имеет значение пользовательского класса. Я думаю, что он не должен быть таким разным, так как я бы хотел, чтобы значения ключей были привязаны к представлению таблицы и отслеживали изменения, которые произойдут с ключом и значениями внутри него.

Вот что я сделал до сих пор:

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 к представлению таблицы. Подобно выбору tablerow, вы получите MyClass объектов (при условии, что была создана фабрика строк). Я уже выяснил, как добавить слушателей для изменения значения ключей и значений внутри карты. Единственная проблема, которую я оставил, - это связать ObservableList<MyClass> каждой клавиши внутри myObservableMap. Как я мог это сделать? Я надеюсь, что вы могли бы помочь мне. Спасибо!

...