Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX Tableview限制点后的位数_Java_Javafx_Tableview - Fatal编程技术网

JavaFX Tableview限制点后的位数

JavaFX Tableview限制点后的位数,java,javafx,tableview,Java,Javafx,Tableview,我有一个基于tableview的表,它由两个值填充,我接收到TroughtAPI,我只想在点后显示3位数字。使用StringConverter获取所需格式,并使用TextFieldTableCell安装它,如下所示: threeDigitColumn.setCellFactory(TextFieldTableCell.<RowModel, Double>forTableColumn(new StringConverter<Double>() { p

我有一个基于tableview的表,它由两个值填充,我接收到TroughtAPI,我只想在点后显示3位数字。

使用
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; 
        }
    }));
threeDigitColumn.setCellFactory(TextFieldTableCell.forTableColumn(新的StringConverter()){
private final NumberFormat nf=NumberFormat.getNumberInstance();
{
nf.setMaximumFractionDigits(3);
nf.setMinimumFractionDigits(3);
}
@重写公共字符串到字符串(最终双精度值){
返回nf.format(值);
}
@重写公共双精度fromString(最终字符串s){
//不需要这个,除非表格是可编辑的,如果需要,请参阅DoubleStringConverter
返回null;
}
}));

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

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

Callback cellFactory=new Callback这是我过去常做的事。找到
StringConverter
后,我发现它更干净,更易于重用。但对于OP的问题,我认为它同样有效。:-)但是只有在使用类似于
TextFieldTableCell
的东西时,才可以使用
StringConverter
,如果不使列可编辑(在这种情况下,您可能需要自定义
TextField
,以防止非数字输入),它看起来不必要地沉重,除非您实际编辑单元格,否则不会实例化任何
TextField
。另外,
StringConverter
可以在
ComboBox
ListView
等中重用。如果您可以像ComboBox一样,直接向列表和表提供
StringConverter
,则会更容易……不过,ComboBox可以工作。但需要一些调整。TextFieldTableCell.forTableColumn不需要类型。它应该是Numberformat df=DecimalFormat.getNumberInstance()@user3224416:对不起,我可能在复制/粘贴过程中出错了。。。固定的。您也可以使用@James_D的
String.format()
version。关于类型的需要,我认为这取决于Java版本。如果省略,我的IDE会抱怨。;-)@haraldK能否请您解释一下在表格可编辑时如何使用此选项?也许我用错误的关键字搜索,但我无法找到关于DoubleStringconverter的信息。如何将其与NumberFormat结合使用?Is
返回Double.valueOf(s)fromString函数中的代码是否足够?首先,它是标准JavaFXAPI的一部分。如果要编辑表,最好扩展它。OP的问题是如何只显示3位数字。要在可编辑表中使用上述类,可以使用
Double.valueOf
nf.parse.doubleValue()。