Изменить цвета JComboBox БЕЗ рендерера

Я могу изменить цвет фона ComboBox, используя:

UIManager.put("ComboBox.background", Color.RED);

и это работает.

Но чтобы изменить [selected].background, взгляните на Nimbus Defaults свойство называется ComboBox:"ComboBox.listRenderer"[Selected].background, поэтому я попробовал:

UIManager.put("ComboBox:\"ComboBox.listRenderer\"[Selected].background", Color.RED);

но это не работает.

Я хочу сделать это с помощью рендерера (который я пробовал и создает много проблем в длинном коде, который я даже не писал сам, и рендеринг выпадающих списков в JFileChoosers является дополнительной проблемой, если я пойду таким путем). Итак, есть ли решение исправить это с помощью UIMAnager.put()?


person Roman Rdgz    schedule 27.07.2011    source источник


Ответы (1)


установить разные Color, не используя Nimbus defaluts

1/ для отдельного JComboBox

((JTextField) myJComboBox.getEditor().getEditorComponent())
#setBackground(Color.xxxx);

2/ для JFileChooser

  • извлеките все JComponents из JFileChooser (составное JComponents), как предлагается здесь так же, как описано для JList и JScrooPane

  • Самый безопасный способ - извлечь все JComponents из JFileChooser, как было предложено в вашем предыдущем сообщении об этом здесь< /а>

3/ с помощью NimbusDefalut найти по умолчанию для

  • JTextField и как предложено в моем добавлении №1

  • JComboBox's DropDown List по умолчанию для JList, HighLighter для выделения из JTable

РЕДАКТИРОВАТЬ:

код

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.plaf.basic.BasicComboPopup;

public class DisabledEditableCombo extends JFrame {

    private static final long serialVersionUID = 1L;
    private String comboList[] = (new String[]{"-", "London", "New York", "Sydney", "Tokyo"});
    private JComboBox cmb = new JComboBox(comboList);
    private JComboBox cmb1 = new JComboBox(comboList);
    private JComboBox cmb2 = new JComboBox(comboList);
    private JComboBox cmb3 = new JComboBox(comboList);
    private JList list;
    private JCheckBox checkBox = new JCheckBox("Combo enabled", false);

    public DisabledEditableCombo() {
        JLabel lbl = new JLabel("Editable JComboBox");
        cmb.setEditable(true);
        ((JTextField) cmb.getEditor().getEditorComponent()).setDisabledTextColor(Color.red);
        ((JTextField) cmb.getEditor().getEditorComponent()).setBackground(Color.green);
        cmb.setSelectedItem("Just Editable");
        JLabel lbl1 = new JLabel("Non-Editable JComboBoxes");
        //UIManager.put("ComboBox.disabledForeground", Color.red.darker().darker());
        cmb1.setSelectedItem("Sydney");
        cmb1.setRenderer(new DefaultListCellRenderer() {//  ListCellRenderer

            private static final long serialVersionUID = 1L;

            @Override
            public void paint(Graphics g) {
                setBackground(cmb1.getBackground());
                setForeground(Color.red);
                super.paint(g);
            }
        });
        cmb2.getEditor().getEditorComponent().setForeground(Color.blue);
        ((JTextField) cmb2.getEditor().getEditorComponent()).setDisabledTextColor(Color.red);
        cmb2.setSelectedItem("London");
        cmb3.setSelectedItem("Sydney");
        checkBox.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                boolean selected = checkBox.isSelected();
                cmb.setEnabled(selected);
                cmb1.setEnabled(selected);
                cmb2.setEnabled(selected);
                cmb2.setEditable(!cmb2.isEnabled());
                cmb2.setForeground(selected ? Color.blue : Color.red);
                if (cmb2.getEditor() != null) {
                    ((JTextField) cmb2.getEditor().getEditorComponent()).setDisabledTextColor(Color.red);
                }
                cmb3.setEnabled(selected);
                Object child = cmb3.getAccessibleContext().getAccessibleChild(0);
                BasicComboPopup popup = (BasicComboPopup) child;
                list = popup.getList();
                if (list != null) {
                    if (selected) {
                        list.setForeground(Color.blue);
                    } else {
                        list.setForeground(Color.red);
                    }
                }
            }
        });
        cmb.setEnabled(false);
        cmb1.setEnabled(false);
        cmb2.setEnabled(false);
        cmb3.setEnabled(false);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setPreferredSize(new Dimension(300, 300));
        setLocation(150, 100);
        setLayout(new GridLayout(7, 0, 10, 10));
        add(lbl);
        add(cmb);
        add(lbl1);
        add(cmb1);
        add(cmb2);
        add(checkBox);
        add(cmb3);
        pack();
        setVisible(true);
    }

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                DisabledEditableCombo disabledEditableCombo = new DisabledEditableCombo();
            }
        });
    }
}
person mKorbel    schedule 27.07.2011
comment
До сих пор я пытался с решением № 1, и я получаю сообщение об ошибке. Замена «#» на «.» идет, но ничего не меняется. Всё равно что искал смену фона, а не ВЫБРАННЫЙ фон - person Roman Rdgz; 27.07.2011
comment
Проблема в том, что 1-й не работает, 2-й говорит мне использовать код из моего предыдущего вопроса, который должен исправить только JComboBox в FileChooser, но не остальные, а 3-й я просто не понимаю, что вы меня спрашиваете сделать. Наконец, я также не понимаю код, добавленный после вашего редактирования: он предназначен для замены JComboBox вне FileChooser? Это проверено? - person Roman Rdgz; 28.07.2011