首页 > 解决方案 > 如何在 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)

标签: uitableviewjavafxtableview

解决方案


推荐阅读