我想扩展JComboBox类没有改变的东西,我希望新组件在组合框被禁用时隐藏选择按钮。
我找不到创建此按钮的位置
编辑:到目前为止,我正在使用此代码:
@Override
public void setEnabled(boolean b)
{
super.setEnabled(b);
Component[] comps = getComponents();
for(Component comp : comps)
{
if(comp instanceof MetalComboBoxButton)
{
final MetalComboBoxButton dropDownButton = (MetalComboBoxButton) comp;
dropDownButton.setVisible(b);
break;
}
}
}
编辑2 :我最终无法做到我想要的,好像我切换到Nimbus PLAF,即使我隐藏按钮背景被绘制,所以只有箭头被隐藏,一切别的还在那里。
我将使用JPanel。
答案 0 :(得分:4)
从技术上讲,您可以对JComboBox进行子类化,并删除/添加按钮(如@flash所示)或切换其可见性
final JComboBox box = new JComboBox(new Object[] {1, 2, 3}) {
/**
* @inherited <p>
*/
@Override
public void setEnabled(boolean b) {
if (b == isEnabled()) return;
for (Component child : getComponents()) {
if (child instanceof JButton) {
child.setVisible(b);
break;
}
}
super.setEnabled(b);
}
};
你可能想重新考虑这个要求,因为它是非标准的ui行为 - 因此可能会混淆用户
答案 1 :(得分:0)
您可以使用以下内容:
public class CustomCombo extends JComboBox {
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
if(!enabled) {
removeArrowButton();
}
else {
addArrowButton();
}
}
private void removeArrowButton() {
Component[] comp = this.getComponents();
Component removeComponent = null;
for (int i = 0; i < comp.length; i++) {
if(comp[i] instanceof JButton) {
removeComponent = comp[i];
}
}
if(removeComponent != null) {
this.remove(removeComponent);
}
}
}
当您拨打customCombo.setEnabled(false)
时,这将删除箭头按钮。
方法addArrowButton()
取决于您。这应该只是给你一个想法。
答案 2 :(得分:0)
您可能无法找到它,因为您找错了地方 - 尝试javax.swing.plaf.basic.BasicComboBoxUI.installComponents()
和javax.swing.plaf.basic.BasicComboBoxUI.configureArrowButton()