【问题标题】:jcombobox popup menuejcombobox 弹出菜单
【发布时间】:2012-08-15 22:27:53
【问题描述】:

我希望的是,当输入可编辑的 JCombobox 时,JComboboxPopup Menu 自动出现,我这样做了有效 。但是,当我在JCombobox 中更改 箭头按钮Icon 时,它不再起作用,如图所示

更改箭头按钮图标之前

更改箭头按钮图标后(弹出窗口永远不会出现,当一个人在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 帮助,因为我真的厌倦了寻找解决方案

【问题讨论】:

  • +1 增加您的声誉 :-)
  • @Calm Sea, "但是,当我更改 JCombobox 中箭头按钮的图标时,它不再起作用,如图所示"。什么图片?将图片上传到imgur并发布链接。
  • @user1329572 :OP 的声誉不足以与问题一起发布图片。一个人需要有超过 10 个信誉点才能发布一张,这就是为什么该图片丢失了 :-)
  • @trashgod 设置图标有......零效果,即使它在 BasicArrowButton: 中直接绘制形状,不使用图标:-)

标签: java swing jcombobox


【解决方案1】:

这里的技术问题是编辑器是由 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

...几个小时后...

从所有可用资源中,以上应该可以工作,请参阅 f.i. Jasper's initial explanation 如何定义自定义属性:

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 时,手动将覆盖从组合复制到其子项。

【讨论】:

  • @kleopatra 非常感谢您澄清问题所在。但是请给我一个如何将 PropertyChangeListener 与 UIManager 一起使用的示例?
  • +1 我尝试了以下方法,但没有任何改变: UIDefaults comboDefaults = new UIDefaults(); comboDefaults.put("ComboBox:\"ComboBox.arrowButton\"[Enabled].foregroundPainter", new Painter() { @Override public void paint(Graphics2D g, JComponent c, int w, int h) { g. setColor(Color.WHITE); } }); jComboBox1.putClientProperty("Nimbus.Overrides.InheritDefaults", false); jComboBox1.putClientProperty("Nimbus.Overrides", comboDefaults);
猜你喜欢
  • 1970-01-01
  • 2017-06-14
  • 1970-01-01
  • 2011-06-13
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多