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

时间:2015-08-19 06:28:47

标签: javafx tableview javafx-8

我是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

异常指向行着色的部分。

2 个答案:

答案 0 :(得分:0)

我相信您的第一个问题已在此处得到解答:https://stackoverflow.com/a/12425646

总之,滚动时细胞被破坏并重新创建,间接破坏了颜色变化。

答案 1 :(得分:0)

1)覆盖 <div class="article-container"> <div class="article"> <div class="article-child">views 10</div> </div> <div class="article"> <div class="article-child">views 9</div> </div> <div class="article"> <div class="article-child">views 5</div> </div> <div class="article"> <div class="article-child">views 3</div> </div> <div class="article"> <div class="article-child">views 1</div> </div> </div> 方法时的经验法则是处理所有逻辑分支的情况。对于项目空和非空案例,就像updateItem()一样,您需要在余额&gt; = 0时设置颜色(即&#34;否则&#34;情况)。将来,您可能会使用css选择器而不是内联样式,因此常见的方法是:

setText()

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

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