Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing-删除选定边框并更改JComboBox的箭头颜色_Java_Swing_Jcombobox - Fatal编程技术网

Java Swing-删除选定边框并更改JComboBox的箭头颜色

Java Swing-删除选定边框并更改JComboBox的箭头颜色,java,swing,jcombobox,Java,Swing,Jcombobox,我正在尝试删除JComboBox的选定边框(上箭头)并更改箭头颜色(下箭头) 如果可能,如何删除外部边界?(深灰色的那个) 我该怎么做呢?因此,您可以通过实现一个ComboBoxUI来实现这一点,或者,实际上,例如,子类化BasicComboxUI。第二个选项更好,因为您只需要在某些地方调整一些代码,就可以准备好了(而不是从头开始实现自己的comboxui)。因此,下面的代码可以满足您的要求(希望如此): 自定义普通JButton方法(即第二种方法)的唯一问题是JComboBox的Layout

我正在尝试删除JComboBox的选定边框(上箭头)并更改箭头颜色(下箭头)

如果可能,如何删除外部边界?(深灰色的那个)


我该怎么做呢?

因此,您可以通过实现一个
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);
    }
}