2011-07-02 17 views
6

Tam 2 ondalık basamağa sahip jTable'da sayıları göstermem gerekiyor. Bir nokta ondalık noktası olarak kullanılan İngilizce yereli için Bu hücre düzenleyici mükemmel çalışırJTablo hücre editörü sayı biçimi

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

: Bunu gerçekleştirmek için ben gibi özel bir hücre editörü oluşturduk. Fakat Almanca yerel ayarında, virgülle değerleri ondalık nokta olarak kabul etmez. Lütfen kodumda bir sorun olduğunda bana bildirin. Şimdiden teşekkürler.

DÜZENLEME:

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

ile #,###,###,##0.00 değiştirin. Bunu gönderdiğiniz için teşekkürler! –

cevap

7

avantaj yerel kullanın deneyin:

//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))); 
İşte çalışma var nasıl
+1

+1 tam olarak ne önereceğim. – StanislavL

+0

@StanislavL, defalut tarafından tüm günümüzün yerel işletim sistemine dönmek için Locale for JComponents yerel ayarını bir kez ayarlamanız gerekti mi? – mKorbel

+0

Kodumu yukarıdaki bloğa göre değiştirdim, ancak hala sorunla karşı karşıyayım. Çift tıklandığında düzenleme alanı, yerel olarak bilinmeyen biçimde doğru değeri gösterir (Almanca yerel ayarı için virgül virgülünü gösterir), ancak ondalık nokta olarak virgülle düzenlenmiş bir değeri kabul etmez (yalnızca eski değeri gösterirken dışa aktarma gerektirmeyen bir noktaya düzenlemeye çalışın) –

2

örnek

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

için

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

Sadece Sorunuzu yüksek oyu kadar zaten var, ama ben bu yüzden tekrar yapmak isterdim #.###.###.##0,00