改变JComboBox的外观

时间:2014-01-07 13:21:43

标签: java swing jcombobox custom-component

我的Java项目中有以下类

    public class ComboBox extends JComboBox {
    private static final long serialVersionUID = 1L;

    ComboBox(){
        for(Component comp : this.getComponents()){
            if(comp instanceof AbstractButton){
                comp.setVisible(false);
            }
        }
    }

    }

这个代码更改了JComboBox的外观,但是在第二个之后,出现了旧的JComboBox。我的问题是如何不断重新验证JComboBox。

1 个答案:

答案 0 :(得分:0)

好像你想要隐藏JComboBox的箭头按钮。在Swing体系结构中,这项工作被委托给通过调用Component方法在updateUI() ctor上创建的UI类(UI委托)。

当您隐藏ctor中的箭头按钮时,可能会开始调用updateUI()方法。

我认为你可以修复你的代码,删除对updateUI()的调用或隐藏箭头按钮。

例如:

class ComboBox<T> extends JComboBox<T> {
        private static final long serialVersionUID = 1L;

        public ComboBox(){
        }

        @Override
        public void updateUI() {
            super.updateUI();
            hideArrowButton();
        }

        private void hideArrowButton() {
            for(Component comp : this.getComponents()){
                if(comp instanceof AbstractButton){
                    comp.setVisible(false);
                }
            }
        }
    }

此外,您可以编写一个隐藏箭头按钮的UI代理:

class ComboUI extends MetalComboBoxUI {

    @Override
    protected JButton createArrowButton() {
        JButton arrowButton = super.createArrowButton();
        arrowButton.setVisible(false);

        return arrowButton;
    }

    public static ComponentUI createUI(JComponent c) {
        return new ComboUI();
    }
}

通过调用JComboBox方法或通过更新setUI()

将其设置为所有JComboBox的默认设置,将其设置在UIManager
UIManager.put("ComboBoxUI", ComboUI.class.getName());

有关Swing MVC和UI代表的更多信息,请参阅http://www.oracle.com/technetwork/java/architecture-142923.html#modified_mvc