Change background color editable JComboBox

29,620

Solution 1

see my code example

enter image description here

import java.awt.*;
import java.util.Vector;
import javax.swing.*;
import javax.swing.UIManager;
import javax.swing.plaf.ColorUIResource;
import javax.swing.plaf.metal.MetalComboBoxButton;

public class MyComboBox {

    private Vector<String> listSomeString = new Vector<String>();
    private JComboBox someComboBox = new JComboBox(listSomeString);
    private JComboBox editableComboBox = new JComboBox(listSomeString);
    private JComboBox non_EditableComboBox = new JComboBox(listSomeString);
    private JFrame frame;

    public MyComboBox() {
        listSomeString.add("-");
        listSomeString.add("Snowboarding");
        listSomeString.add("Rowing");
        listSomeString.add("Knitting");
        listSomeString.add("Speed reading");
//
        someComboBox.setPrototypeDisplayValue("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
        someComboBox.setFont(new Font("Serif", Font.BOLD, 16));
        someComboBox.setEditable(true);
        someComboBox.getEditor().getEditorComponent().setBackground(Color.YELLOW);
        ((JTextField) someComboBox.getEditor().getEditorComponent()).setBackground(Color.YELLOW);
//
        editableComboBox.setPrototypeDisplayValue("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
        editableComboBox.setFont(new Font("Serif", Font.BOLD, 16));
        editableComboBox.setEditable(true);
        JTextField text = ((JTextField) editableComboBox.getEditor().getEditorComponent());
        text.setBackground(Color.YELLOW);
        JComboBox coloredArrowsCombo = editableComboBox;
        Component[] comp = coloredArrowsCombo.getComponents();
        for (int i = 0; i < comp.length; i++) {// hack valid only for Metal L&F
            if (comp[i] instanceof MetalComboBoxButton) {
                MetalComboBoxButton coloredArrowsButton = (MetalComboBoxButton) comp[i];
                coloredArrowsButton.setBackground(null);
                break;
            }
        }
//
        non_EditableComboBox.setPrototypeDisplayValue("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
        non_EditableComboBox.setFont(new Font("Serif", Font.BOLD, 16));
//
        frame = new JFrame();
        frame.setLayout(new GridLayout(0, 1, 10, 10));
        frame.add(someComboBox);
        frame.add(editableComboBox);
        frame.add(non_EditableComboBox);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocation(100, 100);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        UIManager.put("ComboBox.background", new ColorUIResource(Color.yellow));
        UIManager.put("JTextField.background", new ColorUIResource(Color.yellow));
        UIManager.put("ComboBox.selectionBackground", new ColorUIResource(Color.magenta));
        UIManager.put("ComboBox.selectionForeground", new ColorUIResource(Color.blue));
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                MyComboBox aCTF = new MyComboBox();
            }
        });
    }
}

Solution 2

Turned out to be easy. Create a renderer and set the background color. Then override the renderer's setOpaque method to always set the opacity to true.

class PDFChooser extends JComboBox<String>  {
    PDFChooser() {
        setRenderer(new Renderer());
    }
    class Renderer extends DefaultListCellRenderer {
        @Override 
        public void setOpaque(boolean makeBackGroundVisible) {
            super.setOpaque(true);     // THIS DOES THE TRICK
        }
        @Override
        public Component getListCellRendererComponent(JList<?> list, 
                    Object value, int index, 
                    boolean isSelected, boolean cellHasFocus) {
            setText((String)value);
            setBackground(Color.cyan);
            return this;
        }
    }
}

If you want the popup menu to use the LAF background, you can add a PopupMenuListener to note when the popup is popped. At that time, the setOpaque method would set the opacity false.

Share:
29,620
brouckaertd
Author by

brouckaertd

Updated on July 10, 2022

Comments

  • brouckaertd
    brouckaertd almost 2 years

    I am programming an editable combobox in a JFrame Form, but i want to change te background color.

    How the program works: If i click the button "press", then the combobox his background needs to become black.

    I tried:

    1.

    cbo.setBackground(Color.BLACK);
    

    But it did nothing

    2

    cbo.getEditor().getEditorComponent().setBackground(Color.BLACK);
    
    ((JTextField) cbo.getEditor().getEditorComponent()).setOpaque(true);
    

    Does this:

    image

    Code example:

    public class NewJFrame extends javax.swing.JFrame {
    
        private JComboBox cboCategorie;
    
        public NewJFrame() {
            initComponents();
    
            cboCategorie = new JComboBox();
            cboCategorie.setBounds(10, 10, 250, 26);
            cboCategorie.setVisible(true);
            cboCategorie.setEditable(true);
            this.add(cboCategorie);
    
        }
    
    private void pressActionPerformed(java.awt.event.ActionEvent evt) {
            cboCategorie.getEditor().getEditorComponent().setBackground(Color.BLACK);
            ((JTextField) cboCategorie.getEditor().getEditorComponent()).setOpaque(true);
    }
    

    I am working with the Java JDK7

    Any sugestions?

    • morpheus05
      morpheus05 about 10 years
      Could you ever solve your problem?
    • brouckaertd
      brouckaertd about 10 years
      Nope, problem is never solved. If you have a solution, feel free to share :) The problem was for a school project and I never solved it...
    • Jason C
      Jason C almost 8 years
      Related, possibly duplicate, can't decide: stackoverflow.com/questions/4412902/…
  • brouckaertd
    brouckaertd about 12 years
    corrects me if i am wrong. You are running it from an Java Main Class, while i am working in a JFrame Form. Your code is working, but if i copy your code to a new JFrame Form (with the necessary updates), and run the file. There are no colors. Do i need to do something special to get it working?
  • mKorbel
    mKorbel about 10 years
    @morpheus05 required some woodoo in Java7 for keys in UIManager
  • morpheus05
    morpheus05 about 10 years
    @mKorbel I copied your code, added nimbus LAF and run the program. I see no difference. OP asked about nimbus (Screenshot) so I thought this example works with nimbus and or Java 7.