【问题标题】:JavaFX : Coloring TableView row and formatting the cell textJavaFX:着色 TableView 行并格式化单元格文本
【发布时间】:2015-11-12 07:27:44
【问题描述】:

我有一个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

异常指向行着色的部分。

【问题讨论】:

  • 对于第一部分,看起来您没有阅读other question Btw 接受答案的更新,最好不要将单独的问题混为一谈(格式与颜色无关)。 .

标签: javafx tableview javafx-8


【解决方案1】:

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

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

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

setText(df.format(item));

【讨论】:

  • 对于第一部分,我只需要添加 else currentRow.setStyle("");对于第二部分,我明白了。应该是 setText(df.format(balance).toString());
  • @sher 重复:第一部分已经在你的最后一个问题中得到回答...... ;-)
  • @kleopatra,我看到了。您不必重复)
【解决方案2】:

相信您的第一个问题已经在这里得到解答:https://stackoverflow.com/a/12425646

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

【讨论】:

  • 嗯,我已经看到它被破坏了。问题是如何解决它。那篇文章没有回答我的问题
猜你喜欢
  • 2017-02-07
  • 2016-05-05
  • 1970-01-01
  • 1970-01-01
  • 2015-02-01
  • 2017-01-04
  • 2017-04-30
  • 2018-12-25
  • 2019-09-30
相关资源
最近更新 更多