当前位置: 首页 > 知识库问答 >
问题:

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

濮阳景天
2023-03-14

我正在用数据库中的一些数据创建一个tableview。为了使数据更加翔实,我想在其上添加一个后缀,例如,在price(作为整数)之后添加“,-”等。

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

那么,是否有一种方法可以将后缀添加到表列的整数值(或任何数据类型),同时保持排序机制不变呢?

我来这里之前在网上搜索了一下,可惜没有任何运气。

共有1个答案

罗昊空
2023-03-14

通常,您使用为列实现carable(就像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();
}

(您还可以使用自定义比较器作为TableColumncomparator属性的值,以指定如何对值进行排序;如果需要,可以将-视为0并忽略任何组分隔器。)

 类似资料:
  • 我的TableView没有更新,我需要一个监听器吗?(m是我的模型) 在一个新的阶段,我在我的模型列表中添加了一些Mitarbeiter 但是另一个阶段的TableView没有更新新数据。最后,观察列表不是指向模型中的ArrayList吗?

  • 现在有几个关于“如何将数据从数据库添加到TableView”的答案,我只将其中一个链接起来,因为它们几乎都是重复的。 我感觉使用使数据库变得毫无用处,因为最后,我再次在中获得了所有内容。 有没有什么方法可以在不使用s的情况下填充表,就像上面的答案所描述的那样?

  • 我对JavaFX还很陌生。我已经无望地试图让它工作了这么长时间,但不知道为什么它不起作用。项不显示在TableView上。我使用scene Builder创建了UI。我看过很多类似的问题,似乎没有什么帮助。 简化为最小代码: 主: 控制器: Person类: FXML: 多谢了。

  • 我在javaFX开发应用程序。我想在桌面上显示json的反应。我不知道怎么做 我的档案如下: 项目。fxml 项目控制器 我在中得到json响应,我想在表视图中显示它。 我不知道如何将json绑定到表视图。 我可以将json转换为数组。 但是,tableview的方法要求使用观测列表。 因此,任何建议和例子都将受到高度重视。

  • 我有一个表视图,它有一个附加到它的自定义类对象的可观察列表(类类型:SalesInvoiceNetSale)。数据都在表中显示良好。可观察列表中的最后一项是总计行(类类型:SalesInvoiceNetSaleTotal,它扩展了SalesInvoiceNetSale类)。我只是希望如果用户尝试按列对表进行排序,我的表不会对数组中的最后一条记录进行排序。我发现了另一个帖子,几乎是在问如何做同样的事

  • 有人能告诉我一种为javafx tableview实现确保可见例程的方法吗?我花了几个小时研究,但什么也没找到。谢谢