使用单个JavaFX TableView显示同一父级的不同子类

使用单个JavaFX TableView显示同一父级的不同子类,java,javafx,Java,Javafx,我尝试使用单个TableView来显示存储在ObservableList中的客户(父类)数据。它只包含常驻和访问者(子类)对象。两个子类都有不同的字段,不同于普通的客户类,我试图使用以下方法在表中显示所有3个类的字段: public void初始化(URL arg0,ResourceBundle arg1){ custIDCol.setCellValueFactory(新属性ValueFactory(“customerId”); nameCol.setCellValueFactory(新属性Va

我尝试使用单个TableView来显示存储在ObservableList中的客户(父类)数据。它只包含常驻和访问者(子类)对象。两个子类都有不同的字段,不同于普通的客户类,我试图使用以下方法在表中显示所有3个类的字段:

public void初始化(URL arg0,ResourceBundle arg1){
custIDCol.setCellValueFactory(新属性ValueFactory(“customerId”);
nameCol.setCellValueFactory(新属性ValueFactory(“名称”);
phoneCol.setCellValueFactory(新属性ValueFactory(“电话”));
addressCol.setCellValueFactory(新属性ValueFactory(“地址”);
nationalityCol.setCellValueFactory(新财产价值工厂(“国籍”);
许可证Col.setCellValueFactory(新房产价值工厂(“驾驶许可证”);
passportCol.setCellValueFactory(新属性值工厂(“passportNo”);
entryCol.setCellValueFactory(新属性ValueFactory(“entryDate”);
expiryCol.setCellValueFactory(新的PropertyValueFactory(“visaExpiryDate”));
卡塔尔上校setCellValueFactory(新财产价值工厂(“国有”);
setItems(ProjectName.getCustomers());
}
注:我必须这样做作为一个项目的要求

这样做会给我一个类似这样的错误:

2020年11月18日11:52:36上午javafx.scene.control.cell.PropertyValueFactory GetCellDataReflective
警告:无法在PropertyValueFactory:javafx.scene.control.cell中检索属性“passportNo”。PropertyValueFactory@1dba4623提供的类类型为:class model.rental.customer.Resident
java.lang.IllegalStateException:无法读取无法读取的属性passportNo

非常肯定会发生这种情况,因为只有访客才会有护照,所以它是tryna从居民那里获取护照no字段。我试着用一个try-catch来围绕它,以忽略错误,但它没有起作用。我试图用这种方法实现的是不可能的吗?

看起来像是@kleopatra建议使用“基于实际类型返回值的自定义工厂”的做法奏效了。我做了类似的事情,现在错误不再出现了

passportCol.setCellValueFactory(新回调(){
公共可观察值呼叫(CellDatap){
if(p.getValue()访客实例)
返回新的ReadOnlyObjectWrapper(((访问者)p.getValue()).getPassportNo());
其他的
返回新的ReadOnlyObjectWrapper(“”);
}
});

不要使用PropertyValueFactory(或仅对具有所有类型中可用字段的列使用它)-而是使用基于实际值返回值的自定义工厂type@kleopatra这很有效,虽然我不确定我是不是用正确的方法做的,但是如果它起作用了,它就起作用了,呵呵。谢谢