Change background color editable JComboBox
29,620
Solution 1
see my code example
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.
Author by
brouckaertd
Updated on July 10, 2022Comments
-
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:
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 about 10 yearsCould you ever solve your problem?
-
brouckaertd about 10 yearsNope, 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 almost 8 yearsRelated, possibly duplicate, can't decide: stackoverflow.com/questions/4412902/…
-
-
brouckaertd about 12 yearscorrects 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 about 10 years@morpheus05 required some woodoo in Java7 for keys in UIManager
-
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.