Отображать данные в десятичном формате при редактировании значения ячейки - PullRequest
1 голос
/ 28 декабря 2011

при редактировании значения ячейки в 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;
    }
}

СПАСИБО всем за советы!

Ответы [ 2 ]

3 голосов
/ 28 декабря 2011

здесь SSCCE, который продемонстрировал проблему с Double (и также реализует 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() {
    }
}
2 голосов
/ 28 декабря 2011

Насколько я вижу эту строку, которая нарушает ваш код

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

это происходит в javax.swing.DefaultCellEditor # DefaultCellEditor, который используется JTable.

Вам нужно будет добавить свой собственный редактор, который применяет форматирование.

тоже должно быть похоже

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;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...