Фон JTable TableCellRenderer с проблемой цвета NimbusLookAndFeel

Я использую NimbusLookAndFeel. При таком внешнем виде фон ячейки JTable попеременно бывает белым и светло-серым (это зависит от номера строки). Теперь я пишу некий пользовательский рендерер ячеек, реализующий TableCellRenderer. Мне нужно установить фон этих средств визуализации в соответствии с положением ячейки в JTable.

public class MyCellRenderer extends JLabel implements TableCellRenderer{


    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {

                Color bgColor = //need to retrieve the right cell background color
                setBackground(bgColor);
        return this;
    }

}

Как я могу получить такое значение цвета?


person Heisenbug    schedule 04.07.2011    source источник
comment
перечитывая, я не совсем понимаю, о чем вы спрашиваете: по умолчанию Nimbus чередует фон строк, а не столбцов. В чем именно проблема, с которой вы столкнулись? Кстати (придирки ...) в своем фрагменте вы не расширяете TableCellRenderer, вы его реализуете.   -  person kleopatra    schedule 04.07.2011


Ответы (2)


Технически вы можете получить доступ к цвету через UIManager

   Color alternate = UIManager.getColor("Table.alternateRowColor");

Практически я бы не рекомендовал писать рендереры с нуля — нужно учитывать множество деталей, чтобы сделать все правильно. Эти детали обрабатываются f.i. в SwingX (предвзято ко мне :-)

Ожидал, что вы сами сделаете логику ;-). Вот рабочий фрагмент (при условии, что вы хотите раскрасить строку, а не столбец, но изменить это было бы... тривиально):

    TableCellRenderer renderer = new TableCellRenderer() {

        JLabel label = new JLabel();

        @Override
        public Component getTableCellRendererComponent(JTable table,
                Object value, boolean isSelected, boolean hasFocus,
                int row, int column) {
            label.setOpaque(true);
            label.setText("" + value);
            Color alternate = UIManager.getColor("Table.alternateRowColor");
            if (row % 2 == 1) {
                label.setBackground(alternate);
            } else {
                label.setBackground(Color.WHITE);
            }
            return label;
        }

    };
    table.setDefaultRenderer(Object.class, renderer);
person kleopatra    schedule 04.07.2011
comment
У меня нет альтернативы. Я вынужден написать собственный модуль рендеринга ячеек. Я попробую ваше решение, спасибо. Но я не понимаю, как такой вызов может различать цвета по номеру столбца. - person Heisenbug; 04.07.2011
comment
@Overbose - логика того, какой цвет применить к какой ячейке, осталась за вами;) Осторожно: есть такие состояния, как выбрано, сфокусировано, редактируется, перетаскивание ... и все их комбинации, которые следует учитывать. Что вы имеете в виду под пробелами? - person kleopatra; 04.07.2011
comment
вы правы извините. Я имел в виду строку, а не столбец. Я делаю именно то, что вы мне предлагаете. Мне не хватало setOpaque(true). Спасибо .. ваш ответ правильный. Вы спасли меня :) - person Heisenbug; 04.07.2011

Это должно работать отлично:

public class MyRenderer extends DefaultTableCellRenderer { ... }
person Elskwi    schedule 17.05.2016