Редактор ячеек Java Swing удваивает числа E - PullRequest
1 голос
/ 06 апреля 2010

Привет, я проблема с редакторами в JTable.

У меня есть столбец, который отображает данные как 26 687 489 800,00 т. Е. Double.

Когда пользователь щелкает ячейку для редактирования данных, она отображается как -2.66874908E10.

Я хочу, чтобы данные редактировались так, как они отображаются при их отображении, например: 26 687 489 800,00 - без E10 и т. Д.

Любая помощь будет оценена.

Mike

Ответы [ 3 ]

2 голосов
/ 06 апреля 2010

Компонент, используемый в качестве редактора, полностью отличается от компонента, используемого для отображения данных (средство визуализации). Вот почему у вас есть разница в формате между ними.

Я рекомендую вам прочитать эту часть руководства по Java о добавлении собственного редактора ячеек. Вы должны добавить Форматированное текстовое поле , в которое вы бы поместили нужный вам числовой формат .

Пример:

DecimalFormat df = new DecimalFormat ("#,##0.######"); //you shouldn't need more "#" to the left
JFormattedTextField fmtTxtField = new JFormattedTextField(df);
TableCellEditor cellEditor = new DefaultCellEditor(fmtTxtField);

//This depends on how you manage your cell editors. This is for the whole table, not column specific
table.setCellEditor(cellEditor); 
2 голосов
/ 06 апреля 2010

Вам следует использовать экземпляр DecimalFormat для правильного форматирования значения при настройке редактора.

1 голос
/ 22 октября 2012

Если мы считаем, что ваш столбец класса Double, вы можете сделать следующее:

DecimalFormat df = new DecimalFormat ("#,##0.######");
JFormattedTextField fmtTxtField = new JFormattedTextField(df);
TableCellEditor cellEditor = new DefaultCellEditor(fmtTxtField);
table.setDefaultEditor(Double.class, new DefaultCellEditor(fmtTxtField));

но вам нужно перезаписать реализацию делегата по умолчанию в DefaultCellEditor. (По крайней мере в Java6)

//DEFAULT IMPLEMENTATION INSIDE THE CONSTRUCTOR
....
public DefaultCellEditor(final JTextField textField) {
    editorComponent = textField;
    this.clickCountToStart = 2;
    delegate = new EditorDelegate() {
        public void setValue(Object value) {
            textField.setText((value != null) ? value.toString() : "");
        }

        public Object getCellEditorValue() {
            return textField.getText();
        }
    };
textField.addActionListener(delegate);
}
....

//YOUR IMPLEMENTATION
public class DoublesCellEditor extends DefaultCellEditor {

    private JFormattedTextField textField;

    public DoublesCellEditor(JFormattedTextField jft) {
        super(jft);
        this.textField = jft;
        super.delegate = new EditorDelegate() {
            public void setValue(Object value) {
                textField.setValue(value != null ? ((Number) value).doubleValue() : value);
            }

            public Object getCellEditorValue() {
                Object value = textField.getValue();
                return value != null ? ((Number) value).doubleValue() : value;
            }
        };
    }
}

И вместо этого используйте:

table.setDefaultEditor(Double.class, new DoublesCellEditor(fmtTxtField));
...