如果启用,则隐藏JComboBox的按钮

时间:2011-10-13 08:32:46

标签: java swing jcombobox

我想扩展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。

3 个答案:

答案 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()