Jtable с точностью до двойной ячейки

Я должен сделать один из своих столбцов в JTable, который имеет тип double, чтобы получать только числа и округлять все с точностью до 2. Не только для того, чтобы показывать их с этой точностью, но и вместо этого записывать число в данные с точностью до 2. На самом деле, если я напишите 2.456, он должен написать 2.46 в ячейке и в данных. Как лучше всего это сделать? С пользовательским средством визуализации ячеек или с помощью пользовательского редактора ячеек? У меня есть этот код, но он не меняет данные, он показывает только правильные данные в ячейке

public class DoubleCellRenderer extends DefaultTableCellRenderer {

int precision = 0;
Number numberValue;
NumberFormat nf;

public DoubleCellRenderer(int aPrecision) {
    super();
    precision = aPrecision;
    setHorizontalAlignment(SwingConstants.RIGHT);
    nf = NumberFormat.getNumberInstance();
    nf.setMinimumFractionDigits(aPrecision);
    nf.setMaximumFractionDigits(aPrecision);
}

@Override
public void setValue(Object value) {
    if ((value != null) && (value instanceof Number)) {
        numberValue = (Number) value;
        value = nf.format(numberValue.doubleValue());
    }
    super.setValue(value);
}


}

person user1761818    schedule 08.11.2012    source источник
comment
JTable имеет два состояния: Renderer и Editor. Renderer предназначен для форматирования хранилищ значений в XxxTableModel и ничего больше. значение хранится в XxxTableModel   -  person mKorbel    schedule 09.11.2012


Ответы (3)


Вы должны использовать оба.

CellRenderer: как отображаются данные (что вы собираетесь показывать)

CellEditor: как редактируются данные (в конце концов, вы можете выбрать, какое значение установить в своей модели)

В обоих случаях вы можете выбрать точность. Дополнительную информацию см. здесь: http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#editrender

Примечание. Я бы рекомендовал переопределить getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column), чем setValue(Object value).

person Guillaume Polet    schedule 08.11.2012
comment
но я хочу отображать данные другим способом их редактирования. Так не лучше ли использовать только редактор? - person user1761818; 09.11.2012
comment
@user1761818 user1761818 Редактор — это только то, как вы редактируете данные. Одновременно можно редактировать только одну ячейку, поэтому все остальные визуализируются с помощью TableCellRender. - person Guillaume Polet; 09.11.2012
comment
но я могу заполнить только одну ячейку за раз, так что это хорошо. Я просто хочу, чтобы, когда я ввожу двойное число с точностью более 2, оно сохранялось как число с точностью до двух. Что делать? редактор или рендер и какой метод переопределить - person user1761818; 09.11.2012
comment
@ user1761818 Вы смешиваете две разные концепции. Эти два класса предназначены для разных целей. Это не вопрос выбора (выбрать одно или другое?). Один отвечает за то, как отображать данные (например, ваши данные 2.123456, а вы хотите показывать только 2.12), другой отвечает за то, как данные можно редактировать (например, пользователь вводит 2.569874, а вы будете хранить только 2.57) - person Guillaume Polet; 09.11.2012

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

В этом случае вам нужен только специальный редактор для округления значения перед его сохранением в вашей модели. Переопределите/настройте getCellEditorValue() метод для выполнения необходимого округления входного значения

person Robin    schedule 08.11.2012

Я согласен с Гийомом использовать оба. Вот ссылка с хорошей реализацией средства визуализации, которое использует переопределение getTableCellRendererComponent, упомянутое в другом ответе.

http://helpdesk.objects.com.au/java/how-to-control-decimal-places-displayed-in-jtable-column

Я немного изменил его, чтобы обеспечить 3 цифры только при округлении. Также добавлена ​​проверка, чтобы убедиться, что тип данных является двойным

public static class DecimalFormatRenderer extends DefaultTableCellRenderer {
    private static final long serialVersionUID = 1L;
    private static final DecimalFormat formatter = new DecimalFormat( "#.###" );

    public DecimalFormatRenderer(){
        super();
        formatter.setMinimumFractionDigits(3);
    }

    public Component getTableCellRendererComponent(
        JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                    // First format the cell value as required

        if(value instanceof Double){
            value = formatter.format((Number)value);
        }

        return super.getTableCellRendererComponent(
            table, value, isSelected, hasFocus, row, column );
    } 
}
person pbible    schedule 16.12.2013