java - 编辑单元格值时以十进制格式显示数据

标签 java swing jtable

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

感谢大家的建议!

最佳答案

据我所知,这一行破坏了您的代码

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

关于java - 编辑单元格值时以十进制格式显示数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8654449/

相关文章:

java - 收款中断

java - BorderLayout 中心命令不会居中

java - 在不同类的 JPanel 之间切换

java - 在 MySQL 中创建自定义结果集

java - 为什么我的 JTable 对整数列的排序不正确?

Java从另一个线程更新jtable行

Java Swing 将字体信息吐出到标准输出

java - 在java中创建包级关联数组

java - 增加 JSpinner 上箭头的大小

java - 当数据源为 XML 时,报表中仅生成一行