2011-12-28 124 views
1

在JTable中编辑单元格值时,它的值突然以指数形式出现(即1.7E10),而不是以普通的用户友好形式显示。在编辑单元格值时编辑单元格值时显示十进制格式的数据

如何在编辑单元格值时更改数字格式?

...

的解决方案是非常简单的,必须建立自己的TableCellEditor的那样:

public static class Double2DecimalEditor extends AbstractCellEditor implements TableCellEditor{ 

    private static final long serialVersionUID = 1L; 
    private JComponent component = new JTextField(); 
    private NumberFormat nf; 

    @Override 
    public Object getCellEditorValue() { 
     System.out.println("getCellEditorValue"); 
     NumberFormat nf = new DecimalFormat("#,###.###"); 
     String text = ((JTextField)component).getText(); 
     System.out.println("TEXT = " + ((JTextField)component).getText()); 
     return nf.format(Double.parseDouble(text)); 
    } 

    @Override 
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { 
     System.out.println("getCellEditorComponent"); 
     Double data = Double.valueOf(value.toString().replace(",", "")); 
     NumberFormat nf = new DecimalFormat("#.###"); 
     ((JTextField)component).setText(nf.format(data)); 
     ((JTextField)component).setHorizontalAlignment(SwingConstants.RIGHT); 
     return component; 
    } 
} 

感谢所有的建议!

+0

如果我理解你正确的号码显示在一个用户友好的形式和_while进入data_中它是改变了吗?如:当我有170000000并增加一个零时,数据被重新格式化为1.7E9?如果是这样,你能显示一些代码吗?你是否将格式设置应用于编辑时输入数据的文本框/微调框? – Thomas 2011-12-28 10:15:11

+0

是你是对的,在情况下,如果人数有那么9位数字,当我在一个单元格上双击来编辑它的值显示像1.2E10而不是12000000000. 唯一格式应用是: 公共静态class NumberEditor extends STableCellEditor public NumberEditor(){ ((JTextField)getComponent())。setHorizo​​ntalAlignment(JTextField.RIGHT); } } – sergpank 2011-12-28 10:27:36

回答

2

至于我看到了这条线,打破你的代码

textField.setText((value != null) ? value.toString() : ""); 

这发生在JTable使用的javax.swing.DefaultCellEditor#DefaultCellEditor中。

您将不得不添加自己的应用格式编辑器。

应该是相似的太

table.setDefaultEditor(Double.class, new DefaultCellEditor(new JTextField()) 
    { 
     public Component getTableCellEditorComponent(JTable table, Object value, 
                boolean isSelected, 
                int row, int column) 
     { 
     String formattedvalue = formatyourvalue(value); 
     delegate.setValue(formattedvalue); 
     return editorComponent; 
     } 
    }); 

应用到你改变的例子中makeTable与

private static JTable makeSampleTable() 
    { 
    String[] columnNames = {"String", "Integer", "Boolean", "Double"}; 
    Object[][] data = {{"AAA", 12, true, 111111111111.15}, 
         {"BBB", 1, false, 11199999111.15}, {"CCC", 2, true, 1155555511111.15},}; 
    DefaultTableModel m = new DefaultTableModel(data, columnNames) 
    { 

     private static final long serialVersionUID = 1L; 

     @Override 
     public Class<?> getColumnClass(int column) 
     { 
     return getValueAt(0, column).getClass(); 
     } 
    }; 
    JTable table = new JTable(m); 
    TableColumnModel tm = table.getColumnModel(); 
    tm.getColumn(3).setCellRenderer(new Double2DecimalRenderer()); 
    table.setDefaultEditor(Double.class, new DefaultCellEditor(new JTextField()) 
    { 
     public Component getTableCellEditorComponent(JTable table, Object value, 
                boolean isSelected, 
                int row, int column) 
     { 
     NumberFormat nf; 
     nf = NumberFormat.getNumberInstance(); 
     nf.setMinimumFractionDigits(2); 
     nf.setMaximumFractionDigits(2); 
     if ((value != null) && (value instanceof Number)) 
      { 
      Number numberValue = (Number) value; 
      delegate.setValue(nf.format(numberValue.doubleValue())); 
      } 
     else 
      { 
      delegate.setValue(value); 
      } 
     return editorComponent; 
     } 
    }); 
    return table; 
    } 
+0

谢谢,这是必要的解决方案。 – sergpank 2011-12-28 13:40:22

3

这里是SSCCE这证明问题与双(和器具NumberRenderer太),

enter image description here

只是我的好奇心,我留下来回答这个问题,也许是/是更好的解决办法,如果有任何存在

import java.awt.*; 
import java.math.RoundingMode; 
import java.text.NumberFormat; 
import javax.swing.*; 
import javax.swing.table.*; 

public class Back2DefaultSortingTest { 

    private static JTable makeSampleTable() { 
     String[] columnNames = {"String", "Integer", "Boolean", "Double"}; 
     Object[][] data = {{"AAA", 12, true, 111111111111.15}, 
      {"BBB", 1, false, 11199999111.15}, {"CCC", 2, true, 1155555511111.15},}; 
     DefaultTableModel m = new DefaultTableModel(data, columnNames) { 

      private static final long serialVersionUID = 1L; 

      @Override 
      public Class<?> getColumnClass(int column) { 
       return getValueAt(0, column).getClass(); 
      } 
     }; 
     JTable table = new JTable(m); 
     TableColumnModel tm = table.getColumnModel(); 
     tm.getColumn(3).setCellRenderer(new Double2DecimalRenderer()); 
     return table; 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    public static void createAndShowGUI() { 
     JPanel p = new JPanel(new BorderLayout()); 
     p.add(new JScrollPane(makeSampleTable())); 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.getContentPane().add(p); 
     frame.setSize(320, 240); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static class Double2DecimalRenderer extends DefaultTableCellRenderer { 

     private static final long serialVersionUID = 1L; 
     private int precision = 0; 
     private Number numberValue; 
     private NumberFormat nf; 

     public Double2DecimalRenderer() { 
      super(); 
      setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); 
      precision = 0; 
      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); 
     } 
    } 

    private Back2DefaultSortingTest() { 
    } 
} 
+0

是的问题是完全一样,你已经澄清和特别感谢截图..不知道如何解决这个问题.. – sergpank 2011-12-28 11:22:57

相关问题