Java Swing-删除选定边框并更改JComboBox的箭头颜色
我正在尝试删除JComboBox的选定边框(上箭头)并更改箭头颜色(下箭头) 如果可能,如何删除外部边界?(深灰色的那个)Java Swing-删除选定边框并更改JComboBox的箭头颜色,java,swing,jcombobox,Java,Swing,Jcombobox,我正在尝试删除JComboBox的选定边框(上箭头)并更改箭头颜色(下箭头) 如果可能,如何删除外部边界?(深灰色的那个) 我该怎么做呢?因此,您可以通过实现一个ComboBoxUI来实现这一点,或者,实际上,例如,子类化BasicComboxUI。第二个选项更好,因为您只需要在某些地方调整一些代码,就可以准备好了(而不是从头开始实现自己的comboxui)。因此,下面的代码可以满足您的要求(希望如此): 自定义普通JButton方法(即第二种方法)的唯一问题是JComboBox的Layout
我该怎么做呢?因此,您可以通过实现一个
ComboBoxUI
来实现这一点,或者,实际上,例如,子类化BasicComboxUI
。第二个选项更好,因为您只需要在某些地方调整一些代码,就可以准备好了(而不是从头开始实现自己的comboxui
)。因此,下面的代码可以满足您的要求(希望如此):
自定义普通JButton
方法(即第二种方法)的唯一问题是JComboBox
的LayoutManager
将不考虑箭头按钮的首选大小,如果UI中的受保护标志(名为squareButton)为true
。如果该标志为true
,则按钮的宽度设置为等于按钮的高度,而按钮的高度又设置为等于组合框的高度。这就是为什么在第二种方法中,我手动设置组合框的首选大小,使其高度为45像素,足以在按钮内显示文本(在该特定情况下,文本等于“V”)
例如,您可以通过覆盖basicComboxUI
中的installDefaults()
方法并将其设置为false
来手动为单个UI实例设置此标志的值。否则,您可以通过调用UIManager.put(“ComboBox.squareButton”,Boolean.FALSE)为所有组合框设置其值代码>在您的代码中足够早(即在每个组合框实例化之前)。但事实证明,由于我对其进行了测试,当将此值设置为false
时,按钮的大小与显示区域的大小重叠(显示区域是组合框的选定值可见的地方)
经过进一步挖掘,我发现这个问题的原因是UI的getMinimumSize(…)
方法没有考虑按钮的插入。。。这意味着不考虑文本/图标周围的JButton
的默认边框。因此,在将squareButton标志设置为false
之后,您还需要覆盖此方法
将它们放在一起,您将得到以下最终方法/代码:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.LookAndFeel;
import javax.swing.UIManager;
import javax.swing.plaf.basic.BasicComboBoxUI;
public class MainComboBoxUI3 {
public static class MyComboBoxUI extends BasicComboBoxUI {
@Override
protected void installDefaults() {
super.installDefaults();
LookAndFeel.uninstallBorder(comboBox);
}
@Override
protected JButton createArrowButton() {
final JButton button = new JButton("Drop");
button.setName("ComboBox.arrowButton"); //Mandatory, as per BasicComboBoxUI#createArrowButton().
return button;
}
@Override
public void configureArrowButton() {
super.configureArrowButton(); //Do not forget this!
arrowButton.setBackground(Color.CYAN.darker());
arrowButton.setForeground(Color.BLUE);
//arrowButton.setBorder(javax.swing.BorderFactory.createEmptyBorder());
}
//Overrided getMinimumSize to take into account the button's insets for both width and height:
@Override
public Dimension getMinimumSize(final JComponent c) {
final Dimension mindim = super.getMinimumSize(c);
final Insets buttonInsets = arrowButton.getInsets();
return new Dimension(mindim.width + buttonInsets.left + buttonInsets.right, mindim.height + buttonInsets.top + buttonInsets.bottom);
}
}
public static void main(final String[] args) {
UIManager.put("ComboBox.squareButton", Boolean.FALSE); //Set all the combo boxes' button to non-square...
final JComboBox<String> combo = new JComboBox<>(new String[]{"A string", "B string 2", "C string 3"});
combo.setUI(new MyComboBoxUI());
final JPanel panel = new JPanel(new GridBagLayout());
panel.add(combo);
panel.setBackground(Color.RED.darker());
final JFrame frame = new JFrame("MainComboBoxUI");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(panel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.GridBagLayout;
导入java.awt.Insets;
导入javax.swing.JButton;
导入javax.swing.JComboBox;
导入javax.swing.JComponent;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.LookAndFeel;
导入javax.swing.UIManager;
导入javax.swing.plaf.basic.BasicComboxUI;
公共类maincomboxui3{
公共静态类MyComboxUI扩展了BasicComboxUI{
@凌驾
受保护的void installDefaults(){
super.installDefaults();
卸载边框(组合框);
}
@凌驾
受保护的JButton createArrowButton(){
最终JButton按钮=新JButton(“下拉”);
button.setName(“ComboBox.arrowButton”);//根据BasicComboBoxUI#CreateArowButton(),必须如此。
返回按钮;
}
@凌驾
公共无效配置箭头按钮(){
super.configureArrowButton();//不要忘记这一点!
箭头按钮.setBackground(Color.CYAN.darker());
箭头按钮。设置前景(颜色。蓝色);
//setboorder(javax.swing.BorderFactory.createEmptyByOrder());
}
//覆盖getMinimumSize以考虑按钮的宽度和高度插图:
@凌驾
公共维度getMinimumSize(最终JC组件c){
最终尺寸mindim=超级getMinimumSize(c);
最终插入按钮设置=箭头按钮。getInsets();
返回新维度(mindim.width+ButtonSets.left+ButtonSets.right,mindim.height+ButtonSets.top+ButtonSets.Botton);
}
}
公共静态void main(最终字符串[]args){
UIManager.put(“ComboBox.squareButton”,Boolean.FALSE);//将所有组合框的按钮设置为非方形。。。
最终JComboBox组合=新JComboBox(新字符串[]{“A字符串”、“B字符串2”、“C字符串3”});
setUI(新的mycomboxui());
最终JPanel面板=新JPanel(新GridBagLayout());
面板。添加(组合);
面板.背景(颜色.红色.深色());
最终JFrame=新JFrame(“MainComboBoxUI”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(面板);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
}
结果如下所示:
最后,如果您希望下拉按钮的边框更小(即上图中带有文本“drop”的按钮),您可以将arrowButton
的边框设置为(例如)javax.swing.BorderFactory.createEmptyBorder()
在configureArrowButton()
方法中使用任何外观吗?@GeorgeZ。不,我不知道这不是白人。我仔细检查了一下。这可能是与您从背景面板中看到的Color.RED.darker()的对比度。尝试将背景面板颜色设置为白色,您将看到差异。无论是哪种方式,我现在都无法设置框的背景-因此我如何解决此问题?@auxior这可以通过UIManager完成。从“编辑2”部分的答案中,可以看到main方法或combo.setBackground(Color.GREEN)中的代码行;工作!你只需要在组合框中失去焦点。尝试添加其他组合元素(如按钮)并单击它们以更改焦点,现在,当组合框没有焦点时,绿色背景可见。它在第三层是看不见的
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.LookAndFeel;
import javax.swing.plaf.basic.BasicComboBoxUI;
public class MainComboBoxUI2 {
public static class MyComboBoxUI extends BasicComboBoxUI {
@Override
protected void installDefaults() {
super.installDefaults();
LookAndFeel.uninstallBorder(comboBox);
}
@Override
protected JButton createArrowButton() {
final JButton button = new JButton("V");
button.setName("ComboBox.arrowButton"); //Mandatory, as per BasicComboBoxUI#createArrowButton().
return button;
}
@Override
public void configureArrowButton() {
super.configureArrowButton(); //Do not forget this!
arrowButton.setBackground(Color.CYAN.darker());
arrowButton.setForeground(Color.BLUE);
}
}
public static void main(final String[] args) {
final JComboBox<String> combo = new JComboBox<>(new String[]{"A string", "B string 2", "C string 3"});
combo.setUI(new MyComboBoxUI());
combo.setPreferredSize(new Dimension(150, 45)); //Needed to be able to show the button's text.
final JPanel panel = new JPanel(new GridBagLayout());
panel.add(combo);
panel.setBackground(Color.RED.darker());
final JFrame frame = new JFrame("MainComboBoxUI");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(panel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.LookAndFeel;
import javax.swing.UIManager;
import javax.swing.plaf.basic.BasicComboBoxUI;
public class MainComboBoxUI3 {
public static class MyComboBoxUI extends BasicComboBoxUI {
@Override
protected void installDefaults() {
super.installDefaults();
LookAndFeel.uninstallBorder(comboBox);
}
@Override
protected JButton createArrowButton() {
final JButton button = new JButton("Drop");
button.setName("ComboBox.arrowButton"); //Mandatory, as per BasicComboBoxUI#createArrowButton().
return button;
}
@Override
public void configureArrowButton() {
super.configureArrowButton(); //Do not forget this!
arrowButton.setBackground(Color.CYAN.darker());
arrowButton.setForeground(Color.BLUE);
//arrowButton.setBorder(javax.swing.BorderFactory.createEmptyBorder());
}
//Overrided getMinimumSize to take into account the button's insets for both width and height:
@Override
public Dimension getMinimumSize(final JComponent c) {
final Dimension mindim = super.getMinimumSize(c);
final Insets buttonInsets = arrowButton.getInsets();
return new Dimension(mindim.width + buttonInsets.left + buttonInsets.right, mindim.height + buttonInsets.top + buttonInsets.bottom);
}
}
public static void main(final String[] args) {
UIManager.put("ComboBox.squareButton", Boolean.FALSE); //Set all the combo boxes' button to non-square...
final JComboBox<String> combo = new JComboBox<>(new String[]{"A string", "B string 2", "C string 3"});
combo.setUI(new MyComboBoxUI());
final JPanel panel = new JPanel(new GridBagLayout());
panel.add(combo);
panel.setBackground(Color.RED.darker());
final JFrame frame = new JFrame("MainComboBoxUI");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(panel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}