Change background color editable JComboBox

前端 未结 2 822
鱼传尺愫
鱼传尺愫 2020-12-06 08:18

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 co

相关标签:
2条回答
  • 2020-12-06 08:40

    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();
                }
            });
        }
    }
    
    0 讨论(0)
  • 2020-12-06 08:43

    It works for me to change the color of a selected item in JComboBox.

        JComboBox cmb = new JComboBox();
        cmb.setEditable(true);
        cmb.setEditor(new WComboBoxEditor(getContentPane().getBackground()));
    
        // To change the arrow button's background        
        cmb.setUI(new BasicComboBoxUI(){
            protected JButton createArrowButton()
            {
                BasicArrowButton arrowButton = new BasicArrowButton(BasicArrowButton.SOUTH, null, null, Color.GRAY, null);
                return arrowButton;
            }
        });
        cmb.setModel(new DefaultComboBoxModel(new String[] { "a", "b", "c" }));
    


    import java.awt.Color;
    import java.awt.Component;
    import java.awt.event.ActionListener;
    import javax.swing.ComboBoxEditor;
    import javax.swing.JTextField;
    
    public class WComboBoxEditor implements ComboBoxEditor
    {
        JTextField tf;
    
        public WComboBoxEditor(Color background)
        {
            tf = new JTextField();
            tf.setBackground(background);
            tf.setBorder(null);
        }
    
        public Component getEditorComponent()
        {
            return tf;
        }
    
        public void setItem(Object anObject)
        {
            if (anObject != null)
            {
                tf.setText(anObject.toString());
            }
        }
    
        public Object getItem()
        {
            return tf.getText();
        }
    
        public void selectAll()
        {
            tf.selectAll();
        }
    
        public void addActionListener(ActionListener l)
        {
            tf.addActionListener(l);
        }
    
        public void removeActionListener(ActionListener l)
        {
            tf.removeActionListener(l);
        }
    
    }
    


    If you'd like to change the color of items in JCombobox except for a selected one, customize ListCellRenderer.

    0 讨论(0)
提交回复
热议问题