2010-05-06 60 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 
      } 
     } 
    } 
} 
相關問題