Использование DefaultTableCellRenderer для указания класса столбца в JTable

Я пытаюсь использовать DefaultTableCellRenderer для форматирования столбца в JTable. Например: если пользователь вводит:

20140914

Это будет формат:

2014-09-14

Мой код следующий:

    //Setting data type for each class
    //This is a method within the DefaultTableModel
    public Class getColumnClass(int col)
    {

        if (col == 0)
            return DateRenderer.class;
        if (col == 1 || col == 2)
            return String.class;
        else 
            return Double.class;


    }

//This is a separate class that I have problem with:
static class DateRenderer extends DefaultTableCellRenderer
{

    //Using Decimal format to format dash
    DecimalFormatSymbols fmtSymbols = new DecimalFormatSymbols();
    fmtSymbols.setDecimalSeparator('-');
    DecimalFormat fmt = new DecimalFormat("####.##.##");


    public DateRenderer() {
        super(); }

    public void setValue(Object value)
    {

        setText (fmt.format(value));

    }

}

Есть две проблемы с кодом. Во-первых, у меня проблема с линией:

 fmtSymbols.setDecimalSeparator('-');

Во-вторых, это сделает весь мой столбец недоступным для редактирования (другой столбец все еще можно редактировать и сохранять).


person user2789240    schedule 13.05.2014    source источник
comment
Вводятся ли данные при использовании из фактической таблицы или из текстового поля или чего-то еще?   -  person Paul Samsotha    schedule 13.05.2014
comment
i.stack.imgur.com/KRVMA.png Это изображение моего графического интерфейса интерфейс. Я хочу, чтобы: если пользователь ввел дату в столбце даты, он автоматически добавит «-» (тире) между числами. Спасибо за помощь.   -  person user2789240    schedule 13.05.2014
comment
Что происходит, когда пользователь вводит что-то кроме формата yyyyMMdd? Как вы справитесь с этим?   -  person Paul Samsotha    schedule 13.05.2014
comment
Ну, это всего лишь простая программа, предназначенная для обработки yyyyMMdd на данный момент. Я хочу делать один шаг за раз и понимать, как программировать и форматировать дату, прежде чем перейти к следующему шагу (обработка части ошибки, связанной с вводом пользователем неправильного числа).   -  person user2789240    schedule 13.05.2014


Ответы (2)


«Ну, это всего лишь простая программа, предназначенная для обработки yyyyMMdd на данный момент. Я хочу делать один шаг за раз и понимать, как программировать и форматировать дату»

person Paul Samsotha    schedule 13.05.2014

Не используйте DecimalFormat для отображения даты. Вместо этого вы должны использовать SimpleDataFormat. См. раздел Визуализаторы табличного формата, чтобы узнать, какие средства визуализации вы можете использовать.

Другое дело, что вся моя колонка станет нередактируемой.

Средство визуализации НЕ контролирует, доступен ли столбец для редактирования или нет. Это работа метода isCellEditable(...).

Кроме того, ваша реализация getColumnClass(...) неверна. Вы не должны возвращать DateRender.class. Вместо этого вы должны вернуть класс данных, хранящихся в столбце, который, вероятно, должен быть Date.class.

person camickr    schedule 13.05.2014