当您使用一个类中的数据填充表时,填充表很容易,但是当我想使用 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)
Person
和Car
. - 类(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/