Swing JTable - выделить выбранную ячейку цветом, отличным от остальной части выбранной строки?

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

В настоящее время у меня есть isRowSelectionAllowed как true

Я попытался использовать собственный TableCellRenderer, который выглядит следующим образом:

public class CustomTableCellRenderer extends DefaultTableCellRenderer
{

public static final DefaultTableCellRenderer    DEFAULT_RENDERER    = new DefaultTableCellRenderer();
    @Override
  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    Component c = DEFAULT_RENDERER.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

    if (isSelected) {
        c.setBackground(Color.red);
    }
    else {
        c.setForeground(Color.black);
        c.setBackground(Color.white);
    }
    return c;   
  }     
}

Но это, похоже, не сработало (вся строка была выделена красным).

Я также попытался установить свойство UIManager следующим образом:

UIManager.put("Table.focusCellBackground", 
         new javax.swing.plaf.ColorUIResource (Color.red));

Но это тоже не работает (хотя, когда я пытался установить границу, используя

UIManager.put("Table.focusCellHighlightBorder", 
         new BorderUIResource.LineBorderUIResource(Color.red)); 

это хорошо сработало)

Не могли бы вы дать какие-либо предложения, что мне может понадобиться сделать?


person Madhavan Kulukkallur    schedule 28.07.2011    source источник


Ответы (3)


Попробуй это:

jtable.setCellSelectionEnabled(true);

Затем в getTableCellRendererComponent

if (table.isCellSelected(row, column))
    setForeground(Color.red);
else if (table.isRowSelected(row))
    setForeground(Color.green);
else if (table.isColumnSelected(column))
    setForeground(Color.blue);
else
    setForeground(Color.black);

Это отобразит выбранную ячейку красным цветом, остальную часть строки — зеленым, а остальную часть столбца — синим. Примечание: выбор ячейки требует, чтобы модель выбора была одиночной, другие модели выбора могут привести к непредсказуемому поведению.

person Devon_C_Miller    schedule 29.07.2011
comment
Я попробовал это, но это не меняет цвет вообще. Он входит в условие if для isCellSelected и isRowSelected, но, похоже, ничего не делает. - person Madhavan Kulukkallur; 29.07.2011
comment
Извините, моя ошибка - я пробовал, и это работает. Большое спасибо. (Установка этого ответа как принятого из-за рабочего кода. Другие ответы также были полезны для обучения). - person Madhavan Kulukkallur; 29.07.2011

Но это, похоже, не сработало (вся строка была выделена красным).

Вам нужно проверить переменную «hasFocus», а не переменную «isSelected».

Другой вариант вместо создания нескольких пользовательских средств визуализации (если в вашей таблице есть столбцы разных типов классов) — использовать Отрисовка строк таблицы.

person camickr    schedule 28.07.2011

Вам нужно будет отключить выбор строки и выбор ячейки для таблицы. Затем найдите способ вернуться и выделить строку, если это необходимо.

person jzd    schedule 28.07.2011
comment
Вы имеете в виду, что я включаю CellSelectionEnabled(true), а затем обрабатываю выбор строки, используя что-то вроде этого? table.changeSelection (строка, столбец, переключение, расширение); ? Это как бы дает тот же результат. - person Madhavan Kulukkallur; 28.07.2011
comment
Да, в первую часть, нет во вторую. Вам понадобится Cell Renderer, который выделяет выбранную строку другим цветом, чем выбранная ячейка. - person jzd; 29.07.2011