Binding hashmap with tableview (JavaFX)

后端 未结 2 685
轻奢々
轻奢々 2020-12-10 17:17

I want to display HashMap contents in a JavaFX Tableview. Please find below the code I used to set the HashMap contents into the tabl

相关标签:
2条回答
  • 2020-12-10 17:59
    1. CellFactory.Callback.call() creates just one cell, not all cells in a loop
    2. Using return from a loop breaks loop execution.

    Take a look at next example, especially comments:

    public class MapTableView extends Application {
    
        @Override
        public void start(Stage stage) {
    
            // 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);
    
            Scene scene = new Scene(table, 400, 400);
            stage.setScene(scene);
            stage.show();
        }
    
        public static void main(String[] args) {
            launch();
        }
    }
    
    0 讨论(0)
  • 2020-12-10 18:21

    Sergey Grinev; I found a solution, a generic solution for this problem

    public class TableCassaController<K,V> extends TableView<Map.Entry<K,V>> implements Initializable {
    @FXML   private TableColumn<K, V> column1;
    @FXML   private TableColumn<K, V> column2;
    
    
    public TableCassaController(ObservableMap<K,V> map, String col1Name, String col2Name) {
        System.out.println("Costruttore table");
        TableColumn<Map.Entry<K, V>, K> column1 = new TableColumn<>(col1Name);
        column1.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Map.Entry<K, V>, K>, ObservableValue<K>>() {
    
            @Override
            public ObservableValue<K> call(TableColumn.CellDataFeatures<Map.Entry<K, V>, K> p) {
                // this callback returns property for just one cell, you can't use a loop here
                // for first column we use key
                return new SimpleObjectProperty<K>(p.getValue().getKey());
            }
        });
    
        TableColumn<Map.Entry<K, V>, V> column2 = new TableColumn<>(col2Name);
        column2.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Map.Entry<K, V>, V>, ObservableValue<V>>() {
    
            @Override
            public ObservableValue<V> call(TableColumn.CellDataFeatures<Map.Entry<K, V>, V> p) {
                // for second column we use value
                return new SimpleObjectProperty<V>(p.getValue().getValue());
            }
        });
    
        ObservableList<Map.Entry<K, V>> items = FXCollections.observableArrayList(map.entrySet());
    
        this.setItems(items);
        this.getColumns().setAll(column1, column2);
    
    }
    

    Very Thanks!!! :-)

    0 讨论(0)
提交回复
热议问题