jTableに小数点以下2桁の数値を表示する必要があります。これを実現するために、次のようにカスタムセルエディタを作成しました。
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);
}
}
}