我希望在不遗漏有用信息的情况下做得尽可能短。 我有以下课程:
public class Address{
StringProperty city = new SimpleStringProperty();
StringProperty street = new SimpleStringProperty();
//following the constructor, getters and setters
...
}
我有另一个类Client,一个有一个Address成员
public class Client {
StringProperty name = new SimpleStringProperty();
StringProperty id = new SimpleStringProperty();
ObjectProperty<Address> address = new SimpleObjectProperty<>();
//following the constructor, getters and setters
...
}
和一个带有控制器的JavaFX接口,该控制器包含一个TableView对象,该对象应该在3列中输出Client类的成员和给定对象的Address类的city成员。我的TableView和TableColumn定义是以下代码
public class SettingsController {
TableColumn<Client, String> clientNameCol;
TableColumn<Client, String> clientEmailCol;
TableColumn<Client, String> clientCityCol;
private TableView<Client> clientSettingsTableView;
...
...
clientNameCol = new TableColumn<>("Name");
clientNameCol.setCellValueFactory(new PropertyValueFactory<Client, String>("name"));
clientEmailCol = new TableColumn<>("email");
clientEmailCol.setCellValueFactory(new PropertyValueFactory<Client, String>("email"));
clientCityCol = new TableColumn<>("City");
clientCityCol.setCellValueFactory(new PropertyValueFactory<Client, String>("city"));
clientSettingsTableView.setItems(clientData);
clientSettingsTableView.getColumns().clear();
clientSettingsTableView.getColumns().addAll(clientNameCol, clientEmailCol, clientCityCol);
当然还有一个ObservableList clientData,它包含一个Client对象数组。 一切正常,除了应该为每个客户输出城市的列。 我应该如何定义Client对象的城市列(由Address成员包含)?
答案 0 :(得分:6)
@invariant感谢您的帮助,我再搜索了一下,最后得到了以下解决方案:
clientCityCol = new TableColumn<>("City");
clientCityCol.setCellValueFactory(new PropertyValueFactory<Client, Address>("address"));
// ======== setting the cell factory for the city column
clientCityCol.setCellFactory(new Callback<TableColumn<Client, Address>, TableCell<Client, Address>>(){
@Override
public TableCell<Client, Address> call(TableColumn<Client, Address> param) {
TableCell<Client, Address> cityCell = new TableCell<Client, Address>(){
@Override
protected void updateItem(Address item, boolean empty) {
if (item != null) {
Label cityLabel = new Label(item.getCity());
setGraphic(cityLabel);
}
}
};
return cityCell;
}
});
Address类有一个getter getCity(),它将city成员作为String()返回。
答案 1 :(得分:0)
这适用于fxml?
请考虑以下代码:
<TableColumn prefWidth="8" text="City">
<cellValueFactory >
<PropertyValueFactory property="adress.city" />
</cellValueFactory>
</TableColumn>
以这种方式工作我有一个空白单元格。
答案 2 :(得分:0)
你忘了提到你必须将clientCityCol TableColumn<Client, String> clientCityCol;
的定义更改为TableColumn<Client, Address> clientCityCol;
,否则它将无法正常工作。