为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 TableCell 的方法 updateItem() 在 JavaFX 中没有正确的行为?

为什么 TableCell 的方法 updateItem() 在 JavaFX 中没有正确的行为?

噜噜哒 2021-08-25 15:30:34
我正在尝试在 JavaFX 中构建一个程序,该程序允许我检查 TableView 中的付款列表。为此,我创建了一个 Bill 类,其中包含我需要的所有数据,尤其是属性数量。金额可以是退出或进入,这由 Bill 中的枚举类型确定(可以是 ENTRY 或 EXIT)。现在,我试图覆盖 TableCell 的方法 updateItem 以将金额列的背景颜色设置为绿色(如果金额是条目)或红色(如果它是出口)。这是我的 AmountCell 类的代码,它扩展了 TableCell 并覆盖了 updateItem:public class AmountCell extends TableCell<Bill, Float> {@Overrideprotected 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 有一个奇怪的行为:它经常被无意义地调用两次。任何人都可以解释我为什么以及何时有效调用该方法?
查看完整描述

1 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

updateItemTableView确定单元格值已更改时调用。由于细胞被重复使用,

  • 不同的项目可能会在其生命周期中分配给同一个单元格

  • 包含项目的单元格可能会再次变空(因此,您应该确保通过重置为“空”状态来处理单元格变空的情况。)

在这种情况下,您需要在项目变为 时清除样式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以避免舍入问题。


查看完整回答
反对 回复 2021-08-25
  • 1 回答
  • 0 关注
  • 451 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信