【发布时间】:2014-08-27 04:29:14
【问题描述】:
我有一个想要在 ListView 控件中显示的 java bean 对象列表。默认情况下,ListView 使用 toString 方法。
如何定义用于在 ListView 中呈现的属性?
我想实现与 TableView 中相同的功能,可以通过 PropertyValueFactory 在此代码中实现:
@FXML
private TableView<Person> mainTableView;
//...
TableColumn<Person,String> personColumn = new TableColumn<>("Name");List
personColumn.setCellValueFactory(new PropertyValueFactory("name"));
mainTableView.getColumns().add(personColumn);
编辑
看起来没有简单的(开箱即用)解决方案。基于 James_D 的代码,我创建了通用类来处理这个问题。它包装了 PropertyValueFactory - 请注意,PropertyValueFactory 首先寻找方法 [NAME]Property() 试图获得可观察性,只有当它没有找到时它才会尝试访问标准 bean 属性。
public class PropertyValueFactoryWrapperCellFactory<T> implements Callback<ListView<T>, ListCell<T>> {
private final PropertyValueFactory<T, String> pvf;
public PropertyValueFactoryWrapperCellFactory(String propertyName) {
super();
pvf = new PropertyValueFactory(propertyName);
}
@Override
public ListCell<T> call(ListView<T> param) {
return new ListCell<T>() {
@Override
public void updateItem(T item, boolean empty) {
super.updateItem(item, empty);
textProperty().unbind();
if (item == null) {
return;
}
TableColumn.CellDataFeatures<T, String> cdf = new TableColumn.CellDataFeatures<>(null, null, item);
textProperty().bind(pvf.call(cdf));
}
};
}
}
用法:
@FXML
private ListView<Person> mainListView;
//...
mainListView.setCellFactory(new PropertyValueFactoryWrapperCellFactory("name"));
【问题讨论】:
-
为什么不重写 toString 方法?