Обновить всплывающее меню JComboBox

У меня есть JComboBox только с одним значением в начале, и к нему подключен один MouseListener. Когда я нажимаю на JComboBox, я заполняю его новыми значениями. Но popupMenu имеет размер одного элемента при первом нажатии на JComboBox. Во второй раз все значения будут отображаться как обычно. Любая идея, как я могу заставить comboBox обновить свое всплывающее меню сразу после того, как я обновил его содержимое?

Пример программы:

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) {}
}

person Grains    schedule 10.05.2013    source источник


Ответы (3)


Я думаю, что это лучшее решение:

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) {
    }
}
person Ricardo Cacheira    schedule 10.05.2013
comment
Это заставляет мою коробку мигать и закрываться только при первом нажатии. Как это работает: В списке отображается Выберите автомобиль с самого начала. При нажатии должны отображаться только автомобили. - person Grains; 10.05.2013

У меня есть JComboBox только с одним значением в начале, и к нему подключен один MouseListener. Когда я нажимаю на JComboBox, я заполняю его новыми значениями.

  1. Item(s) до JComboBox во время выполнения можно было добавить/удалить/изменить только в XxxComboBoxModel

  2. используйте DefaultComboBoxModel в случае, если вы измените все элементы

  3. используйте MutableComboBoxModel для добавления/удаления/изменения элементов во время выполнения

person mKorbel    schedule 10.05.2013
comment
Пробовал это, но результат тот же: code@Override public void mousePressed(MouseEvent e) { if(box.getItemCount() == 1){ String[] newData = {item1,item2,item3}; Модель DefaultComboBoxModel = новая DefaultComboBoxModel(newData); box.setModel (модель); } }code - person Grains; 10.05.2013

Попробуйте использовать события 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();
             }
        }
person prasanth    schedule 10.05.2013
comment
Перемещено в mousePressed и добавлено repaint(), но результат тот же. - person Grains; 10.05.2013