为什么';t表细胞';s方法updateItem()在JavaFX中的行为是否正确?

为什么';t表细胞';s方法updateItem()在JavaFX中的行为是否正确?,java,tableview,overriding,javafx-8,Java,Tableview,Overriding,Javafx 8,我正在尝试用JavaFX构建一个程序,允许我在TableView中检查付款列表。为此,我创建了一个类账单,其中包含我需要的所有数据,特别是属性amount。金额可以是一个出口或一个入口,这由账单中的枚举类型(可以是入口或出口)设置。 现在,我试图覆盖TableCell的updateItem方法,将金额列的背景色设置为绿色(如果金额是条目),或红色(如果金额是出口) 这是我为AmountCell类编写的代码,该类扩展了TableCell并覆盖了updateItem: public class Am

我正在尝试用JavaFX构建一个程序,允许我在TableView中检查付款列表。为此,我创建了一个类账单,其中包含我需要的所有数据,特别是属性amount。金额可以是一个出口或一个入口,这由账单中的枚举类型(可以是入口或出口)设置。 现在,我试图覆盖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" ));
    }
}
}
公共类AmountCell扩展了TableCell{
@凌驾
受保护的void updateItem(浮动项,布尔值为空){
super.updateItem(项,空);
setText(item==null?”:String.format(“%.2f”,item.floatValue());
如果(项!=null){
setStyle(“-fx背景色:+(getTableRow().getItem().getType()==Type.ENTRY?”);
}
}
}

问题是,当记录显示在TableView中时,表的最后一个空行也会被着色,我不明白为什么!另外,在调试程序时,我注意到updateItem方法有一个奇怪的行为:它经常被nosense调用两次。任何人都可以向我解释有效调用该方法的原因和时间?

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
来避免舍入问题