2010-05-06 59 views
2

我的面板上有一个JComboBox。其中一个弹出菜单项是“更多”,当我点击该菜单项时,我获取更多菜单项并将它们添加到现有列表中。在此之后,我希望保持弹出菜单处于打开状态,以便用户意识到已获取更多物品,但弹出窗口关闭。我使用的事件处理程序代码如下如何在填充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()方法不能正常工作,我不明白。

回答

4

添加以下行中fetchItems方法

SwingUtilities.invokeLater(new Runnable(){ 

    public void run() 
    { 

     box.showPopup(); 
    } 

}

如果ù调用selectedBox.showPopup();内部invokelater也会工作。

+0

谢谢..它的工作。我必须创建一个实现Runnable接口的新内部类,并将JComboBox实例传递给内部类的构造函数,因为run()中的box对象将超出fetchItems()函数的范围。 – Stormshadow 2010-05-06 06:52:27

+0

@Stormshadow:不,你不需要创建一个内部类;一个更简单的解决方案是将框声明为final:private void fetchItems(final JComboBox box)。然后这个答案中的代码将完美地工作。 – jfpoilpret 2010-05-07 01:41:43

1

覆盖的JComboBox setPopupVisible梅托德

public void setPopupVisible(boolean v) { 
    if(v) 
     super.setPopupVisible(v); 
} 
0
jComboBox1 = new javax.swing.JComboBox(){ 
@Override 
public void setPopupVisible(boolean v) { 
    super.setPopupVisible(true); //To change body of generated methods, choose Tools | Templates. 
} 

};

0

我发现了一些简单的解决方案,始终保持弹出式打开。它可能对一些自定义JComboBox有用,就像我在我的项目中使用的一样,但是有点乱。

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 
      } 
     } 
    } 
} 
相关问题