【发布时间】:2014-06-26 15:26:51
【问题描述】:
我有一个基于 tableview 的表格,它由我收到的 trougth API 的双值填充,我想在点之后只显示 3 位数字。
【问题讨论】:
我有一个基于 tableview 的表格,它由我收到的 trougth API 的双值填充,我想在点之后只显示 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;
}
}));
【讨论】:
String.format() 版本。关于类型的需求,我认为这取决于 Java 版本。如果省略,我的 IDE 会抱怨。 ;-)
return Double.valueOf(s); 在 fromString 函数中够用吗?
Double.valueOf(s) 或nf.parse(s).doubleValue()。
在表格列上使用自定义单元工厂:
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 可以在ComboBox、ListView 等中重复使用。如果您可以直接向列表和表格提供StringConverter 会更容易,就像您可以使用组合框一样...跨度>