2013-05-10 96 views
0

我有一個JComboBox只有一個值在開始,並有一個MouseListener連接到它。當我點擊JComboBox時,我填入了一些新值。但popupMenu在第一次點擊JComboBox時的大小爲一個元素。第二次所有值都將顯示爲正常。 任何想法如何讓我的組合框在更新其內容後直接更新popupMenu?更新JComboBox popupMenu

實施例的程序:

public class ComboBoxUpdate extends JFrame implements MouseListener { 

    private JComboBox<String> box; 
    public ComboBoxUpdate(){ 
     // Init 
     JPanel panel = new JPanel(); 
     box = new JComboBox<String>(); 
     box.addItem("from start"); 

     // Add listener 
     Component[] comps = box.getComponents(); 
     for(int i = 0; i < comps.length; i++) 
      comps[i].addMouseListener(this); 

     panel.add(box); 
     this.add(panel); 
     this.pack(); 
     this.setVisible(true); 
    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 
     if(box.getItemCount() == 1){ 
      box.removeAllItems(); 
      box.addItem("item 1"); 
      box.addItem("item 2"); 
      box.addItem("item 3"); 
     } 
    } 

    public static void main(String[] args){ 
     new ComboBoxUpdate(); 
    } 

    @Override 
    public void mousePressed(MouseEvent e) {} 

    @Override 
    public void mouseReleased(MouseEvent e) {} 

    @Override 
    public void mouseEntered(MouseEvent e) {} 

    @Override 
    public void mouseExited(MouseEvent e) {} 
} 

回答

1

我認爲這是更好的解決方案:

public class ComboBoxUpdate extends JFrame implements PopupMenuListener { 

    private JComboBox box; 

    public ComboBoxUpdate() { 
     // Init 
     JPanel panel = new JPanel(); 
     box = new JComboBox(); 
     box.addItem("from start"); 

     box.addPopupMenuListener(this); 

     panel.add(box); 
     this.add(panel); 
     this.pack(); 
     this.setVisible(true); 
    } 

    @Override 
    public void popupMenuWillBecomeVisible(PopupMenuEvent e) { 
     if (box.getItemCount() == 1) { 
      box.removeAllItems(); 
      box.addItem("item 1"); 
      box.addItem("item 2"); 
      box.addItem("item 3"); 
     } 
    } 

    @Override 
    public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { 
    } 

    @Override 
    public void popupMenuCanceled(PopupMenuEvent e) { 
    } 
} 
+0

這使我的箱子只在第一次點擊時閃爍並關閉。 工作原理:列表從開始顯示「選擇汽車」。點擊時只有汽車出現。 – Grains 2013-05-10 08:52:10

+0

我已經更新了我的答案 – 2013-05-10 09:03:31

+0

很棒!謝謝! – Grains 2013-05-10 09:07:02

0

嘗試mousePressed()mouseReleased()或事件,而不是mouseClicked()事件。您還必須repaint()才能使更改可見。

 @Override 
     public void mousePressed(MouseEvent e) { 
      System.out.println("Pressed"); 
      if(box.getItemCount() == 1){ 
       box.removeAllItems(); 
       box.addItem("item 1"); 
       box.addItem("item 2"); 
       box.addItem("item 3"); 
       repaint(); 
      } 
     } 
+0

移動到mousePressed並添加重繪(),但仍然是相同的結果。 – Grains 2013-05-10 08:49:20

1

我有一個JComboBox,與只有一個初始值,並有一個 的MouseListener連接到它。當我點擊將JcomboBox我填滿它 一些新的價值觀

  1. Item(縣)JComboBox上運行時,可以添加/刪除/修改成在XxxComboBoxModel只有

  2. 使用DefaultComboBoxModel您將更改所有項目的情況

  3. 使用MutableComboBoxModel用於添加/刪除/修改運行時項目

+0

試過,但仍然相同的結果: 'code' @覆蓋 \t公共無效的mousePressed(的MouseEvent E){ \t \t如果(box.getItemCount()== 1){ \t \t \t字符串[] newData = {」 ITEM1" , 「ITEM2」, 「項目3」}; \t \t \t DefaultComboBoxModel model = new DefaultComboBoxModel(newData); box.setModel(model); \t \t} \t}'code' – Grains 2013-05-10 09:04:15