使用 tableview (JavaFX) 绑定 hashmap
Posted
技术标签:
【中文标题】使用 tableview (JavaFX) 绑定 hashmap【英文标题】:Binding hashmap with tableview (JavaFX) 【发布时间】: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,.........);
【问题讨论】:
【参考方案1】:CellFactory.Callback.call()
只创建一个单元格,而不是循环中的所有单元格
在循环中使用 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 中使用多个值如何检索它.... 多值是什么意思? Mapreturn 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);
非常感谢!!! :-)
【讨论】:
以上是关于使用 tableview (JavaFX) 绑定 hashmap的主要内容,如果未能解决你的问题,请参考以下文章
如何使用CSS来设置两个相邻TableView的边框样式,使它们看起来像是JavaFX 11中的单个TableView(OpenJFX 11)