2016-12-24 139 views
0

我有一个TableColumn编码为:FXML:绑定到嵌套场

<TableColumn text="Nom" prefWidth="${purchasesTable.width*0.65}"> 
    <cellValueFactory> 
     <PropertyValueFactory property="item.name" /> 
    </cellValueFactory> 
</TableColumn> 

TableView的项目属性绑定到Purchase类的列表:

采购类:

public class Purchase { 

private Item item; 


public Item getItem() { 
    return item; 
} 

public void setItem(Item item) { 
    this.item = item; 
} 

}

我的Item class is as foll OWS:

public class Item { 
private long id; 
private StringProperty name = new SimpleStringProperty(); 
private DoubleProperty price = new SimpleDoubleProperty(); 

//Getters and Setters 
public long getId() { 
    return id; 
} 
public void setId(long id) { 
    this.id = id; 
} 

public final StringProperty nameProperty() { 
    return this.name; 
} 


public final String getName() { 
    return this.nameProperty().get(); 
} 


public final void setName(final String name) { 
    this.nameProperty().set(name); 
} 

}

当我添加购买到我的表名单元不会出现。我究竟做错了什么?是否需要我的Item字段作为属性,因为我想在其他地方使用JavaFX而不使用它们?

回答

2

PropertyValueFactory不支持“属性属性”。你需要自己在这里实现Callback,其在控制器类做:

public class MyController { 

    @FXML 
    private TableColumn<Purchase, String> nameColumn ; 

    public void initialize() { 
     nameColumn.setCellValueFactory(cellData -> { 
      String name ; 
      Purchase purchase = cellData.getValue(); 
      if (purchase == null) { 
       name = null ; 
      } else { 
       name = purchase.getName(); 
      } 
      return new SimpleStringProperty(name); 
     }); 
     // ... 
    } 

    // ... 
} 

,然后在FXML,当然,你需要将表列字段映射到控制器

<TableColumn fx:id="nameColumn" text="Nom" prefWidth="${purchasesTable.width*0.65}" /> 
+0

如果我添加其他列如何创建一个方法'setUpColumn'以避免代码重复? –