更新JComboBox popupMenu

时间:2013-05-10 08:28:01

标签: java swing jcombobox

我有一个JComboBox,一开始只有一个值,并且有一个MouseListener连接到它。当我点击JComboBox时,我会用一些新值填充它。但是popupMenu在JComboBox上第一次点击时的大小就是一个元素。第二次所有值都显示为正常。 知道如何在更新内容后直接更新comboBox的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) {}
}

3 个答案:

答案 0 :(得分: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) {
    }
}

答案 1 :(得分:1)

  

我有一个JComboBox,在开始时只有一个值,并且有一个   MouseListener连接到它。当我点击JComboBox时,我填写它   有一些新的值

    运行时
  1. ItemJComboBox只能添加/删除/修改为​​XxxComboBoxModel

  2. 如果您要更改所有商品,请使用DefaultComboBoxModel

  3. 使用MutableComboBoxModel在运行时添加/删除/修改项目

答案 2 :(得分: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();
             }
        }