2

我希望的是,当输入可编辑的JCombobox时, JCombobox弹出菜单会自动出现,我这样做了,它起作用了。但是,当我更改箭头按钮图标时,它不再起作用,如图所示JCombobox

在更改箭头按钮图标之前

在此处输入图像描述

更改箭头按钮图标后(弹出窗口永远不会出现,当一个人写在JCombobox

在此处输入图像描述

这就是我所做的:

JTextComponent editor;
/** Creates new form combo */
public combo() {
    initComponents();

    editor = (JTextComponent) jComboBox1.getEditor().getEditorComponent();
    jComboBox1.setEditable(true);

    editor.addKeyListener(new KeyAdapter() {
        @Override
        public void keyReleased(KeyEvent e) {

            char keyChar = e.getKeyChar();
            if (jComboBox1.isDisplayable()) 
            { 
                jComboBox1.setPopupVisible(true);    
            }
            editor.setCaretPosition(editor.getText().length());

            //  System.out.println("wwwweeeee"+keyChar);
        }
    });    

    jComboBox1.setUI(new SynthComboBoxUI() {
        protected JButton createArrowButton() {

            JButton btn = new JButton();
            btn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Image/error3.png")));            
            return btn;
        }
    });
}    

Pleeeese 帮助,因为我真的厌倦了寻找解决方案

4

1 回答 1

5

这里的技术问题是编辑器是由 ui 创建/维护的。设置自定义 ui 时,它会被新的编辑器替换,因此您正在监听的组件不再是容器层次结构的一部分。

经过一番挖掘......我仍然没有解决方案:-(从表面上看,你会在编辑器上安装监听器之前调用 setUI -但是调用 setUI总是错误的......所以根本不要。

看到 ui 是基于合成器的,更新其视觉前景/背景属性的正确方法是提供自定义画家,每个应用程序或每个实例。Nimbus 特别允许通过“Nimbus.Overrides”客户端属性安装每个实例的自定义 UIDefaults。为了更改箭头按钮上的图标,适当的覆盖将是

Painter core = // a custom painter which paints the icon 
comboDefaults.put("ComboBox:\"ComboBox.arrowButton\"[Enabled].foregroundPainter", core);
combo.putClientProperty("Nimbus.Overrides.InheritDefaults", false);
combo.putClientProperty("Nimbus.Overrides", comboDefaults);

一切都很好,除了不工作 - 看起来覆盖没有正确安装在孩子身上。

编辑 2

... 几个小时以后 ...

从所有可用资源中,上述内容应该可以工作,请参阅Jasper对如何定义自定义属性的初步解释:

ComponentA:ChildComponentB.foreground 允许您指定包含在 ComponentA 中的 ChildComponentB。

所以我怀疑这真的是一个错误。一个不太令人满意的解决方法是在按钮本身上安装覆盖:

JButton org = null;
for (int i = 0; i < combo.getComponentCount(); i++) {
    if (combo.getComponent(i) instanceof JButton) {
        org = (JButton) combo.getComponent(i);
        UIDefaults buttonDefaults = new UIDefaults();
        buttonDefaults.put("ComboBox:\"ComboBox.arrowButton\"[Enabled].foregroundPainter", painter);
        org.putClientProperty("Nimbus.Overrides.InheritDefaults", false);
        org.putClientProperty("Nimbus.Overrides", buttonDefaults);
        break;
    }
}

这一点都不令人满意,因为按钮的创建是由 ui 委托控制的,所以这个配置不会在 LAF 切换后继续存在。或者反过来:您需要使用 UIManager 安装 PropertyChangeListener,并在检测到切换到 Nimbus 时,手动将覆盖从组合复制到其子项。

于 2012-08-21T07:50:21.753 回答