java - 为什么 TableCell 的方法 updateItem() 在 JavaFX 中没有正确的行为?
问题描述
我正在尝试在 JavaFX 中构建一个程序,该程序允许我检查 TableView 中的付款列表。为此,我创建了一个类 Bill,其中包含我需要的所有数据,尤其是属性数量。金额可以是出口或入口,这由账单中的枚举类型(可以是入口或出口)确定。现在,我正在尝试覆盖 TableCell 的方法 updateItem 以将金额列的背景颜色设置为绿色(如果金额是条目)或红色(如果是出口)。
这是我的类 AmountCell 的代码,它扩展了 TableCell 并覆盖了 updateItem:
public class AmountCell extends TableCell<Bill, Float> {
@Override
protected void updateItem(Float item, boolean empty) {
super.updateItem(item, empty);
setText(item==null ? "" : String.format("%.2f", item.floatValue()));
if(item != null) {
setStyle("-fx-background-color: " + (getTableRow().getItem().getType() == Type.ENTRY ? "#93C572" : "#CC0000" ));
}
}
}
问题是当记录显示在 TableView 中时,表格的最后一个空行也是彩色的,我不明白为什么!另外,尝试调试程序,我注意到方法 updateItem 有一个奇怪的行为:它经常被无意义地调用两次。任何人都可以解释我为什么以及何时有效地调用该方法?
解决方案
updateItem
TableView
当确定单元格值已更改时调用。由于细胞被重复使用,
- 在同一单元格的生命周期内,不同的项目可能被分配给同一个单元格
- 包含项目的单元格可能会再次变空(因此,您应该确保通过重置为“空”状态来处理单元格变空的情况。)
在这种情况下,您需要在项目变为 时清除样式null
。
@Override
protected void updateItem(Float item, boolean empty) {
super.updateItem(item, empty);
setText(item == null ? "" : String.format("%.2f", item.floatValue()));
if(item == null) {
setStyle(null);
} else {
setStyle("-fx-background-color: " + (getTableRow().getItem().getType() == Type.ENTRY ? "#93C572" : "#CC0000" ));
}
}
注意:对于货币,最好使用它BigDecimal
来避免舍入问题。
推荐阅读
- scipy - Scipy.stat.gamma.ppf 返回 inf 值
- docker - 使用 Jib 和 Gitlab-CI 构建 docker 镜像
- python - 如何将 ResNet50 隐藏层与另一个模型输入连接起来?
- javascript - 如何为登陆页面创建卡通图像
- c# - 使用 tableSorter Jquery 插件对特定列进行排序
- python - 请求:Python Post Request 仅返回错误代码 400
- elasticsearch - 如何从服务器访问 ElasticSearch?
- java - 为什么这个 BigInteger 在输入 FFFFFFFF (8 F) 时显示不正确的结果
- java - 按钮单击事件以更新 Android Studio 中的 TextView。构建没有错误,但不起作用
- javascript - 如何在 HTML 网页中搜索某些字符串并使用 Javascript 设置它们的样式