Java JTable单元格编辑器编号格式
我需要在jTable中显示数字,精确到小数点后2位。为此,我创建了一个自定义单元编辑器,如下所示:Java JTable单元格编辑器编号格式,java,swing,jtable,number-formatting,tablecelleditor,Java,Swing,Jtable,Number Formatting,Tablecelleditor,我需要在jTable中显示数字,精确到小数点后2位。为此,我创建了一个自定义单元编辑器,如下所示: public class NumberCellEditor extends DefaultCellEditor { public NumberCellEditor(){ super(new JFormattedTextField()); } public Component getTableCellEditorComponent(JTable table,
public class NumberCellEditor extends DefaultCellEditor {
public NumberCellEditor(){
super(new JFormattedTextField());
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
JFormattedTextField editor = (JFormattedTextField) super.getTableCellEditorComponent(table, value, isSelected, row, column);
if (value!=null){
DecimalFormat numberFormat = new DecimalFormat("#,##0.00;(#,##0.00)");
editor.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.NumberFormatter(numberFormat)));
Number num = (Number) value;
String text = numberFormat.format(num);
editor.setHorizontalAlignment(SwingConstants.RIGHT);
editor.setText(text);
}
return editor;
}
}
此单元格编辑器非常适合使用点作为小数点的英语区域设置。但在德语语言环境中,它不接受以逗号作为小数点的值。请让我知道我的代码中哪里有问题。提前谢谢
编辑:
以下是我如何让它工作的:
public class NumberCellEditor extends DefaultCellEditor {
public NumberCellEditor(){
super(new JFormattedTextField());
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
JFormattedTextField editor = (JFormattedTextField) super.getTableCellEditorComponent(table, value, isSelected, row, column);
if (value instanceof Number){
Locale myLocale = Locale.getDefault();
NumberFormat numberFormatB = NumberFormat.getInstance(myLocale);
numberFormatB.setMaximumFractionDigits(2);
numberFormatB.setMinimumFractionDigits(2);
numberFormatB.setMinimumIntegerDigits(1);
editor.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(
new NumberFormatter(numberFormatB)));
editor.setHorizontalAlignment(SwingConstants.RIGHT);
editor.setValue(value);
}
return editor;
}
@Override
public boolean stopCellEditing() {
try {
// try to get the value
this.getCellEditorValue();
return super.stopCellEditing();
} catch (Exception ex) {
return false;
}
}
@Override
public Object getCellEditorValue() {
// get content of textField
String str = (String) super.getCellEditorValue();
if (str == null) {
return null;
}
if (str.length() == 0) {
return null;
}
// try to parse a number
try {
ParsePosition pos = new ParsePosition(0);
Number n = NumberFormat.getInstance().parse(str, pos);
if (pos.getIndex() != str.length()) {
throw new ParseException(
"parsing incomplete", pos.getIndex());
}
// return an instance of column class
return new Float(n.floatValue());
} catch (ParseException pex) {
throw new RuntimeException(pex);
}
}
}
比如说
import java.text.NumberFormat;
import java.math.RoundingMode;
import javax.swing.table.DefaultTableCellRenderer;
public class SubstDouble2DecimalRenderer extends DefaultTableCellRenderer {
private static final long serialVersionUID = 1L;
private int precision = 0;
private Number numberValue;
private NumberFormat nf;
public SubstDouble2DecimalRenderer(int p_precision) {
super();
setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
precision = p_precision;
nf = NumberFormat.getNumberInstance();
nf.setMinimumFractionDigits(p_precision);
nf.setMaximumFractionDigits(p_precision);
nf.setRoundingMode(RoundingMode.HALF_UP);
}
public SubstDouble2DecimalRenderer() {
super();
setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
nf = NumberFormat.getNumberInstance();
nf.setMinimumFractionDigits(2);
nf.setMaximumFractionDigits(2);
nf.setRoundingMode(RoundingMode.HALF_UP);
}
@Override
public void setValue(Object value) {
if ((value != null) && (value instanceof Number)) {
numberValue = (Number) value;
value = nf.format(numberValue.doubleValue());
}
super.setValue(value);
}
}
试一试
使用区域设置对您有利:
//Locale myLocale = Locale.GERMANY; //... or better, the current Locale
Locale myLocale = Locale.getDefault(); // better still
NumberFormat numberFormatB = NumberFormat.getInstance(myLocale);
numberFormatB.setMaximumFractionDigits(2);
numberFormatB.setMinimumFractionDigits(2);
numberFormatB.setMinimumIntegerDigits(1);
edit.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(
new NumberFormatter(numberFormatB)));
只要用
,#######################################################。在双击时,编辑字段以区域感知格式正确显示值(它显示逗号为德语区域的小数点),但它不接受以逗号为小数点的编辑值(当我们试图将其编辑为包含逗号的东西时)。一个小的可编译且可运行的程序,不需要外部资源(例如图像或数据库),它可以演示您的问题,然后将其作为问题的编辑发布。通过覆盖DefaultCellEditor中的getCellEditorValue和stopEditing方法,我已经成功地使它工作得很好。@雕像:恭喜!!我很想看到你成功的单元格编辑器代码。你能帮我们贴出来吗?我已经对你的问题投了赞成票,但我希望我能再投一次。谢谢你的发帖!
//Locale myLocale = Locale.GERMANY; //... or better, the current Locale
Locale myLocale = Locale.getDefault(); // better still
NumberFormat numberFormatB = NumberFormat.getInstance(myLocale);
numberFormatB.setMaximumFractionDigits(2);
numberFormatB.setMinimumFractionDigits(2);
numberFormatB.setMinimumIntegerDigits(1);
edit.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(
new NumberFormatter(numberFormatB)));