JavaFX:为 TableView 行着色并格式化单元格文本

JavaFX : Coloring TableView row and formatting the cell text

我有一个TableView(位于ScrollPane里面),其中一行如下:

tc_proj_amount.setCellValueFactory(cellData -> 
     new SimpleStringProperty(cellData.getValue().getBalance().toPlainString()));

我想为 tc_proj_amount 为负数的整行着色。为此,我使用这个:

tc_proj_amount.setCellFactory(column -> new TableCell<Transaction, String>() {
            @Override
            protected void updateItem(String item, boolean empty) {
                super.updateItem(item, empty);

                if (item == null || empty) {
                    setText(null);

                } else {

                    setText(item);

                    // Style row where balance < 0 with a different color.
                    BigDecimal balance = new BigDecimal(item);
                    if (balance.compareTo(BigDecimal.valueOf(0)) < 0) {
                        TableRow currentRow = getTableRow();
                        currentRow.setStyle("-fx-background-color: tomato;");

                    }
                }
            }
        });

当我 运行 我的应用程序时,行会根据需要着色,但是当我向上滚动列表时,越来越多的行会变色,即使 tc_proj_amount 不是负数。当我尝试对列进行排序时,所有行都会变色。我该如何解决这个问题?

第二题。我想以某种方式格式化 tc_proj_amount 的值。为此,我这样做了:

DecimalFormat df = new DecimalFormat("#,###.00");
tc_proj_amount.setCellValueFactory(cellData -> 
 new SimpleStringProperty(df.format(cellData.getValue().getBalance()).toString()));

改变行颜色的部分同上。在这种情况下,我收到一个例外。我该如何解决?

Exception in thread "JavaFX Application Thread" java.lang.NumberFormatException

异常指向行被着色的部分。

我相信您的第一个问题已经在这里得到解答:

总而言之,滚动时单元格会被破坏并重新创建,并间接破坏您的颜色变化。

1) 覆盖 updateItem() 方法的经验法则是处理所有逻辑分支情况。就像 setText() 对于项目为空和非空的情况一样,您需要在余额>=0 时设置颜色(即 "else" 的情况)。将来,您可能会使用 css 选择器而不是内联样式,因此常见的方法是:

if(condition)
    item.getStyleClass().add("css");
else
    item.getStyleClass().remove("css");

2) 你已经有一个cellFactory,在里面格式化文本,不需要cellValueFactory。

setText(df.format(item));