JavaFX:为tableview数据添加后缀并维护正确的排序

时间:2017-04-09 09:03:06

标签: java javafx tableview

我正在使用数据库中的一些数据创建一个tableview。为了使数据更具信息性,我想为其添加一个后缀,例如“, - ”在价格之后(作为整数)等。

现在字符串连接可以正常添加此后缀(我的列采用通用数据类型),但是tableview中的内置排序机制将开始将列排序为字符串而不是整数(或其他数据类型)。

那么,有没有办法将整数值(或任何数据类型)的后缀添加到表列并仍然保持排序机制完整?

在来到这里之前我搜索了网页,遗憾的是没有运气。

1 个答案:

答案 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如有必要,请忽略任何组分隔符。)