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 应该默认禁用。否则它最初不会做出反应,并且箭头按钮看起来已启用。
我不喜欢 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 应该默认禁用。否则它最初不会做出反应,并且箭头按钮看起来已启用。