JComboBox в настоящее время выбрал элемент фона и Windows L&F

Я не мог найти другой путь тогда:

UIManager.put("ComboBox.background",new Color(31,0,104));
UIManager.put("ComboBox.selectionBackground",new Color(31,0,104));

установить цвет фона выбранного элемента в JComboBox. К сожалению, это будет работать одинаково для всех списков в окне, которое я не хочу.

Вот как это работает в настоящее время: КАРТИНКА

Вот как я хочу, чтобы он себя вел: КАРТИНА

Я попытался создать собственный DefaultListCellRenderer и вызвать там setBackground, но это не помогло. Я также попытался переопределить BasicComboBoxUI, но я, вероятно, не знаю, какой метод мне следует переопределить для достижения результата.

РЕДАКТИРОВАТЬ: Это короткая часть моего кода в соответствии с предложением, но это не помогло

public void colorizeComboBox(){

     jComboBox1.setRenderer(new ColourListCellRenderer());
    jComboBox1.setUI(new BasicComboBoxUI(){
        @Override 
        protected JButton createArrowButton() {
            JButton b = this.createCustomArrowButton();
            b.setContentAreaFilled(false);
            b.setBackground(new Color(31,0,104));
            b.setBorder(BorderFactory.createEmptyBorder());
            return b;
         }


        public JButton createCustomArrowButton() {
              JButton b=new JButton(new ImageIcon(getClass().getResource("/server/Pictures/arrowdown.png")));
              b.setBorder(new EmptyBorder(0, 0, 0, 0));
              b.setOpaque(true);
              return b;
        }
    });

и пользовательский рендер:

  public static  class ColourListCellRenderer extends DefaultListCellRenderer {


     @Override
    public Color getBackground() {
       return new Color(31,0,104);
     }


}

но теперь все изменилось: фон текущего выбранного элемента - БЕЛЫЙ.

ОК, наконец, нашел решение:

 jComboBox1.setUI(new BasicComboBoxUI(){


        @Override
        public void paintCurrentValueBackground(Graphics g,Rectangle bounds,boolean hasFocus){

             Color t = g.getColor();
            if ( comboBox.isEnabled() )
                g.setColor(new Color(31,0,104));
            else
                g.setColor(DefaultLookup.getColor(comboBox, this,
                                         "ComboBox.disabledBackground", null));
            g.fillRect(bounds.x,bounds.y,bounds.width,bounds.height);
            g.setColor(t);
        }






    });
     jComboBox1.setFocusable(false);

Мне пришлось переопределить paintCurrentValueBackground(..) в BasicComboBoxUI, затем установить этот интерфейс в поле со списком, но фокус все еще создавал проблему и рисовать поле со списком в серый, поэтому я отключил фокус на этом поле со списком

2 ответа

Переопределите метод getBackground DefaultListCellRenderer и метод getListCellRendererComponent.

public class ColoredListCellRenderer extends DefaultListCellRenderer {

    private Color selectedColor;
    private Color backgroundColor;
    private Color lastColor;

    public ColoredListCellRenderer(Color backgroundColor, Color selectedColor) {
        this.selectedColor = selectedColor;
        this.backgroundColor = backgroundColor;
        lastColor = backgroundColor;
    }

    @Override
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
        if (isSelected) {
            lastColor = selectedColor;
        } else {
            lastColor = backgroundColor;
        }
        c.setBackground(lastColor);
        return c;
    }

    @Override
    public Color getBackground() {
        return lastColor;
    }

}

Ответ OP перешел от вопроса к ответу:

Хорошо, наконец нашел решение:

        jComboBox1.setUI(new BasicComboBoxUI(){
       
        
        @Override
        public void paintCurrentValueBackground(Graphics g,Rectangle bounds,boolean hasFocus){
            
             Color t = g.getColor();
            if ( comboBox.isEnabled() )
                g.setColor(new Color(31,0,104));
            else
                g.setColor(DefaultLookup.getColor(comboBox, this,
                                         "ComboBox.disabledBackground", null));
            g.fillRect(bounds.x,bounds.y,bounds.width,bounds.height);
            g.setColor(t);
        }
        
    
        
        
        
        
    });
     jComboBox1.setFocusable(false);

Мне пришлось переопределить paintCurrentValueBackground (..) в BasicComboBoxUI, затем установить этот пользовательский интерфейс в поле со списком, но фокус все еще создавал проблему и рисовал поле со списком в серый цвет, поэтому я отключил фокус на этом поле со списком

Другие вопросы по тегам