Javafx 2 将hashmap与tableview绑定(JavaFX)

Javafx 2 将hashmap与tableview绑定(JavaFX),javafx-2,javafx,tableview,Javafx 2,Javafx,Tableview,我想在JavaFXTableview中显示HashMap内容。请在下面找到我用来将HashMap内容设置到表列中的代码。我遇到的问题是,它只显示一行。for循环只迭代了5次:每次它都拾取HashMap的第一个值 final ObservableList<Map> data = FXCollections.observableArrayList(); data.addAll(HASHMAP); TableColumn<Map.Entry, String> nCol = n

我想在JavaFX
Tableview
中显示
HashMap
内容。请在下面找到我用来将
HashMap
内容设置到表列中的代码。我遇到的问题是,它只显示一行。
for
循环只迭代了5次:每次它都拾取
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,.........);
如果忽略
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,.........);
final observeList data=FXCollections.observearraylist();
data.addAll(HASHMAP);
TableColumn nCol=新的TableColumn(“名称”);
nCol.setEditable(真);
nCol.setCellValueFactory(新回调(){
@凌驾
公共observeValue调用(TableColumn.celldatap){
Set=HASHMAP.keySet();
for(字符串键:HASHMAP.keySet())
{
字符串key1=key.toString();
返回新的SimpleObject属性(key.toString());
}
返回null;
} 
});
表2.设置项目(数据);
Table.getColumns().setAll(nCol,…);
  • CellFactory.Callback.call()
    只创建一个单元格,而不是循环中的所有单元格
  • 使用循环中的
    返回
    会中断循环执行
  • 请看下一个示例,特别是注释:

    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();
        }
    }
    
    公共类MapTableView扩展应用程序{
    @凌驾
    公众假期开始(阶段){
    //样本数据
    Map Map=newhashmap();
    地图放置(“一”、“一”);
    地图放置(“二”、“二”);
    地图。放置(“三”、“三”);
    //对Map.Entry使用完全详细的类型
    TableColumn column1=新的TableColumn(“键”);
    column1.setCellValueFactory(新回调(){
    @凌驾
    公共observeValue调用(TableColumn.celldatap){
    //此回调仅返回一个单元格的属性,不能在此处使用循环
    //对于第一列,我们使用键
    返回新的SimpleStringProperty(p.getValue().getKey());
    }
    });
    TableColumn column2=新的TableColumn(“值”);
    column2.setCellValueFactory(新回调(){
    @凌驾
    公共observeValue调用(TableColumn.celldatap){
    //对于第二列,我们使用value
    返回新的SimpleStringProperty(p.getValue().getValue());
    }
    });
    ObservableList items=FXCollections.observableArrayList(map.entrySet());
    最终TableView表格=新的TableView(项目);
    table.getColumns().setAll(第1列、第2列);
    场景=新场景(表400400);
    舞台场景;
    stage.show();
    }
    公共静态void main(字符串[]args){
    发射();
    }
    }
    
    Sergey Grinev;我找到了一个解决方案,这个问题的通用解决方案

    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);
    
    }
    
    公共类TableCassaControl扩展TableView实现可初始化{
    @FXML私有表第1列;
    @FXML私有表第2列;
    公共表CASCAontroller(ObservableMap、字符串col1Name、字符串col2Name){
    System.out.println(“costrutore表”);
    TableColumn column1=新的TableColumn(col1Name);
    column1.setCellValueFactory(新回调(){
    @凌驾
    公共observeValue调用(TableColumn.celldatap){
    //此回调仅返回一个单元格的属性,不能在此处使用循环
    //对于第一列,我们使用键
    返回新的SimpleObject属性(p.getValue().getKey());
    }
    });
    TableColumn column2=新的TableColumn(col2Name);
    column2.setCellValueFactory(新回调(){
    @凌驾
    公共observeValue调用(TableColumn.celldatap){
    //对于第二列,我们使用value
    返回新的SimpleObject属性(p.getValue().getValue());
    }
    });
    ObservableList items=FXCollections.observableArrayList(map.entrySet());
    这是一个集合项目(items);
    this.getColumns().setAll(column1,column2);
    }
    

    非常感谢!!!:-)

    非常感谢你,伙计……我还有一个问题,假设我们在hashmap中使用多个值,如何检索它……多个值是什么意思?Map Map=new hashmap();例如,此映射将包含{one=[1,11,12],two=[2,21,22]}是的,您只需要引入更多列和CellValueFactory,代码如下:
    返回新的SimpleStringProperty(p.getValue().getValue().get(INDEX)
    。我们是否能够设置从映射中获取并在表视图中显示的内容数量限制?(例如:仅从映射中获取前十个或前二十个值)