2011-07-02 9 views
6

jTable에 소수점 이하 2 자리 숫자를 표시해야합니다. 점은 소수점으로 사용되는 영어 로케일이 셀 에디터가 완벽하게 작동JTable 셀 편집기 숫자 형식

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); 
    } 
} 
} 
+1

#,###,###,##0.00을 변경합니다. 게시 해 주셔서 감사합니다! –

답변

7

이 당신의 이점에 로케일을 사용하십시오 :

//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))); 
여기 내가 일하고 그것을 가지고 어떻게
+1

정확히 내가 제안 할 +1. – StanislavL

+0

@StanislavL 한 번만 JComponents의 Locale을 로캘로 설정해야합니다. – mKorbel

+0

위의 블록에 따라 코드가 변경되었지만 여전히 문제가 있습니다. 두 번 클릭하면 편집 필드의 값이 로케일 인식 형식 (독일어 로켈의 경우 소수점으로 쉼표로 표시)으로 올바르게 표시되지만 쉼표를 소수점으로 사용하는 편집 된 값은 허용되지 않습니다 (이전 값을 표시 할 때 –

2

예를

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

에 대한

DecimalFormat numberFormat = new DecimalFormat("\\d*([\\.,\\,]\\d{0,2})?"); 
0

그냥 내가 질문을-투표까지 이미했습니다,하지만 난 그렇게 다시 할 수 있으면 좋겠다 #.###.###.##0,00