使用tableview绑定hashmap(JavaFX)

时间:2013-09-04 16:01:42

标签: javafx-2 javafx tableview

我想在JavaFX HashMap中显示Tableview内容。请在下面找到我用于将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,.........);

2 个答案:

答案 0 :(得分:10)

  1. CellFactory.Callback.call()只创建一个单元格,而不是循环中的所有单元格
  2. 使用循环执行中的return
  3. 看一下下一个例子,特别是评论:

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

答案 1 :(得分:1)

Sergey Grinev;我找到了一个解决方案,这个问题的通用解决方案

RestTemplate

非常感谢!!! : - )