swing 中 custome jcombobox header 背景的意外变化

Unexpected change in background of header of custome jcombobox in swing

我尝试为我的菜单边栏制作自定义 jcombobox 我的 jcombobox 有 JButton 作为项目,因为我发现它 易于插入和对齐图标和文本。 但我的问题是当我在下拉列表中选择一个项目时,header 的颜色意外更改为组件的默认颜色。

public class MyComboBoxRenderer extends JLabel implements ListCellRenderer<Object> {
    private String _title;
    private JButton header;
    public MyComboBoxRenderer(String title) {
        _title = title;
    }

    @Override
    public Component getListCellRendererComponent(JList<?> list, Object value,
            int index, boolean isSelected, boolean hasFocus) {
        JButton item = new JButton();
        item.setOpaque(true);
        item.setBorderPainted(false);
        item.setFocusPainted(false);
        item.setBackground(isSelected ? Frame.LIGHTER_COLOR : Frame.LIGHT_COLOR ); 
        ImageIcon dot = new ImageIcon("image/icon/orange_dot.png");
        if (index == -1){
            item.setText(_title);
            header=item;
            return item; 
        }
        else{
            item.setIcon(dot);
            item.setIconTextGap(30);
            item.setText(value.toString());
            return item;
        }
        
    }
    
    public JButton getHeader(){
        return header;
    }
}
public static class MyComboBoxUI extends BasicComboBoxUI {
        final JButton button= new JButton(EXPAND_ARROW);
        protected void installDefaults() {
            super.installDefaults();
        }

        @Override
        protected JButton createArrowButton() {
            button.setContentAreaFilled(false);
            button.setBorder(null);
            return button;
        }

        @Override
        public void configureArrowButton() {
            super.configureArrowButton();
        }
        
        public JButton getArrowButton(){
            return button;
        }
    }
public class ComboBox extends JComboBox{
    public boolean isExpanded = false;
    private MyComboBoxRenderer renderer;
    public ComboBox(){
        super();
        this.setUI(new MyComboBoxUI());
    }
    public ComboBox(String[] list){
        super(list);
        renderer = new MyComboBoxRenderer("Lists Of Vocab");
        this.setUI(new MyComboBoxUI());
        this.setFont(Frame.I_FONT);
        this.setForeground(Frame.FONT_COLOR);
        this.setBackground(Frame.LIGHT_COLOR);
        this.setRenderer(renderer);
        MyComboBoxUI ui = (MyComboBoxUI) this.getUI();
        JButton arrowButton = ui.getArrowButton();
        arrowButton.addActionListener((ActionEvent e)->{
            isExpanded = !isExpanded;
            if(isExpanded == true){
                arrowButton.setIcon(COLLAPSE_ARROW);
            }
            else{
                arrowButton.setIcon(EXPAND_ARROW);
            }
        });
    }
    public MyComboBoxRenderer getRenderer(){
        return renderer;
    }

我将这个组合框添加到侧边栏

    private void addCheckBoxToSideBar(){
        ComboBox lists = new ComboBox(listNames);
        lists.setAlignmentX(Component.LEFT_ALIGNMENT); // have to have
        lists.addItemListener(new ItemListener(){
            @Override
            public void itemStateChanged(ItemEvent e) {
            if (e.getStateChange() == ItemEvent.SELECTED) {
                CardLayout cl = (CardLayout)(mainPane.getLayout());
                cl.show(mainPane, (String)e.getItem());[enter image description here][1]
            }
        }
    });

        sideBar.add(lists);
    }

这是第一个:

https://i.stack.imgur.com/ctVnT.png

但是当我点击选择一个项目时,它变成了默认颜色:

https://i.stack.imgur.com/KkhhO.png

这些是我尝试过但没有用的方法:

不知道更新UI是否会导致这个问题,但我不太了解。

在您的 MyComboBoxUI 中,尝试覆盖此方法:

@Override
public void paintCurrentValueBackground(Graphics g,Rectangle bounds,boolean hasFocus)
{
 Color t = g.getColor();
 g.setColor(your_color);
 g.fillRect(bounds.x,bounds.y,bounds.width,bounds.height);
 g.setColor(t);
}