JavaFX: Заполните TableView ObservableMap, у которого есть собственный класс для его значений

У меня есть следующая ObservableMap, которую я хотел бы отобразить вTableView:

private ObservableMap<String, Shape> myShapes = FXCollections.observableHashMap();

кудаShape определяется следующим образом:

public class Shape {

private StringProperty areaFormula = new SimpleStringProperty();
private IntegerProperty numSides = new SimpleIntegerProperty();

public Shape(String areaFormula, int numSides)
{
    this.areaFormula.set(areaFormula);
    this.numSides.set(numSides);
}

public String getAreaFormula() { return areaFormula.get(); }

public void setAreaFormula(String areaFormula) { this.areaFormula.set(areaFormula); }

public StringProperty areaFormulaProperty() { return this.areaFormula; }

public int getNumSides() { return numSides.get(); }

public void setNumSides(int sides) { this.numSides.set(sides); }

public IntegerProperty numSidesProperty() { return this.numSides; }
}

Я хотел бы, чтобы первый столбец TableView был ключом карты (назовите егоkey), второй столбец будетmyShapes.get(key).getAreaFormula()и третий столбец будетmyShapes.get(key).getnumSides(), И я хотел бы, чтобы TableView автоматически обновлялся при изменении карты.

Также было бы неплохо сделать второй и третий столбцыTableView редактируемые пользователем, если возможно, с этими изменениями, обновляемыми на карте.

Я уже просил stackoverflow о заполнении TableView ObservableMap таким образом, чтобы он обновлял изменения здесь:Заполнение TableView HashMap, который будет обновляться при изменении HashMap , Однако, как вы можете видеть в обсуждении, он не обрабатывает пользовательский класс, как у меня здесь.

Вот мое решение до сих пор:

        ObservableMap<String, Shape> map = FXCollections.observableHashMap();

        ObservableList<String> keys = FXCollections.observableArrayList();

        map.addListener((MapChangeListener.Change<? extends String, ? extends Shape> change) -> {
            boolean removed = change.wasRemoved();
            if (removed != change.wasAdded()) {
                // no put for existing key
                if (removed) {
                    keys.remove(change.getKey());
                } else {
                    keys.add(change.getKey());
                }
            }
        });

        map.put("square", new Shape("L^2", 4));
        map.put("rectangle", new Shape("LW", 4));
        map.put("triangle", new Shape("0.5HB", 3));

        final TableView<String> table = new TableView<>(keys);

        TableColumn<String, String> column1 = new TableColumn<>("Key");

        column1.setCellValueFactory(cd -> Bindings.createStringBinding(() -> cd.getValue()));

        TableColumn<String, String> column2 = new TableColumn<>("Value");

        column2.setCellValueFactory( ... );

        table.getColumns().setAll(column1, column2);

Место, где я застрял - это вторая строкаcolumn2.setCellValueFactory( ... ), мне бы хотелосьcolumn2 отображатьShape«sgetAreaFormula() SimpleStringProperty но я не знаю, как настроитьCellValueFactory сделать это.

Спасибо за вашу помощь.

Ответы на вопрос(1)

Ваш ответ на вопрос