如何在填充JComboBox时保持弹出菜单打开?

4

我在我的面板上有一个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个回答

7
在fetchItems方法中添加以下行:
SwingUtilities.invokeLater(new Runnable(){

    public void run()
    {

       box.showPopup();
    }

如果您在invokeLater中调用selectedBox.showPopup();,它也会起作用。


谢谢,它起作用了。我不得不创建一个实现Runnable接口的新内部类,并将JComboBox实例传递给内部类的构造函数,因为run()中的box对象在fetchItems()函数中会超出范围。 - Stormshadow
@Stormshadow:你不需要创建一个内部类;一个更简单的解决方案是声明box为final:private void fetchItems(final JComboBox box)。然后这个答案中的代码将完美地工作。 - jfpoilpret

1
jComboBox1 = new javax.swing.JComboBox(){
@Override
public void setPopupVisible(boolean v) {
    super.setPopupVisible(true); //To change body of generated methods, choose Tools | Templates.
}

};


1

覆盖JCombobox的setPopupVisible方法

public void setPopupVisible(boolean v) {
    if(v)
        super.setPopupVisible(v);
}

1

我找到了一些简单的解决方案,可以始终保持弹出窗口处于打开状态。这可能对某些自定义的JComboBox非常有用,就像我在我的项目中使用的那个一样,但是这有点hacky。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接