を変更したとき、私はは、HashMapのは
Binding hashmap with tableview (JavaFX)
この記事に続き、HashMapのからのデータが移入されたテーブルビューを作成して更新するのHashMapとテーブルビューを移植します。
TableView
はmap.entrySet()
からObservableList
と渡すを作成することによって呼び出さHashMap
map
からデータを受信するTableView
のコンストラクタにオフObservableList
。
ObservableList
SimpleStringProperty
であるが、基本となるHashMapに変更が加えられた場合、TableViewは更新されません。
Button changeButton = new Button("Change");
changeButton.setOnAction((ActionEvent e) -> {
map.put("two", "2");
System.out.println(map);
});
私は、テーブルビューでのVBoxに追加します。
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();
}
}
これはまさに私は、次のボタンを追加した以外Binding hashmap with tableview (JavaFX)からのコードです:
は、ここに私のコードです。
ボタンをクリックすると、TableView
は更新されません。しかし、System.out.println(map)
出力のために基礎となるHashMap
が実際に変更されたことを確認できます。 TableView
の列ヘッダーをクリックして1つの列でデータを並べ替えると、テーブルデータが再ソートされた後に新しい更新された値が表示されます。
基本マップが変更されたときにテーブルを自動的に更新するにはどうすればよいですか?
これはあなたのtableViewを更新します
私は詳細にこれには見えませんでしたおそらく[ObservableMap](https://docs.oracle.com/javase/8/javafx/api/javafx/collections/FXCollections.html#observableMap-java.util.Map-)を使用したいと考えています。 – jewelsea
これは多分この回答です。http://stackoverflow.com/a/21339428/2855515 – brian