更改聚焦jcombobox(java swing/awt)的默认颜色

a0x5cqrl  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(470)

嗨!

我想知道如何更改默认的聚焦背景和前景 JComboBox . 因为我做了一个 DefaultListCellRenderer ,这是修改前景和背景的每一个项目,我不喜欢它不尊重他们时,它获得重点。我试过了 UIMnager.put("ComboBox.background", new ColorUIResource(my_color)); 还有一些其他的钥匙(实际上我能找到的每一把)作为第一件事 SwingUtilities 没有成功。我没有做任何改变 UIManager 在这个程序中,既不在前也不在后,因此外观是默认的(metal),正如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;
        }
    }
}

第一个盒子(中间)和 JPanel (在顶部)来看看当第二个获得焦点或失去焦点,转移焦点或不完全转移焦点时会发生什么 JPanel 而不是 JComboBox 自身或其他可选择的 JComponent ).

ozxc1zmp

ozxc1zmp1#

我不喜欢当它获得焦点时它不尊重他们。
如果您说您不喜欢组合框获得焦点时的蓝色选择背景色,则可以使用:

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

这可能对某些laf有效。但它将应用于应用程序中的所有组合框。
如果只需要一个组合框,那么就需要编写一个自定义的comboboxui。我不知道需要重写哪些方法,但是可以在源代码中搜索“selectionbackground”来查看如何使用该属性。

相关问题