Актуализирайте JComboBox popupMenu

Имам JComboBox само с една стойност в началото и имам един MouseListener, свързан към него. Когато щракна върху JComboBox, го запълвам с някои нови стойности. Но изскачащото меню е с размер на един елемент при първото щракване върху 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) {}
}

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(новиДанни); 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