【问题标题】:Binding hashmap with tableview (JavaFX)使用 tableview (JavaFX) 绑定 hashmap
【发布时间】:2013-09-08 05:52:18
【问题描述】:

我想在 JavaFX Tableview 中显示 HashMap 内容。请在下面找到我用来将HashMap 内容设置到表格列中的代码。我遇到的问题是它只显示一行。 for 循环仅迭代 5 次:每次它获取 HashMap 的第一个值。

如果我忽略 return SimpleObjectProperty 行,for 循环将遍历 HashMap 中的所有内容。

final ObservableList<Map> data = FXCollections.observableArrayList();
data.addAll(HASHMAP);

TableColumn<Map.Entry, String> nCol = new TableColumn<Map.Entry, String>("Name");
nCol.setEditable(true);
nCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Entry, String>, ObservableValue<String>>() {

 @Override
 public ObservableValue<String> call(TableColumn.CellDataFeatures<Entry, String> p) {
        Set <String> set=HASHMAP.keySet();
    for (String key:HASHMAP.keySet())
    {
           String key1= key.toString();
           return new SimpleObjectProperty<>(key.toString());
    }
         return null;

        } 

    });
  Table.setItems(data);
  Table.getColumns().setAll(nCol,.........);

【问题讨论】:

    标签: javafx-2 javafx tableview


    【解决方案1】:
    1. CellFactory.Callback.call() 只创建一个单元格,而不是循环中的所有单元格
    2. 在循环中使用 return 会中断循环执行。

    看下一个例子,尤其是 cmets:

    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();
        }
    }
    

    【讨论】:

    • 非常感谢你....我还有一个问题假设如果我们在 hashmap 中使用多个值如何检索它....
    • 多值是什么意思?
    • Map> map = new HashMap>();例如此地图将包含 {one=[1, 11, 12],two=[2, 21, 22]}
    • 是的,你只需要引入更多的列和单元值工厂,代码如下:return new SimpleStringProperty(p.getValue().getValue().get(INDEX)
    • 我们是否能够设置从地图中获取并在表格视图中显示的内容数量限制。? (例如:仅从地图中获取前十个或二十个值)
    【解决方案2】:

    谢尔盖·格里涅夫;我找到了解决方案,这个问题的通用解决方案

    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);
    
    }
    

    非常感谢!!! :-)

    【讨论】:

      猜你喜欢
      • 2012-08-28
      • 2012-05-28
      • 1970-01-01
      • 2023-03-12
      • 2015-03-06
      • 2014-08-06
      • 2013-03-31
      • 1970-01-01
      相关资源
      最近更新 更多