JavaFX 使用 OneToMany 关系填充 tableview

标签 java tableview javafx-8

当您使用一个类中的数据填充表时,填充表很容易,但是当我想使用 OneToMany 关系中的数据填充表时该怎么办?

例如:

类(class)人物: 身份证、名字、姓氏、 汽车(汽车与Class Cars具有一对多关系,因此一个人可以拥有一辆或多辆汽车)

现在,如果一个人有两辆车,我如何将其添加到表中?

它应该看起来像这样:

ID  |  firstname  |  lastname  |  vehicleBrand(from cars)
==============================================
1   |  jack       | jackson    |  crysler
----------------------------------------------
    |             |            |  bmw
----------------------------------------------
2   |  sally      | jackson    |  ford

如果我有来自 Person 的可观察列表,我可以像这样填充人员数据:

firstNameCol.setCellValueFactory(
    new PropertyValueFactory<Person,String>("firstName")
);

但类似:

vehicleBrandCol.setCellValueFactory(
new PropertyValueFactory<Cars,String>("vehicleBrand")
);

vehicleBrandCol.setCellValueFactory(
new PropertyValueFactory<Person,String>("vehicleBrand")
);

不起作用。

编辑: 以下答案适用于一个品牌。如果我尝试添加所有我尝试使用的循环,如下所示:

for (Car aCars : cars) {
                return new SimpleObjectProperty<>(aCars.vehicleBrand());
            }

但是循环不循环?! (我打印了汽车的尺寸,但它不是 1)

最佳答案

这应该是您正在寻找的内容的一部分,您可以这样做:

  • 现在我假设您有两个类(class) PersonCar .
  • 类(class) Person有一个 ArrayList<Car>汽车数量。
  • 类(class) Person还有一个方法getCars()它返回此人的汽车集合( ArrayList )。

现在从您的 Car 获取品牌TableView中显示的类您可以设置 CellValueFactory 的人数如下:

vehicleBrandCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Person,String>, ObservableValue<String>>() {
            @Override
            public ObservableValue<String> call(CellDataFeatures<Person, String> param) {
                ArrayList<Car> cars = new ArrayList<Car>();
                cars = param.getValue().getCars();
                if(cars!=null && !cars.isEmpty()) {
                    return new SimpleStringProperty(cars.get(0).getBrand());
                }
            }
        }
);

param.getValue()方法返回person作为参数传递。

请注意,在本示例中,我仅返回(显示)当前人的汽车集合中的第一个汽车品牌,您可以尝试根据您的情况调整此示例。

Ok, that makes sense ^^ should I make a List of the SimpleObjectProperty and return this?

不,你不能这样做,因为你声明的列应该包含 String对象不List对象。

您可以做的是创建自定义单元格,以允许您显示所有 Car每个品牌Person例如,您可以看一下 this example掌握单元格渲染,这是我的示例,可以帮助您解决您的情况:

首先设置vehicleBrandCol中单元格内容的类型至ArrayList<String> :

private TableColumn<Person, ArrayList<Car>> vehicleBrandCol;

然后设置CellValueFactory如下:

vehicleBrandCol.setCellValueFactory(new PropertyValueFactory<Person, ArrayList<Car>>("cars"));

然后您需要自定义单元格来显示此 ArrayList 中包含的数据(汽车) ,所以设置CellFactory如下:

vehicleBrandCol.setCellFactory(column->{
            return new TableCell<Person, ArrayList<Car>>() {
                @Override
                protected void updateItem(ArrayList<Car> item, boolean empty) {
                    super.updateItem(item, empty);
                    if(item==null || empty) {
                        setGraphic(null);
                    } else {
                        VBox vbox = new VBox();
                        for(Car car : item) {
                            Label lbl = new Label(car.getBrand());
                            vbox.getChildren().add(lbl);
                        }
                        setGraphic(vbox);
                    }
                }
            };
        });

请注意,我正在创建一个 VBox并使用标签,您可以使用任何 Node你喜欢,例如你可以使用 ListView ,或 GridPane并将它们设置为 Cell 的图形.

关于JavaFX 使用 OneToMany 关系填充 tableview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37509031/

相关文章:

java - 我可以对堆转储文件运行 Java 垃圾回收吗?

java - 使用 Eclipse AST

javascript - 从数据库将行添加到 TableView

ios - 将 NSArray 传递给 segue,然后将其传递给另一个 segue?

ios - 如何制作透明的tableview?

java - 在 JavaFX 中导入动画 3D 模型

JavaFX 8 - 向 TreeTable 单元格添加组件

java - 使用 xpath 查找带撇号的文本 ( "' ")

JavaFX 没有正确重绘

java - 使用唯一属性检索枚举值