JTable проблема с изменением цвета для первого столбца - PullRequest
4 голосов
/ 23 августа 2011

Я пытаюсь изменить цвет полей в JTable в соответствии с их значением.Я не хочу менять какой-либо цвет первого столбца, но он все равно меняется с ошибками (некоторые поля не заполнены правильно, например, University и возможный_обозреватель): x is the first column

Мой код выглядит следующим образом:

table.setDefaultRenderer(Object.class, new CustomRenderer());

private class CustomRenderer extends DefaultTableCellRenderer {
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,boolean hasFocus, int row, int col){
         Component comp = super.getTableCellRendererComponent(table,  value, isSelected, hasFocus, row, col);
         try {
             Double val =  Double.parseDouble(value.toString());

             if(col == 0){
                 comp.setBackground(Color.white);
             } else {
                 comp.setBackground(changeColor(val));
             }
         } catch (NumberFormatException e){}
         return( comp );
    }

    private Color changeColor(Double val) {
        //returns a Color between red and green depending on val
    }
}

Странная вещь в том, что когда я использую "col == 2", второй столбец становится белым, но первый остается странно окрашенным.

У кого-нибудь есть идея?

Ответы [ 2 ]

3 голосов
/ 23 августа 2011

Как использовать таблицы: использование пользовательских средств визуализации упоминает об этом альтернативном подходе: «Чтобы указать, что ячейки в определенном столбце должны использовать средство визуализации, используйте TableColumn method setCellRenderer(). "

Добавление: Преимущество этого подхода заключается в том, что средство визуализации" прилипает "к столбцу, если пользователь перетаскивает его в другую позицию.В этом примере замените setDefaultRenderer() на setCellRenderer().

table.getColumnModel().getColumn(DATE_COL).setCellRenderer(new DateRenderer());
3 голосов
/ 23 августа 2011

Вы должны расширить класс JTable и переопределить этот метод:

public TableCellRenderer getCellRenderer(int row, int column){}

В противном случае JTable будет использовать один и тот же рендерер для каждой ячейки в одном и том же столбце.

РЕДАКТИРОВАТЬ:

Как заметил @Mark Bramnik, лучше не создавать новый объект TableCellRenderer для каждого вызова getCellRenderer.Вы можете реализовать метод, подобный следующему:

setCellRenderer(int row, int col, TableCellRenderer render) 

и сохранить средство визуализации в самой расширенной JTable.

...