2013-05-10 130 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