在禁用的情况下定义/设置JComboBox BasicArrowButton的颜色

时间:2016-07-01 11:19:31

标签: java user-interface override jbutton jcombobox

我不喜欢JComboBox的标准箭头按钮,因为它不适合我的GUI。所以我改变了它。为此,我编写了一个扩展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

中进行

1 个答案:

答案 0 :(得分:0)

我找到了解决这个问题的简短方法。我在我的箭头按钮上添加了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。否则它最初不会起作用,箭头按钮将启用。