1 回答
TA贡献1853条经验 获得超9个赞
item
a 的属性最初ListCell
是null
。Color.web
不接受null
作为参数。此外,您需要能够处理这样一个事实,即 a 的项目ListCell
可以在其生命周期内被替换,并且相同的项目可以分配给不同的单元格。ListView
只创建填充视图所需的单元格,如果例如可滚动区域的视口发生变化,则需要显示不同的项目,并且单元格被重用以显示更改后的项目集。
如果您担心 中某些计算的性能updateItem
,您可以将结果缓存在映射中(如果SoftReference
您担心内存消耗,可以将值包装在 s 中)。
在这种情况下,这是没有必要的,因为:
Color.web
不贵,命名的颜色,比如你使用的项目,
Map
无论如何都存储在一个地方;Color
无论将相同参数传递给 . 的频率如何,每种不同的命名颜色都只会创建一个实例Color.web
。
顺便说一句:我不建议以不能成为调用结果的方式初始化单元格updateItem
。在您的情况下,graphic
空单元格的属性不null
包括初始状态。如果您担心一致的单元格大小,最好始终保留图形并设置其可见性:
public class cell extends ListCell<String> {
private final Rectangle rect;
cell() {
super();
this.rect = new Rectangle(20,20);
setGraphic(this.rect);
}
@Override
protected void updateItem(String s, boolean empty) {
super.updateItem(s, empty);
if(empty)
rect.setVisible(false);
else {
rect.setFill(Color.web(getItem()));
rect.setVisible(true);
}
}
}
添加回答
举报