【问题标题】:How to keep the popup menu of a JComboBox open on populating it?如何在填充时保持 JComboBox 的弹出菜单打开?
【发布时间】:2011-02-16 05:54:46
【问题描述】:

我的面板上有一个 JComboBox。弹出菜单项之一是“更多”,当我单击它时,我会获取更多菜单项并将它们添加到现有列表中。在此之后,我希望保持弹出菜单打开,以便用户意识到已经获取了更多项目,但是弹出窗口关闭。我正在使用的事件处理程序代码如下

public void actionPerformed(ActionEvent e)
    {
        if (e.getSource() == myCombo) {
            JComboBox selectedBox = (JComboBox) e.getSource();
            String item = (String) selectedBox.getSelectedItem();
            if (item.toLowerCase().equals("more")) {
                fetchItems(selectedBox);
            }
            selectedBox.showPopup();
            selectedBox.setPopupVisible(true);
        }
    }



private void fetchItems(JComboBox box)
    {
        box.removeAllItems();
        /* code to fetch items and store them in the Set<String> items */
        for (String s : items) {
            box.addItem(s);
        }
    }

我不明白为什么 showPopup() 和 setPopupVisible() 方法没有按预期运行。

【问题讨论】:

    标签: java swing combobox applet jcombobox


    【解决方案1】:

    在 fetchItems 方法中添加以下行

    SwingUtilities.invokeLater(new Runnable(){
    
        public void run()
        {
    
           box.showPopup();
        }
    

    }

    如果你调用 selectedBox.showPopup();在invokelater中它也可以工作。

    【讨论】:

    • 谢谢 .. 它奏效了。我必须创建一个实现 Runnable 接口的新内部类,并将 JComboBox 实例传递给内部类的构造函数,因为 run() 中的框对象将超出 fetchItems() 函数的范围。
    • @Stormshadow:不,您不需要创建内部类;一个更简单的解决方案是将 box 声明为 final:private void fetchItems(final JComboBox box)。那么这个答案中的代码将完美运行。
    【解决方案2】:

    覆盖 JCombobox setPopupVisible 方法

    public void setPopupVisible(boolean v) {
        if(v)
            super.setPopupVisible(v);
    }
    

    【讨论】:

      【解决方案3】:

      我找到了一些简单的解决方案来始终保持弹出窗口打开。它可能对一些自定义 JComboBox 很有用,比如我在项目中使用的 JComboBox,但有点 hacky。

      public class MyComboBox extends JComboBox
      {
          boolean keep_open_flag = false; //when that flag ==true, popup will stay open
      
          public MyComboBox(){
              keep_open_flag = true; //set that flag where you need
              setRenderer(new MyComboBoxRenderer()); //our spesial render
          }
      
          class MyComboBoxRenderer extends BasicComboBoxRenderer {
      
              public Component getListCellRendererComponent(JList list, Object value, 
                  int index, boolean isSelected, boolean cellHasFocus) {
      
                  if (index == -1){ //if popup hidden
                      if (keep_open_flag) showPopup(); //show it again
                  }
              }
          }
      }
      

      【讨论】:

        【解决方案4】:
        jComboBox1 = new javax.swing.JComboBox(){
        @Override
        public void setPopupVisible(boolean v) {
            super.setPopupVisible(true); //To change body of generated methods, choose Tools | Templates.
        }
        

        };

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-08-15
          • 1970-01-01
          • 2018-02-22
          • 1970-01-01
          • 1970-01-01
          • 2020-08-29
          • 2017-06-14
          • 1970-01-01
          相关资源
          最近更新 更多