Как сохранить всплывающее меню JComboBox открытым при его заполнении? - PullRequest
2 голосов
/ 06 мая 2010

У меня на панели есть JComboBox. Одним из элементов всплывающего меню является «Еще», и когда я нажимаю, я выбираю дополнительные пункты меню и добавляю их в существующий список. После этого я хочу оставить всплывающее меню открытым, чтобы пользователь понял, что было выбрано больше элементов, однако всплывающее окно закрывается. Код обработчика событий, который я использую, выглядит следующим образом

public void actionPerformed(ActionEvent e)
    {
        if (e.getSource() == myCombo) {
            JComboBox selectedBox = (JComboBox) e.getSource();
            String item = (String) selectedBox.getSelectedItem();
            if (item.toLowerCase().equals("more")) {
                fetchItems(selectedBox);
            }
            selectedBox.showPopup();
            selectedBox.setPopupVisible(true);
        }
    }



private void fetchItems(JComboBox box)
    {
        box.removeAllItems();
        /* code to fetch items and store them in the Set<String> items */
        for (String s : items) {
            box.addItem(s);
        }
    }

Я не понимаю, почему методы showPopup () и setPopupVisible () не работают должным образом.

Ответы [ 4 ]

4 голосов
/ 06 мая 2010

добавить следующую строку в метод fetchItems

SwingUtilities.invokeLater(new Runnable(){

    public void run()
    {

       box.showPopup();
    }

}

Если вы вызываете selectedBox.showPopup (); Внутри invokelater также будет работать.

1 голос
/ 23 января 2014

перезаписать набор JComboboxPopupVisible метод

public void setPopupVisible(boolean v) {
    if(v)
        super.setPopupVisible(v);
}
0 голосов
/ 07 октября 2016

Я нашел простое решение, чтобы всегда держать всплывающее окно открытым. Это может быть полезно с некоторыми пользовательскими JComboBox'ами, такими как тот, что у меня есть в моем проекте, но немного хакерский.

public class MyComboBox extends JComboBox
{
    boolean keep_open_flag = false; //when that flag ==true, popup will stay open

    public MyComboBox(){
        keep_open_flag = true; //set that flag where you need
        setRenderer(new MyComboBoxRenderer()); //our spesial render
    }

    class MyComboBoxRenderer extends BasicComboBoxRenderer {

        public Component getListCellRendererComponent(JList list, Object value, 
            int index, boolean isSelected, boolean cellHasFocus) {

            if (index == -1){ //if popup hidden
                if (keep_open_flag) showPopup(); //show it again
            }
        }
    }
}
0 голосов
/ 28 ноября 2014
jComboBox1 = new javax.swing.JComboBox(){
@Override
public void setPopupVisible(boolean v) {
    super.setPopupVisible(true); //To change body of generated methods, choose Tools | Templates.
}

};

...