我不喜欢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
答案 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。否则它最初不会起作用,箭头按钮将启用。