Проектирование простого рендерера ячеек для внешнего вида Nimbus

У меня есть простой рендерер ячеек, который состоит из нескольких JLabel (сам рендерер расширяет JPanel), и я пытаюсь заставить его рендерить разумно в стиле Nimbus. По сути, в более светлых строках (поскольку Nimbus имеет альтернативную окраску строк) мой конкретный модуль рендеринга ячеек использует цвет фона таблицы (который намного темнее, чем оба цвета). более светлые и темные цвета row). В моем рендерере я делаю:

if (isSelected) {
    setBackground(table.getSelectionBackground);
}
else {
    setBackground(table.getBackground);
}

Если я прокомментирую весь этот блок кода, тогда все мои строки будут окрашены в более темный цвет row (не фон таблицы, но и не альтернативные цвета). Я не уверен, что даже понимаю, что может происходить! Как приведенный выше фрагмент кода вообще создает ячейки с разными цветами фона? Меняется ли цвет table.getBackground между вызовами моего метода?

Я пробовал использовать этот фрагмент кода:

Color alternateColor = sun.swing.DefaultLookup.getColor(
                         peer, 
                         peer.getUI, 
                         "Table.alternateRowColor");
if (alternateColor != null && row % 2 == 0)
    setBackground(alternateColor);

Который находится в классе DefaultTableCellRenderer. И вроде бы ни на что не влияет. У кого-нибудь есть пользовательские рендереры ячеек, работающие с Nimbus?

EDIT: если кому-то интересно, это оказалось проблемой с визуализаторами ячеек таблицы Scala, поскольку я фактически использовал Scala, а не Java. Принятый ниже ответ отлично работает в программе Java. Отдельный вопрос отправлен здесь.


person oxbow_lakes    schedule 24.08.2009    source источник


Ответы (1)


Ваш первый фрагмент кода, если все в порядке. Я думаю, вам нужно использовать UIManager.getColor("Table.alternateRowColor") для альтернативных строк и table.getBackground() в противном случае. Для выбранной строки используйте table.getSelectionBackground(). Таким образом, ваш код может выглядеть так

if (isSelected) {
    setBackground(table.getSelectionBackground());
}
else {
    if ( row % 2 == 0 ) {
       setBackground(UIManager.getColor("Table.alternateRowColor"));
    } else { 
       setBackground(table.getBackground());
    }
}

Не забудьте убедиться, что ваша панель непрозрачна, а метки прозрачны.

Вот хорошая ссылка на настройки пользовательского интерфейса Nimbus по умолчанию: http://www.duncanjauncey.com/java/ui/uimanager/UIDefaults_Java1.6.0_11_Windows_2000_5.0_Nimbus.html

person Eugene Ryzhikov    schedule 24.08.2009
comment
Да, это точно то, что я пробовал, и это не сработало. Однако на самом деле я использую Scala, а не Java, поэтому я решил создать быстрый тестовый пример на Java, и это сработало. Тогда спасибо. К сожалению, я понятия не имею, почему это не работает в Scala! - person oxbow_lakes; 25.08.2009
comment
Несмотря на то, что я мало знаю о Scala, я не вижу причин, по которым он не должен работать. Swing есть Swing, даже в Scala. - person Eugene Ryzhikov; 25.08.2009
comment
На самом деле это if ( row % 2 == 1 ) {. - person cimnine; 23.10.2011
comment
зависит от того, какую строку вы считаете альтернативной;) - person Eugene Ryzhikov; 23.10.2011