【问题标题】:Hide the button of a JComboBox if is !enabled如果已启用,则隐藏 JComboBox 的按钮
【发布时间】:2026-02-06 00:55:01
【问题描述】:

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

EDIT 2:我最终无法做我想做的事,好像我切换到 Nimbus PLAF,即使我隐藏了绘制背景的按钮,所以只有箭头被隐藏,一切else 还在。

我将不得不使用 JPanel。

【问题讨论】:

  • 你能澄清你的问题吗?我不明白这一点。
  • 允许选择项目的下拉按钮,我希望在禁用组合框时不显示(用户无法单击此下拉按钮,所以想隐藏它)

标签: java swing jcombobox


【解决方案1】:

从技术上讲,您可以继承 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 行为 - 因此可能会使用户感到困惑

【讨论】:

  • 是的,我知道,但我无法更改,这是项目要求,并且是在配置模式(可编辑)或咨询模式(不可编辑 -> 隐藏按钮)
  • 附带说明,如果您打算经常这样做,您可能需要保存 child 的引用以供进一步使用。
  • @Matthieu 从技术上讲是肯定的 - 但是在不听取潜在变化的情况下保留对可能发生变化的事物的引用是一种糟糕的风格(尽管这里发生变化的可能性不是很高:-)
【解决方案2】:

你可以这样使用:

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() 方法由您决定。这应该只是给你一个想法。

【讨论】:

  • 不删除,永远不会,使用 setVisible() 或最好的 setIcon() 成功
  • 很好,这是一个好的开始,现在我必须找到如何更新文本字段,因为隐藏/删除此按钮会产生一个空框;)
  • 删除不完整:您必须存储已删除的按钮以供以后重新添加。
【解决方案3】:

您可能找不到它,因为您找错地方了 - 试试 javax.swing.plaf.basic.BasicComboBoxUI.installComponents()javax.swing.plaf.basic.BasicComboBoxUI.configureArrowButton()

【讨论】:

  • 我试图通过扩展 BasicComboBoxUI 来改变实现方式,但是我失去了 UI,我该怎么办?类 JComboVStringUI 扩展 BasicComboBoxUI{public void setEnabled(boolean enabled){arrowButton.setVisible(enabled);}}
最近更新 更多