TableView中的JavaFX格式SimpleLongProperty

时间:2016-07-25 15:01:41

标签: java javafx

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

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

    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方法的控制器,我一直试图覆盖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接受了代码,但数字未在表格中格式化。

提前谢谢你们!

2 个答案:

答案 0 :(得分:3)

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);
    }
}

答案 1 :(得分:0)

无需设置Cellfactory,只需设置CellValueFactory。

TableColumn<DataByCurrencyPairRow, String> columnTotal;
columnTotal.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<DataByCurrencyPairRow,String>, ObservableValue<String>>() {

            @Override
            public ObservableValue<String> call(CellDataFeatures<DataByCurrencyPairRow, String> param) {
                DataByCurrencyPairRow value = param.getValue();
                return new ReadOnlyStringWrapper(NumberFormat.getNumberInstance(Locale.US).format(123123)); //replace the number with the calculated total
            }
        });