在Swing中设置JComboBox的背景

我想要一个没有箭头按钮(完成)的JComboBox,它在启用时具有绿色背景,在禁用时具有灰色背景(未完成)。 我还为下拉列表使用了自定义渲染器(完成)

我检查了BasicComboBoxUI的源代码并试图覆盖一些方法,但没有任何反应。 下拉列表始终具有灰色/蓝色背景。

这是我最近一次尝试的SSCCE。 我尝试了所有我能想到的东西。 请给我一个提示,我迷路了。

import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.awt.Rectangle; import javax.swing.BorderFactory; import javax.swing.DefaultComboBoxModel; import javax.swing.DefaultListCellRenderer; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.SwingUtilities; import javax.swing.plaf.basic.BasicComboBoxUI; public class DropDownBackground { public static void main(final String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { final JComboBox dropdown = new JComboBox(new DefaultComboBoxModel(new String[] { "one", "two", "three" })); dropdown.setRenderer(new ComboBoxListCellRenderer()); dropdown.setUI(new BasicComboBoxUI() { @Override public void paint(final Graphics g, final JComponent c) { final Rectangle r = this.rectangleForCurrentValue(); this.paintCurrentValueBackground(g, r, true); this.paintCurrentValue(g, r, true); } @Override public void paintCurrentValueBackground(final Graphics g, final Rectangle bounds, final boolean hasFocus) { final Color t = g.getColor(); if (this.comboBox.isEnabled()) g.setColor(Color.GREEN); else g.setColor(Color.GRAY); g.fillRect(bounds.x, bounds.y, bounds.width, bounds.height); g.setColor(t); } @Override protected JButton createArrowButton() { return new JButton() { @Override public int getWidth() { return 0; } }; } }); dropdown.setBackground(Color.GREEN); final JPanel p = new JPanel(); p.add(dropdown); final JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.getContentPane().add(new JScrollPane(p)); f.setSize(800, 200); f.setLocation(0, 0); f.setVisible(true); } }); } public static class ComboBoxListCellRenderer extends DefaultListCellRenderer { /** * */ private static final long serialVersionUID = 1L; @Override public Component getListCellRendererComponent(final JList list, final Object value, final int index, final boolean isSelected, final boolean cellHasFocus) { this.setToolTipText((String) value); if (isSelected) { this.setBackground(Color.RED); this.setForeground(Color.WHITE); } else { this.setBackground(Color.WHITE); this.setForeground(Color.BLACK); } this.setText((String) value); this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); return this; } } } 

由于我想要将这种颜色应用到广泛,这是最好的方法:

 UIManager.put("ComboBox.background", new ColorUIResource(UIManager.getColor("TextField.background"))); UIManager.put("ComboBox.foreground", new ColorUIResource(UIManager.getColor("TextField.foreground"))); UIManager.put("ComboBox.selectionBackground", new ColorUIResource(Color.GREEN)); UIManager.put("ComboBox.selectionForeground", new ColorUIResource(Color.WHITE)); 

如果您想要自定义更多(禁用颜色等),这个UIManager属性列表可能很有用: http : //www.rgagnon.com/javadetails/JavaUIDefaults.txt

为了更改JComboBox背景颜色,我将检查以下主题: http : //www.coderanch.com/t/555124/GUI/java/JComboBox-background-colour-customer-renderer

编辑 :说实话,我懒得看你的代码,但这个怎么样? http://www.coderanch.com/t/343835/GUI/java/custom-renderer-JComboBox

似乎更具渲染性:)