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