TableView 中的 JavaFX 格式 SimpleLongProperty

标签 java javafx

我一直在尝试使用 JavaFX 在 TableView 中格式化 Long 值。

我有以下类来存储我想要在表格上显示的行:

    import java.text.DecimalFormat;

    import javafx.beans.property.SimpleDoubleProperty;
    import javafx.beans.property.SimpleLongProperty;
    import javafx.beans.property.SimpleStringProperty;

    public class DataByCurrencyPairRow {

        private DecimalFormat integerFormat = new DecimalFormat("#,###");

        private SimpleStringProperty currencyPair = new SimpleStringProperty("");
        private SimpleDoubleProperty shareOfTotalVolume = new SimpleDoubleProperty(0);
        private SimpleLongProperty totalVolume = new SimpleLongProperty(0);
        private SimpleLongProperty currencyBought = new SimpleLongProperty(0);
        private SimpleLongProperty currencySold = new SimpleLongProperty(0);
        private SimpleLongProperty monthlyAverage = new SimpleLongProperty(0);

        public DataByCurrencyPairRow() {
            currencyPair.set("");
            shareOfTotalVolume.set(0);
            totalVolume.set(0);
            currencyBought.set(0);
            currencySold.set(0);
            monthlyAverage.set(0);
        }

        public String getCurrencyPair() {
            return currencyPair.getValue();
        }

        public void setCurrencyPair(String currencyPair) {
            this.currencyPair.setValue(currencyPair);
        }

        public Long getMonthlyAverage() {
            return monthlyAverage.getValue();
        }

        public void setMonthlyAverage(Long monthlyAverage) {
            this.monthlyAverage.setValue(monthlyAverage);
        }

        public Long getCurrencySold() {
            return currencySold.getValue();
        }

        public void setCurrencySold(Long currencySold) {
            this.currencySold.setValue(currencySold);
        }

        public Long getCurrencyBought() {
            return currencyBought.getValue();
        }

        public void setCurrencyBought(Long currencyBought) {
            this.currencyBought.setValue(currencyBought);
        }

        public Long getTotalVolume() {      
            return totalVolume.getValue();
        }

        public void setTotalVolume(Long totalVolume) {
            this.totalVolume.setValue(totalVolume);
        }

        public Double getShareOfTotalVolume() {
            return shareOfTotalVolume.getValue();
        }

        public void setShareOfTotalVolume(Double shareOfTotalVolume) {
            this.shareOfTotalVolume.setValue(shareOfTotalVolume);
        }

    }

然后我有一个带有 initialize 方法的 Controller ,我一直在尝试重写 updateItem 方法以使表格将逗号显示为千位分隔符:

public class MainController {

    private static final String DEFAULT_TIME_HORIZON = new String("0");
    private final NumberFormat integerFormat = new DecimalFormat("#,###");


    @FXML
    TableView<DataByCurrencyPairRow> tableTransactionsByCurrencyPair;

    @FXML
    TableColumn<DataByCurrencyPairRow, Long> columnTotal;


    @FXML
    void initialize() {

        columnTotal.setCellFactory(
                new Callback<TableColumn<DataByCurrencyPairRow, SimpleLongProperty>, TableCell<DataByCurrencyPairRow, SimpleLongProperty>>() {

                    @Override
                    public TableCell<DataByCurrencyPairRow, SimpleLongProperty> call(TableColumn<DataByCurrencyPairRow, SimpleLongProperty> param
                    ) {
                        return new TableCell<DataByCurrencyPairRow, SimpleLongProperty>() {

                            @Override
                            protected void updateItem(SimpleLongProperty item, boolean empty) {
                                super.updateItem(item, empty); 
                                if (item == null || empty) {
                                    setText("0");
                                    setStyle("");
                                } else {
                                    setText(integerFormat.format(item.longValue()));
                                }
                            }

                        };
                    }
                }
        );

这是填充TableView的方法:

    public void updateByCurrencyPairTable() {
        System.out.println("#MainController: Updating data in table view Markets volumes by currency pair");

        ObservableList<DataByCurrencyPairRow> data = tableTransactionsByCurrencyPair.getItems();
        data.clear();

        // Add row items to the table view Markets volume by currency
        for (DataByCurrencyPairRow row : customer.getDataByCurrencyPairR12m().getDataByCurrencyPair()) {
            data.add(row);
        }
    }

请帮助我展示如何做到这一点!我还尝试将 updateItem 方法重写为 Long 而不是 SimpleLongProperty 并且我的 IDE 接受了代码,但数字仍然没有在表中格式化.

先谢谢大家了!!!

最佳答案

LongProperty实现ObservableValue<Number> ,不是ObservableValue<Long> (或ObservableValue<SimpleLongProperty>)。因此,您的表列需要为 TableColumn<DataByCurrencyPair, Number> 类型您的细胞工厂需要相应地匹配这些类型。

这是一个带有 Long 的格式化列的简单示例s:

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Random;

import javafx.application.Application;
import javafx.beans.property.LongProperty;
import javafx.beans.property.SimpleLongProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.scene.Scene;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.stage.Stage;

public class TableWithFormattedLong extends Application {

    private final NumberFormat integerFormat = new DecimalFormat("#,###");

    @Override
    public void start(Stage primaryStage) {
        TableView<Item> table = new TableView<>();
        TableColumn<Item, String> itemColumn = new TableColumn<>("Item");
        itemColumn.setCellValueFactory(cellData -> cellData.getValue().nameProperty());

        TableColumn<Item, Number> valueColumn = new TableColumn<>("Value");
        valueColumn.setCellValueFactory(cellData -> cellData.getValue().valueProperty());

        valueColumn.setCellFactory(tc -> new TableCell<Item, Number>() {
            @Override
            protected void updateItem(Number value, boolean empty) {
                super.updateItem(value, empty);
                if (value == null || empty) {
                    setText("");
                } else {
                    setText(integerFormat.format(value));
                }
            }
        });

        table.getColumns().add(itemColumn);
        table.getColumns().add(valueColumn);

        Random rng = new Random();

        for (int i = 1 ; i <= 20 ; i++) {
            table.getItems().add(new Item("Item "+i, rng.nextLong()));
        }

        primaryStage.setScene(new Scene(table, 600, 600));
        primaryStage.show();
    }

    public static class Item {
        private final StringProperty name = new SimpleStringProperty();
        private final LongProperty value = new SimpleLongProperty();

        public Item(String name, long value) {
            setName(name);
            setValue(value);
        }

        public final StringProperty nameProperty() {
            return this.name;
        }


        public final String getName() {
            return this.nameProperty().get();
        }


        public final void setName(final String name) {
            this.nameProperty().set(name);
        }


        public final LongProperty valueProperty() {
            return this.value;
        }


        public final long getValue() {
            return this.valueProperty().get();
        }


        public final void setValue(final long value) {
            this.valueProperty().set(value);
        }



    }

    public static void main(String[] args) {
        launch(args);
    }
}

关于TableView 中的 JavaFX 格式 SimpleLongProperty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38571211/

相关文章:

java - 使用循环用数组填充键时 HashMap 键重新调整为 null

java - 使用自定义键创建 KTable 时出错

JavaFX TextField 转 Int

validation - ControlsFX 复杂验证

java - 在 JavaFX Webview 中运行 URLConnection uc

java - 与 DBCP 连接池和线程的混淆

java - 将带有通配符泛型的集合转移到 Java 中的列表

java - 如何在 Apache Camel 中测试多个 RouteBuilder

java - 如何在 JavaFX 中换行文本

java - 在 Java 中查找 4 个复选框的有序选择