Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaFx中将嵌套对象属性绑定到TableView_Java_Javafx - Fatal编程技术网

在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;
    }
});