更改聚焦JComboBox(Java Swing/AWT)的默认颜色 你好

更改聚焦JComboBox(Java Swing/AWT)的默认颜色 你好,java,swing,awt,jcombobox,uimanager,Java,Swing,Awt,Jcombobox,Uimanager,我想知道如何更改JComboBox的默认聚焦背景和前景。 由于我让它扩展了一个DefaultListCellRenderer,它正在修改每个项目的前景和背景,我不喜欢它在获得焦点时不尊重它们。 我尝试了UIMnager.put(“ComboBox.background”,新的ColorUIResource(我的颜色))和其他一些键(实际上,我能找到的每一个键),就像SwingUtilities所做的第一件事一样,没有任何成功。 在这个程序中,我没有在UIManager中做任何更改,无论是在之前还

我想知道如何更改
JComboBox
的默认聚焦背景和前景。 由于我让它扩展了一个
DefaultListCellRenderer
,它正在修改每个项目的前景和背景,我不喜欢它在获得焦点时不尊重它们。 我尝试了
UIMnager.put(“ComboBox.background”,新的ColorUIResource(我的颜色))
和其他一些键(实际上,我能找到的每一个键),就像SwingUtilities所做的第一件事一样,没有任何成功。 在这个程序中,我没有在
UIManager
中做任何更改,无论是在之前还是之后,所以外观都是默认的(金属),正如Java13最初提供的那样。 有没有办法做到这一点

编辑: 下面是一个示例来了解我的意思:

package tests;

import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;

import javax.swing.DefaultListCellRenderer;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

final class ComboBoxTest implements Runnable {
    public static void main(String[]arguments_) {
        SwingUtilities.invokeLater(new ComboBoxTest());
    }
    @Override
    public void run() {
        JFrame frame_ = new JFrame("JComboBox Test");
        JPanel panel_ = new JPanel(new GridLayout(3, 1));
        JComboBox<String>
        useless_box = new JComboBox<>()
        , tested_box = new JComboBox<>(new String[] {
            "<html>&#x26C8</html>", "<html>&#x2620</html>"
        });
        tested_box.setBackground(Color.ORANGE);
        tested_box.setForeground(Color.RED.darker().darker());
        tested_box.setFont(tested_box.getFont().deriveFont(48.f));
        tested_box.setRenderer(new ComboRenderer());
        panel_.add(new JPanel());
        panel_.add(useless_box);
        panel_.add(tested_box);
        frame_.add(panel_);
        frame_.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame_.setLocationRelativeTo(null);
        frame_.pack();
        frame_.setVisible(true);
    }
    private class ComboRenderer extends DefaultListCellRenderer {
        /**
         * 
         */
        private static final long serialVersionUID = -1329981614961331328L;
        @Override
        public Component getListCellRendererComponent (
            JList<? extends Object>list_, Object value_        
            , int index_, boolean is_selected, boolean cell_has_focus
        ) {
            super.getListCellRendererComponent (
                list_, value_, index_, is_selected, cell_has_focus
            );
            setHorizontalAlignment(DefaultListCellRenderer.CENTER);
            switch(index_) {
            case -1:
                setBackground(Color.ORANGE);
                break;
            default:
                if(is_selected == true) {
                    setBackground(Color.ORANGE.darker());
                } else {
                    setBackground(Color.ORANGE);
                }
                break;
            }
            setForeground(Color.RED.darker().darker());
            return this;
        }
    }
}
包测试;
导入java.awt.Color;
导入java.awt.Component;
导入java.awt.GridLayout;
导入javax.swing.DefaultListCellRenderer;
导入javax.swing.JComboBox;
导入javax.swing.JFrame;
导入javax.swing.JList;
导入javax.swing.JPanel;
导入javax.swing.SwingUtilities;
最后一个类ComboBoxTest实现Runnable{
公共静态void main(字符串[]参数){
调用器(新的ComboBoxTest());
}
@凌驾
公开募捐{
JFrame=新JFrame(“JComboBox测试”);
JPanel面板=新JPanel(新网格布局(3,1));
下拉框
无用的盒子=新的JComboBox()
,tested_box=新JComboBox(新字符串[]){
“⛈”、“☠”
});
测试箱。立根背景(颜色。橙色);
测试框。设置前景(颜色。红色。较深()。较深());
tested_box.setFont(tested_box.getFont().deriveFont(48.f));
已测试的_box.setRenderer(新的ComboRenderer());
面板添加(新的JPanel());
面板添加(无用框);
面板添加(测试盒);
框架添加(面板);
frame.setDefaultCloseOperation(JFrame.DISPOSE\u ON\u CLOSE);
frame_u.setLocationRelativeTo(空);
框架包装();
帧设置可见(真);
}
私有类ComboRenderer扩展了DefaultListCellRenderer{
/**
* 
*/
私有静态最终长SerialVersionId=-1329981614961331328L;
@凌驾
公共组件GetListCellRenderComponent(
列表框
我不喜欢这样,当它获得焦点时,它不尊重他们

如果您在组合框获得焦点时表示不喜欢蓝色选择背景色,则可以使用:

UIManager.put("ComboBox.selectionBackground", new ColorUIResource(Color.ORANGE));
这可能适用于某些LAF。但它将适用于应用程序中的所有组合框


如果您只需要一个组合框,那么您需要编写一个自定义的ComboBoxUI。我不知道您需要覆盖哪些方法,但您可以在源代码中搜索“selectionBackground”查看该属性是如何使用的。

发布演示问题的帖子。我准备好了……好了,完成了。因此,当
JFrame
打开时,我所说的
JComboBox
没有焦点,所以一切正常。如果单击它,它的列表将按照我想要的方式发送,因为焦点所有者是列表,而不是
JComboBox
,但是选择一个项目或关闭列表而不将焦点转移到另一个
组件
让外观覆盖我的渲染器的默认值.Pfff。是的,我知道一些限制。有时,可以混合一些外观,因为对UIManager方法的每次调用只对即将诞生的
组件产生影响。但我甚至不这样做。我保持跨平台的外观(即使我更喜欢Nimbus):问题更少(而且nimbus非常具有攻击性……在您的评论结束时,(现在)很容易将默认颜色设置为
color.ORANGE