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

Changing default colors for focused JComboBox (Java Swing/AWT)

嗨!

我想知道如何更改 JComboBox 的默认聚焦背景和前景。 因为我让它扩展了一个 DefaultListCellRenderer,它正在修改它的每个项目的前景和背景,我不喜欢它在获得焦点时不尊重它们。 我试过 UIMnager.put("ComboBox.background", new ColorUIResource(my_color)); 和其他一些键(实际上是我能找到的每一个键),就像 SwingUtilities 所做的第一件事一样,但没有任何成功。 我没有在这个程序中对 UIManager 做任何更改,之前和之后都没有,所以外观和感觉是默认的(金属),因为它最初是由 Java 13 提供的。 有办法吗?

编辑: 这是一个示例,可以了解我的意思:

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;
        }
    }
}

第一个框(在中间)和JPanel(在顶部)是为了看看第二个框在获得焦点或失去焦点时会发生什么,转移焦点或不完全转移焦点(通过单击 JPanel 而不是 JComboBox 本身或其他可选择的 JComponent)。

i don't like that it doesn't respect them when it gains focus.

如果您不喜欢组合框获得焦点时的蓝色选择背景颜色,那么您可以使用:

UIManager.put("ComboBox.selectionBackground", new ColorUIResource(Color.ORANGE));

这可能适用于某些 LAF。但它将应用于应用程序中的所有组合框。

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