Swing: Nimbus L&F отключил цвет фона поля со списком

Я искал ответ в течение нескольких дней и много читал о LookAndFeels и непрозрачной проблеме, но не смог найти решения. Я разрабатываю приложение Java с Swing, используя NimbusLookAndFeel. Я доволен внешним видом в целом, но все еще хочу изменить представление вещей. Теперь я застрял, потому что почему-то не могу установить цвет фона отключенного JCombobox (combobox.setEnabled(false);)

Я уже перепробовал огромное количество различных свойств с помощью UIManager.put(..) + много других вещей.

Если я использую другой L&F, что-то вроде этого работает:

combobox.setRenderer(new DefaultListCellRenderer() {
            @Override
            public void paint(Graphics g) {
                setBackground(Color.WHITE);
                setForeground(Color.BLACK);
                super.paint(g);
            }               
});

Любые предложения, как сделать это с Nimbus?


person Mario B    schedule 22.01.2013    source источник
comment
несвязанные: а) не переопределять краску, вместо этого переопределять paintComponent б) переопределять только paintComponent для пользовательской окраски c) никогда-никогда изменять состояние компонента в методах рисования. Тем не менее, Nimbus редко соблюдает свойства цвета, настроенные его сеттерами. Вместо этого предоставьте настраиваемое (для каждого компонента) свойство темы оформления, как объяснено f.i. в главе о Nimbus Библии Swing и в статьях упоминаемые в нем.   -  person kleopatra    schedule 22.01.2013


Ответы (1)


Я много играл со стандартными настройками Nimbus. Изменение большинства компонентов не было проблемой, но я не смог с его помощью изменить фон любого отключенного компонента.

В итоге я написал пользовательский ListCellRenderer, подобный этому

public class DisabledListCellRenderer extends DefaultListCellRenderer {
    private static final long serialVersionUID = 1L;
    private JComponent component;

    public DisabledListCellRenderer(JComponent component) {
        this.component = component;
    }

    @Override
    protected void paintComponent(Graphics g) {
        g.setColor(SwingHelper.disabledBackgroundColor);
        g.fillRect(0, 0, component.getSize().width, component.getSize().height);
        super.paintComponent(g);
    }
}

Это, наконец, сработало, хотя я не уверен, что это хорошее решение.

person Mario B    schedule 23.01.2013