java 在 Swing 中设置 JComboBox 的背景
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/14342495/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Set Background of JComboBox in Swing
提问by haferblues
I want a JComboBox without a arrow button (done), which has a green background, when enabled and a gray background when disabled (not done). I also use a custom renderer for the drop down list (done)
我想要一个没有箭头按钮的 JComboBox(完成),启用时为绿色背景,禁用时为灰色背景(未完成)。我还为下拉列表使用了自定义渲染器(完成)
I checked the source code of BasicComboBoxUI and tried to override some methods, but nothing happens. The dropdown always has a gray/blue background.
我检查了 BasicComboBoxUI 的源代码并尝试覆盖一些方法,但没有任何反应。下拉菜单始终具有灰色/蓝色背景。
Here is a SSCCE with my last attempts. I tried everything I could think of. Please give me a hint, I'm lost.
这是我最后一次尝试的 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;
}
}
}
回答by haferblues
Since I wanted to have this colors application wide, this was the best approach:
由于我想让这种颜色应用广泛,这是最好的方法:
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));
If you want to customize even more (disabled colors etc) this list of UIManager properties might be useful: http://www.rgagnon.com/javadetails/JavaUIDefaults.txt
如果您想自定义更多(禁用颜色等),此 UIManager 属性列表可能很有用:http: //www.rgagnon.com/javadetails/JavaUIDefaults.txt