Swing JTable - выделить выделенную ячейку другим цветом от остальной части выбранной строки? - PullRequest
8 голосов
/ 28 июля 2011

У меня есть базовая переменная 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)); 

, которая работала хорошо)

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

Ответы [ 3 ]

10 голосов
/ 29 июля 2011

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

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);

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

4 голосов
/ 28 июля 2011

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

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

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

3 голосов
/ 28 июля 2011

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

...