uitableview - 如何在 Javafx 的 CellFactory 中显示项目列表(e1、e2、..、en)
问题描述
让我们考虑一下我们有一篇文章,一篇文章可能存储在许多 magasins(Stores) 中,反之亦然,我们可以在一个 Store 中存储许多文章。
假设我们有
class Article{
int id_article;
String name;
List<Magasin> magasins;
List<Magasin> getMagasins{
return magasins;
}
假设 Magasin 类看起来像这样
class Magasin{
int id_magasin;
String name;
//getters and setters
}
假设我在 javafx 中有我的 tableView : TableView tblArticles;
第一列包含文章名称,第二列希望它包含存储文章的所有 magasin (stores) 的名称 (magasin-1, magasin-2 .. magasin-N)
我还想问我是否可以将单元格设置为一列,这意味着歌曲的每个名称都将像列表视图一样垂直显示,并且所有这些名称都肯定适用于一个特定的艺术家..
更新:这是我添加到我的控制器的代码:
//FRom FXML file
@FXML
TableColumn<Article, List<Magasin>> colMag ;
PropertyValueFactory<Article, List<Magasin>> mag = new PropertyValueFactory<>("magasins");
//CellValueFactory
colMag.setCellValueFactory(mag);
//cell Factory
colMag2.setCellFactory( col -> {
ListView<Magasin> listView = new ListView<>();
listView.setCellFactory(lv -> new ListCell<Magasin>() {
@Override
public void updateItem(Magasin magasin, boolean empty) {
super.updateItem(magasin, empty);
if (empty) {
setText(null);
} else {
setText(magasin.getLibelle());
}
}
});
return new TableCell<Article, List<Magasin>>() {
@Override
public void updateItem(List<Magasin> mags, boolean empty) {
super.updateItem(mags, empty);
if (empty) {
setGraphic(null);
} else {
listView.getItems().setAll(mags);
setGraphic(listView);
}
}
};
});
当我运行它时,我得到了错误:
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$154(LauncherImpl.java:182)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException
at java.util.AbstractCollection.addAll(AbstractCollection.java:343)
at javafx.collections.ModifiableObservableListBase.addAll(ModifiableObservableListBase.java:99)
at javafx.collections.ModifiableObservableListBase.setAll(ModifiableObservableListBase.java:88)
at controllers.DashboardController$6.updateItem(DashboardController.java:1180)
at controllers.DashboardController$6.updateItem(DashboardController.java:1173)
at javafx.scene.control.TableCell.updateItem(TableCell.java:663)
at javafx.scene.control.TableCell.indexChanged(TableCell.java:468)
at javafx.scene.control.IndexedCell.updateIndex(IndexedCell.java:116)
at com.sun.javafx.scene.control.skin.TableRowSkinBase.updateCells(TableRowSkinBase.java:533)
at com.sun.javafx.scene.control.skin.TableRowSkinBase.init(TableRowSkinBase.java:147)
at com.sun.javafx.scene.control.skin.TableRowSkin.<init>(TableRowSkin.java:64)
at javafx.scene.control.TableRow.createDefaultSkin(TableRow.java:212)
at javafx.scene.control.Control.impl_processCSS(Control.java:872)
解决方案
推荐阅读
- typescript - 使用 `function f();` 语法进行记忆
- python-3.x - Python - 尝试使用 Selenium 登录网站时出现 urllib3 MaxRetryError
- ruby-on-rails - 阻止 f.range_field 提交数据,除非与
- python - 检查矩阵是否可以用 Jacobi 方法解决的代码不起作用
- javascript - 如何从 mySQL 中获取数据并在 Modal 中查看
- java - 多次将图像共享到应用程序后出现内存不足异常
- angular-material-6 - Angular 6的基本添加角度/材料失败
- javascript - 如何使用 jest 测试 Promise 链?
- mysql - MySQL INFILE 整数值不正确
- sql - Azure 数据工厂 V2:如何将文件名传递给存储过程变量