ändert ich diesen Beitrageine Tableview mit einem HashMap Bestücken, die aktualisieren, wenn HashMap
Binding hashmap with tableview (JavaFX)
und schuf eine Tableview gefolgt sind, die durch Daten aus einer HashMap bevölkert ist.
Die TableView
erhält seine Daten von einem HashMap
genannt map
durch eine ObservableList
von map.entrySet()
Erstellung und Übergabe, dass ObservableList
aus nach TableView
‚s Konstruktor. (Code ist unten)
Obwohl es ein ObservableList
mit SimpleStringProperty
s ist, wird das TableView nicht aktualisiert, wenn Änderungen an der zugrunde liegenden HashMap vorgenommen werden.
Hier ist mein Code:
public class MapTableView extends Application {
@Override
public void start(Stage stage) throws Exception {
try {
// sample data
Map<String, String> map = new HashMap<>();
map.put("one", "One");
map.put("two", "Two");
map.put("three", "Three");
// use fully detailed type for Map.Entry<String, String>
TableColumn<Map.Entry<String, String>, String> column1 = new TableColumn<>("Key");
column1.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Map.Entry<String, String>, String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(TableColumn.CellDataFeatures<Map.Entry<String, String>, String> p) {
// this callback returns property for just one cell, you can't use a loop here
// for first column we use key
return new SimpleStringProperty(p.getValue().getKey());
}
});
TableColumn<Map.Entry<String, String>, String> column2 = new TableColumn<>("Value");
column2.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Map.Entry<String, String>, String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(TableColumn.CellDataFeatures<Map.Entry<String, String>, String> p) {
// for second column we use value
return new SimpleStringProperty(p.getValue().getValue());
}
});
ObservableList<Map.Entry<String, String>> items = FXCollections.observableArrayList(map.entrySet());
final TableView<Map.Entry<String,String>> table = new TableView<>(items);
table.getColumns().setAll(column1, column2);
Button changeButton = new Button("Change");
changeButton.setOnAction((ActionEvent e) -> {
map.put("two", "2");
System.out.println(map);
});
VBox vBox = new VBox(8);
vBox.getChildren().addAll(table, changeButton);
Scene scene = new Scene(vBox, 400, 400);
stage.setScene(scene);
stage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch();
}
}
Dies ist genau der Code von Binding hashmap with tableview (JavaFX) außer ich die folgende Schaltfläche hinzugefügt haben:
Button changeButton = new Button("Change");
changeButton.setOnAction((ActionEvent e) -> {
map.put("two", "2");
System.out.println(map);
});
, die ich dann mit dem Tableview zu einem VBox hinzuzufügen.
Wenn ich auf die Schaltfläche klicke, wird TableView
nicht aktualisiert. Ich kann jedoch überprüfen, dass der zugrunde liegende HashMap
tatsächlich wegen der System.out.println(map)
Ausgabe geändert hat. Wenn ich auf eine Spaltenüberschrift in TableView
klicke, um die Daten nach einer Spalte zu sortieren, wird der neue aktualisierte Wert angezeigt, nachdem die Tabellendaten neu sortiert werden.
Wie kann ich die Tabelle automatisch aktualisieren, wenn die zugrunde liegende Karte geändert wird?
Danke,
Mark
ich sah nicht so aus in diesen im Detail Vielleicht möchten Sie aber eine [ObservableMap] (https://docs.oracle.com/javase/8/javafx/api/javafx/collections/FXCollections.html#observableMap-java.util.Map-) verwenden. – jewelsea
Vielleicht diese Antwort http://stackoverflow.com/a/21339428/2855515 – brian