JavaFX: Preencher TableView com um ObservableMap que possui uma classe personalizada para seus valores
Eu tenho o seguinte ObservableMap que gostaria de exibir em umTableView
:
private ObservableMap<String, Shape> myShapes = FXCollections.observableHashMap();
OndeShape
é definido da seguinte maneira:
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; }
}
Gostaria que a primeira coluna do TableView fosse a chave do mapa (chame-akey
), a segunda coluna a sermyShapes.get(key).getAreaFormula()
e a terceira coluna a sermyShapes.get(key).getnumSides()
. E eu gostaria que o TableView fosse atualizado automaticamente quando o mapa fosse alterado.
Também seria muito bom fazer a segunda e a terceira coluna doTableView
editável pelo usuário, se possível, com essas edições sendo atualizadas no mapa.
Eu já perguntei ao stackoverflow sobre o preenchimento de um TableView com um ObservableMap, para que ele seja atualizado nas alterações aqui:Preenchendo um TableView com um HashMap que será atualizado quando o HashMap for alterado . No entanto, como você pode ver na discussão, ele não lida com uma classe personalizada como a que tenho aqui.
Aqui está a minha solução até agora:
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);
O lugar onde estou preso é a penúltima linhacolumn2.setCellValueFactory( ... )
. eu gostariacolumn2
para exibir oShape
égetAreaFormula()
SimpleStringProperty
mas não sei como configurar oCellValueFactory
para fazer isso.
Obrigado pela ajuda.