【问题标题】:Why doesn't TableCell's method updateItem() have the correct behaviour in JavaFX?为什么 TableCell 的方法 updateItem() 在 JavaFX 中没有正确的行为?
【发布时间】:2018-09-01 15:25:38
【问题描述】:

我正在尝试在 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 有一个奇怪的行为:它经常被无意义地调用两次。任何人都可以解释为什么以及何时有效地调用该方法?

【问题讨论】:

    标签: java tableview overriding javafx-8


    【解决方案1】:

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

    • 不同的项目可能会在其生命周期内分配给同一个单元格
    • 包含项目的单元格可能再次变为空(因此,您应确保通过重置为“空”状态来处理单元格变为空的情况。)

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

    【讨论】:

      猜你喜欢
      • 2019-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-11
      • 2019-06-27
      • 2016-06-01
      • 1970-01-01
      相关资源
      最近更新 更多