Defining/Setting JComboBox BasicArrowButton 禁用时的颜色

Defining/Setting the color of JComboBox BasicArrowButton in case of disabling

我不喜欢 JComboBox 的标准箭头按钮,因为它不太适合我的 GUI。所以我改变了它。为此,我写了一个 class,它正在扩展 BasicComboUI。在正常情况下,一切都如我所料。但是一旦我禁用该按钮,它就会保持原样,这意味着该按钮不再具有灰色背景色。相反,列表的左侧部分。所以我想知道,是否有办法定义或修改箭头按钮的禁用行为。

这是我当前的代码:

public class CustomArrowUI extends BasicComboBoxUI{

private static Color buttonBackground;
private static Color borderBox;
private static Color arrowColor;
private static Color buttonBorder;



public static ComboBoxUI createUI(JComponent c, Color buttonBackground, Color borderBox, Color arrowColor, Color buttonBorder)
{
    CustomArrowUI.buttonBackground = buttonBackground;
    CustomArrowUI.borderBox = borderBox;
    CustomArrowUI.arrowColor = arrowColor;
    CustomArrowUI.buttonBorder = buttonBorder;

    return new CustomArrowUI();
}


@Override
protected JButton createArrowButton()
{
    JButton button = new BasicArrowButton(BasicArrowButton.SOUTH, buttonBackground, borderBox, arrowColor, buttonBorder);
    LineBorder border = new LineBorder(buttonBorder, 1);
    button.setEnabled(false);
    button.setBorder(border);
    return button;

}}

我可以做的是将背景设置为默认浅灰色,并更改上一个按钮的 ActionListener 中的颜色,这将启用我的 JComboBox。但我有点不喜欢这个解决方案。我更愿意直接在我的 CustomArrowUI

中进行

我找到了一个解决这个问题的捷径。我在我的箭头按钮上添加了一个 ChangeListener,它正在检查按钮是否启用,并为按钮着色:

@Override
protected JButton createArrowButton()
{
    final JButton button = new BasicArrowButton(BasicArrowButton.SOUTH, buttonBackground, borderBox, arrowColor, buttonBorder);
    LineBorder border = new LineBorder(buttonBorder, 1);
    button.setEnabled(false);
    button.setBorder(border);
    button.addChangeListener(new ChangeListener(){

        @Override
        public void stateChanged(ChangeEvent arg0) {
            if(button.isEnabled())
                button.setBackground(Color.WHITE);
            else
            {
                button.setBackground(ColorPalette.LIGHT_GREY);
                button.setBorder(new LineBorder(ColorPalette.LIGHT_GREY, 1));
            }
        }
    });
    return button;  
}

上面我更改了按钮的背景和边框颜色,使它看起来像箭头是 JComboBox 的一部分,而不是它内部的单独按钮。

由于禁用行为是从 JComboBox 本身继承的(我猜),所以我不需要关心按钮是否可用。我需要定义的只是颜色。 另一个重点是确保在设置 JComboBox 的 UI 后调用 setEnabled() 方法,如果 JComboBox 应该默认禁用。否则它最初不会做出反应,并且箭头按钮看起来已启用。