我有一个Java bean对象列表,我想在ListView控件中显示它。默认情况下,ListView使用toString方法。
如何定义要在ListView中呈现的属性?
我想要实现与PropertyValueFactory在以下代码中可以实现的TableView中相同的功能:
@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"));
使用细胞工厂。
如果该属性是不可变的,则非常简单:
ListView<MyDataType> listView = new ListView<>();
listView.setCellFactory(new Callback<ListView<MyDataType>, ListCell<MyDataType>>() {
@Override
public ListCell<MyDataType> call(ListView<MyDataType> lv) {
return new ListCell<MyDataType>() {
@Override
public void updateItem(MyDataType item, boolean empty) {
super.updateItem(item, empty);
if (item == null) {
setText(null);
} else {
// assume MyDataType.getSomeProperty() returns a string
setText(item.getSomeProperty());
}
}
};
}
});
如果属性可以更改其值,并且列表视图需要响应这些更改而动态更新,则需要绑定textProperty
列表单元格的:
listView.setCellFactory(new Callback<ListView<MyDataType>, ListCell<MyDataType>>() {
@Override
public ListCell<MyDataType> call(ListView<MyDataType> lv) {
return new ListCell<MyDataType>() {
@Override
public void updateItem(MyDataType item, boolean empty) {
super.updateItem(item, empty);
textProperty().unbind();
if (item != null) {
// assumes MyDataType.someProperty() returns a StringProperty:
textProperty.bind(item.someProperty());
}
}
};
}
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句