Изменить цвет невыделенной строки в JTable

Мне нужно выделить цвет выбранной строки в JTable. Я использую для этого свой собственный CellRenderer, и он работает, но когда я выбираю другую строку, предыдущая остается выделенной. Идея состоит в том, чтобы оставить синим только выбранный цвет, а остальные оставить в исходном цвете. Кроме того, я создаю парные столбцы: серый и непара: белый, так что это код в CellRenderer

private class Renderer extends DefaultTableCellRenderer
{
    private static final long serialVersionUID = 1L;
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
                                         boolean isSelected, boolean hasFocus,
                                         int row, int column)
    {
        super.getTableCellRendererComponent(table, value, isSelected,
                                                          hasFocus, row, column);

        int columnIndex = table.getSelectedColumn();
        int rowIndex = table.getSelectedRow();

        if (columnIndex != -1 && rowIndex != -1){
            this.setBackground(Color.BLUE);
        } else {
            if (row % 2 == 0) this.setBackground(Color.decode("0xF9F9F9"));
            else this.setBackground(Color.decode("0xF1F1F1"));
        }
        return this;
    }
}

РЕДАКТИРОВАТЬ: F1F1F1 - это цвет, почти белый, а F9F9F9F9 - светло-серый


person Community    schedule 02.10.2012    source источник


Ответы (2)


Вы должны добавить что-то вроде приведенного ниже кода, прежде чем вернуться из метода:

if (!isSelected) {
  setBackground(...);
}
person Dan D.    schedule 02.10.2012

Если вы не против использования сторонних библиотек: JXTable проекта SwingX имеет встроенную поддержку чередования цветов строк с использованием HighLighters.

Я нашел статью, в которой показаны скриншоты результата применения HighLighter к JXTable. Проблема в том, что статья устарела. Функциональность все еще есть, но код изменился. Хотя в статье все еще упоминается AlternateRowHighligher, как показано здесь

HighlighterPipeline highlighters = new HighlighterPipeline();
highlighters.addHighlighter(new AlternateRowHighlighter());
table.setHighlighters(highlighters);

текущий подход был бы больше похож

JXTable table;
Highlighter alternateStriping = 
  HighlighterFactory.createAlternateStriping( Color.decode( "0xF9F9F9" ), 
                                              Color.decode( "0xF1F1F1" ) );
table.setHighlighters( alternateStriping );
person Robin    schedule 02.10.2012
comment
Если у меня не будет альтернативы, я займусь этим - person ; 03.10.2012
comment
@ user1715408 Ответ Дэна должен позволить вам исправить вашу проблему. Я просто хотел показать альтернативный подход, и это было немного долго, чтобы включить его в комментарий. - person Robin; 03.10.2012
comment
Я не нахожу способа узнать, когда выбрана строка ... getSelectedRow () просто возвращает индекс выбранной строки ... - person ; 04.10.2012
comment
@ user1715408 выбранное состояние строки передается как параметр в методе getTableCellRenderer - person Robin; 04.10.2012