我正在使用数据库中的一些数据创建一个tableview。为了使数据更具信息性,我想为其添加一个后缀,例如“, - ”在价格之后(作为整数)等。
现在字符串连接可以正常添加此后缀(我的列采用通用数据类型),但是tableview中的内置排序机制将开始将列排序为字符串而不是整数(或其他数据类型)。
那么,有没有办法将整数值(或任何数据类型)的后缀添加到表列并仍然保持排序机制完整?
在来到这里之前我搜索了网页,遗憾的是没有运气。
答案 0 :(得分:1)
通常使用为列实现Comparable
的值类型(如Integer
),并使用cellFactory
修改值的显示方式:
public static class Item {
private BigDecimal price;
public BigDecimal getPrice() {
return price;
}
public Item(BigDecimal price) {
this.price = price;
}
}
@Override
public void start(Stage primaryStage) {
TableView<Item> table = new TableView<>();
TableColumn<Item, BigDecimal> column = new TableColumn<>();
column.setCellValueFactory(new PropertyValueFactory<>("price"));
column.setCellFactory(new Callback<TableColumn<Item, BigDecimal>, TableCell<Item, BigDecimal>>() {
private final Font font = Font.font("monospaced");
private final BigDecimal hundred = BigDecimal.valueOf(100);
private final char decimalSeparator = DecimalFormatSymbols.getInstance().getDecimalSeparator();
@Override
public TableCell<Item, BigDecimal> call(TableColumn<Item, BigDecimal> param) {
return new TableCell<Item, BigDecimal>() {
{
setAlignment(Pos.BASELINE_RIGHT);
setFont(font);
}
@Override
protected void updateItem(BigDecimal item, boolean empty) {
super.updateItem(item, empty);
if (empty || item == null) {
setText("");
} else {
BigInteger num = item.toBigInteger();
int frac = item.movePointRight(2).abs().remainder(hundred).intValue();
String numPart = String.format("%,d", num) + decimalSeparator;
setText(numPart + (frac == 0 ? "- " : String.format("%02d", frac)));
}
}
};
}
});
table.getColumns().add(column);
table.getItems().addAll(
new Item(new BigDecimal("2")),
new Item(new BigDecimal("2.5")),
new Item(new BigDecimal("5555.99")),
new Item(new BigDecimal("123456789.77")),
new Item(new BigDecimal("22011.05")),
new Item(new BigDecimal("4211"))
);
Scene scene = new Scene(table);
primaryStage.setScene(scene);
primaryStage.show();
}
(您还可以使用自定义Comparator
作为comparator
property of TableColumn
的值来指定值的排序方式;这可用于将-
视为0
如有必要,请忽略任何组分隔符。)