【问题标题】:JavaFX Tableview limit the number of digits after pointJavaFX Tableview 限制点后的位数
【发布时间】:2014-06-26 15:26:51
【问题描述】:

我有一个基于 tableview 的表格,它由我收到的 trougth API 的双值填充,我想在点之后只显示 3 位数字。

【问题讨论】:

    标签: java javafx tableview


    【解决方案1】:

    使用StringConverter 获取所需格式并安装它,使用TextFieldTableCell 如下:

        threeDigitColumn.setCellFactory(TextFieldTableCell.<RowModel, Double>forTableColumn(new StringConverter<Double>() {
            private final NumberFormat nf = NumberFormat.getNumberInstance();
    
            {
                 nf.setMaximumFractionDigits(3);
                 nf.setMinimumFractionDigits(3);
            }
    
            @Override public String toString(final Double value) {
                return nf.format(value);
            }
    
            @Override public Double fromString(final String s) {
                // Don't need this, unless table is editable, see DoubleStringConverter if needed
                return null; 
            }
        }));
    

    【讨论】:

    • 有效。但需要一些调整。 TextFieldTableCell.forTableColumn 不需要类型。它应该是 Numberformat df = DecimalFormat.getNumberInstance();
    • @user3224416:抱歉,我可能在复制/粘贴过程中犯了一个错误……已修复。您也可以使用@James_D 的String.format() 版本。关于类型的需求,我认为这取决于 Java 版本。如果省略,我的 IDE 会抱怨。 ;-)
    • @haraldK 您能否解释一下当表格可编辑时如何使用它?也许我正在使用错误的关键字进行搜索,但我无法找到有关该 DoubleStringconverter 的信息。如何将它与 NumberFormat 结合使用? return Double.valueOf(s); 在 fromString 函数中够用吗?
    • 首先,DoubleStringConverter 是标准 JavaFX API 的一部分。如果您想编辑表格,最好扩展它。 OP 的问题是如何只显示 3 位数字。要在可编辑表中使用上述类,您可以使用Double.valueOf(s)nf.parse(s).doubleValue()
    【解决方案2】:

    在表格列上使用自定义单元工厂:

    Callback<TableColumn<S, Double>, TableCell<S, Double>> cellFactory = new Callback<TableColumn<S, Double>, TableCell<S, Double>() {
        @Override
        public TableCell<S, Double> call(TableColumn<S, Double> col) {
            return new TableCell<S, Double>() {
                @Override
                public void updateItem(Double value, boolean empty) {
                    super.updateItem(value, empty) ;
                    if (value==null) {
                        setText(null);
                    } else {
                        setText(String.format("%.3f", value.doubleValue()));
                    }
                }
            };
        }
    }
    tableCol.setCellFactory(cellFactory);
    

    (将S 替换为表的数据类型)。

    【讨论】:

    • 这是我以前做的。在我找到StringConverter 之后,我发现它更干净、更可重用。但是对于 OP 的问题,我认为它同样有效。 :-)
    • 但是你只能使用StringConverter 如果你使用TextFieldTableCell 之类的东西,如果你没有使列可编辑,这似乎不必要地繁重(在这种情况下,你可能会无论如何都想要一个自定义TextField,以防止非数字输入)。
    • 我认为它不一定更重,因为除非您实际编辑单元格,否则不会实例化 TextField。此外,StringConverter 可以在ComboBoxListView 等中重复使用。如果您可以直接向列表和表格提供StringConverter 会更容易,就像您可以使用组合框一样...跨度>
    猜你喜欢
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    相关资源
    最近更新 更多