javafx - Cell Factory 是否支持两种不同类型的对象?
问题描述
我用两种不同类型的对象填充我的 ListView,我想重命名 ListView 中的所有项目。我正在使用以下代码重命名包含来自特定类型对象的项目的所有单元格。
public void listViewSetCellFactory() {
listView.setCellFactory(lv -> new ListCell<Banana>() {
@Override
public void updateItem(Banana item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setText(null);
} else {
String text = item.getBananaName();
setText(text);
}
}
});
}
但是由于我的 ListView 包含两种不同类型的 ob 对象(香蕉和葡萄柚)。如何使用相同的事件重命名包含葡萄柚的单元格?
解决方案
最好将返回名称的方法移动到超类型,并对所有名称使用相同的方法。在属性名称中包含类型名称只会导致更长的标识符而没有任何额外的好处(banana.getName()
就像 一样容易理解banana.getBananaName()
,甚至可能更好)。
这将允许您以相同的方式创建ListView<Fruit>
和处理项目:
listView.setCellFactory(lv -> new ListCell<Fruit>() {
@Override
public void updateItem(Fruit item, boolean empty) {
super.updateItem(item, empty);
setText(empty ? null : item.getName());
}
});
如果你不能做到这一点,你必须吞下苦涩的药丸并使用它instanceof
来确定物品的类型并相应地处理元素:
listView.setCellFactory(lv -> new ListCell<Object>() {
@Override
public void updateItem(Object item, boolean empty) {
super.updateItem(item, empty);
String text;
if (empty) {
text = null;
} else if (item instanceof Banana) {
text = ((Banana) item).getBananaName();
} else {
text = ((Grapefruit) item).getGrapefruitName();
}
setText(text);
}
});
推荐阅读
- python - 重塑熊猫数据框
- html - 如何在 html 中为 AngularJS 中的多个 json 值添加公共标题
- python - a.transpose().ravel()[0]=x 不能改变numpy中原始数组的值?
- excel - 在 Numbers/Excel 中,如何仅对匹配特定条件的行执行 SUMPRODUCT
- javascript - 如何对所有分页项目应用过滤器并仅显示过滤后的项目?
- apache-spark - pyspark creating BlockMatrix from matrices of different size
- r - 没有显示闪亮的情节
- javascript - 如何在没有 jquery 的情况下制作滑块图片库
- javascript - 为什么 e.clientX 和 e.clientY 函数在 mouseOver 上不能很流畅地输出?
- amazon-web-services - How to write SNS topic into CloudWatch log within AWS console?