在JavaFx中将嵌套对象属性绑定到TableView
我有下一节课在JavaFx中将嵌套对象属性绑定到TableView,java,javafx,Java,Javafx,我有下一节课 public class ProductStockDto extends private Long id; private Long amount; private ProductDto product; private StockDto stock; //getters and setters... } 在JavaFx中,我有我的表,我想将product.name属性绑定到列,类似这样 ObservableList<Produ
public class ProductStockDto extends
private Long id;
private Long amount;
private ProductDto product;
private StockDto stock;
//getters and setters...
}
在JavaFx中,我有我的表,我想将product.name属性绑定到列,类似这样
ObservableList<ProductStockDto> data = FXCollections.observableArrayList();
data.addAll(products);
nameColumn.setCellValueFactory(new PropertyValueFactory("product.name"));
productTable.setItems(data);
observeList data=FXCollections.observearraylist();
数据。添加所有(产品);
nameColumn.setCellValueFactory(新属性ValueFactory(“product.name”));
productTable.setItems(数据);
但当我这样做时,TableView上的行显示为空白
有人能帮我吗?我想绑定嵌套对象属性,在JavaSwing上类似于${product.name}
谢谢。此格式在
Javafx
中不受支持,作为解决方法,您可以尝试以下方法:
nameColumn.setCellValueFactory(new Callback<CellDataFeatures<ProductStockDto, String>,
ObservableValue<String>>() {
@Override
public ObservableValue<String> call(CellDataFeatures<ProductStockDto, String> data){
return data.getValue().getProducts().nameProperty();
}
});
TableColumn ProductNameCol=new ProductNameCol(“产品名称”);
ProductNameCol.setCellValueFactory(新回调(){
@凌驾
公共observeValue调用(TableColumn.CellDataFeatures参数){
返回新的SimpleObject属性(param.getValue().ProductDto().getName());
}
});
如果我们有一个不是原始java数据类型的属性,那么我们不能通过步骤(例如ProductStockDto.product.name)直接访问它,其中ProductStockDto是一个实体,product是另一个实体,product具有属性字符串名称。
在这里
我们需要在TableView中呈现name列,正如我在前面的响应中回答的那样
此外,您可以使用:javafx.beans.property.adapter包将javabeans对象转换为javafx beans对象属性。如果您想要更复杂的代码。您可以简单地使用:
nameColumn.setCellValueFactory(new PropertyValueFactory("product"));
这将使用对象产品中的toString()方法。但是,如果您只这样做,您可能会以类似以下内容结束ProductDto@abcef123“with是toString方法的复杂对象的默认返回值
然后,您可以覆盖toString方法:
@Override
public String toString(){
return //Whatever you want to show
}
我一直在努力,最终找到了解决办法。
希望这会有所帮助。请尝试以下使用Apache BeanUtils的代码
public class StringCellValueFactory implements
Callback<CellDataFeatures<Object, String>, ObservableValue<String>> {
private String property;
public StringCellValueFactory(String property) {
this.property = property;
}
public ObservableValue<String> call(CellDataFeatures<Object, String> param) {
Object value = param.getValue();
String stringValue = null;
try {
stringValue = BeanUtils.getNestedProperty(value, property);
} catch (Exception e) {
logger.error("Error in StringCellValueFactory", e);
}
return new SimpleStringProperty(stringValue);
}
}
公共类StringCellValueFactory实现
回拨{
私有财产;
公共StringCellValueFactory(字符串属性){
this.property=属性;
}
公共observeValue调用(CellDataFeatures参数){
对象值=param.getValue();
字符串stringValue=null;
试一试{
stringValue=BeanUtils.getNestedProperty(值,属性);
}捕获(例外e){
logger.error(“StringCellValueFactory中的错误”,e);
}
返回新的SimpleStringProperty(stringValue);
}
}
作为变体,您可以使用合成属性
将其命名为“productName”:
nameColumn.setCellValueFactory(new PropertyValueFactory("productName"));
在ProductStockDto类中有如下内容:
public String getProductName() {
return product.getName();
}
无需更改常规Java类:
nameCol.setCellValueFactory(new Callback<CellDataFeatures<ProductDto, String>, ObservableValue<String>>() {
public ObservableValue<String> call(CellDataFeatures<ProductDto, String> p) {
return new ReadOnlyObjectWrapper(p.getValue().getCost());
}
});
nameCol.setCellValueFactory(新回调(){
公共可观察值呼叫(CellDatap){
返回新的ReadOnlyObjectWrapper(p.getValue().getCost());
}
});
我也遇到了同样的问题,无法以任何建议的方式使其工作,但如果我们实例化列并在类Employee中使用嵌套属性,那么这个技巧对我有什么好处:
@FXML
private TableColumn<Employee, String> columnEmpName;
@FXML
private TableColumn<Employee, String> columnEmpLastName;
@FXML
private TableColumn<Employee, String> columnEmpJobDesc;
我用我为该属性选择的字符串制作了observeValue
columnEmpName.setCellValueFactory(new PropertyValueFactory<Employee, String>("name"));
columnEmpLastName.setCellValueFactory(new PropertyValueFactory<Employee, String>("lastname"));
columnEmpJobDesc.setCellValueFactory(cellData -> new SimpleStringProperty(cellData.getValue().getJobDesc().getJobDescription()));
在本文中了解了如何做到这一点:
如果对象和属性的另一种类型为字符串(例如:productDto类中带有整数的数字“productDto_nr”),则可以使用类型StringProperty解决此问题
nameColumn.setCellValueFactory(new Callback<CellDataFeatures<ProductStockDto, String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(CellDataFeatures<ProductStockDto, String> data) {
StringProperty sp = new SimpleStringProperty();
sp.setValue(String.valueOf(data.getValue().getProduct().getProductDto_nr()));
return sp;
}
});
nameColumn.setCellValueFactory(新回调(){
@凌驾
公共observeValue调用(CellDataFeatures数据){
StringProperty sp=新的SimpleStringProperty();
sp.setValue(String.valueOf(data.getValue().getProduct().getProductDto_nr());
返回sp;
}
});
一般来说,如果答案中包含对代码意图的解释,以及在不介绍其他代码的情况下解决问题的原因,那么答案会更有帮助。简单而有价值的解决方案。如果值为java.util.Date,则可以使用org.apache.commons.beanutils.PropertyUtils代替org.apache.commons.beanutils,任何用户定义的对象等,请仅用英语发布!请用英语发帖!回答者文本的翻译是“不必更改常规Java类:”出于某种原因,它给了我一个错误“在类栏中找不到属性foo的setter”。我通过在getProductName()函数上方添加@Transient注释解决了这个问题。并在顶部添加了这个导入javax.persistence.Transient+1、正确的解决方法。看起来,您进行了序列化/反序列化,在本例中,需要get/set对。瞬态注释将其从序列化/反序列化范围中排除。当通过.fxml文件构造列时,是否可以使用此方法?@sleet-Rabbi很抱歉回答得有点晚,但从这篇文章开始我就没有使用Java。我相信它可以使用,但我不确定。我希望你能找到解决办法
public class Employee {
private String name;
private String lastName;
.
.
private EmployeeJobDescription jobDesc; //this one is nested
}
columnEmpName.setCellValueFactory(new PropertyValueFactory<Employee, String>("name"));
columnEmpLastName.setCellValueFactory(new PropertyValueFactory<Employee, String>("lastname"));
columnEmpJobDesc.setCellValueFactory(cellData -> new SimpleStringProperty(cellData.getValue().getJobDesc().getJobDescription()));
public class EmployeeJobDescription {
private Integer id;
private String jobDescription;
public EmployeeJobDescription(Integer id) {
this.id = id;
}
public EmployeeJobDescription(Integer id, String jobDescription) {
this.id = id;
this.jobDescription = jobDescription;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getJobDescription() {
return jobDescription;
}
public void setJobDescription(String jobDescription) {
this.jobDescription = jobDescription;
}
}
nameColumn.setCellValueFactory(new Callback<CellDataFeatures<ProductStockDto, String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(CellDataFeatures<ProductStockDto, String> data) {
StringProperty sp = new SimpleStringProperty();
sp.setValue(String.valueOf(data.getValue().getProduct().getProductDto_nr()));
return sp;
}
});