jcombobox popup menue

Cal*_*Sea 2 java swing jcombobox

我所希望的,在编辑打字的时候的JComboBox,在弹出菜单中的JComboBox中以autumaticaly出现,我这样做,它的工作.但是,当我改变了图标的的箭头按钮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;
        }
    });
}    
Run Code Online (Sandbox Code Playgroud)

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

kle*_*tra 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);
Run Code Online (Sandbox Code Playgroud)

一切都很好,除了没有工作 - 看起来像是没有正确安装孩子的覆盖.

编辑2

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

从所有可用的资源,上面应该工作,请参阅fi Jasper关于如何定义自定义属性的初步解释:

ComponentA:ChildComponentB.foreground,它允许您指定ComponentA中包含的ChildComponentB.

所以我怀疑它真的是一个bug.一个不太令人满意的黑客攻击是在按钮本身上安装覆盖:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这根本不令人满意,因为按钮创建是由ui委托控制的,所以这个配置将无法在LAF切换后继续存在.或者反过来说:你需要安装一个带有UIManager的PropertyChangeListener,并且在检测到切换到Nimbus时,手动将组合的覆盖复制到其子代.