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

4 回答 4

7

在 fetchItems 方法中添加以下行

SwingUtilities.invokeLater(new Runnable(){

    public void run()
    {

       box.showPopup();
    }

}

如果你调用 selectedBox.showPopup(); 在invokelater里面它也可以工作。

于 2010-05-06T05:54:48.307 回答
1

覆盖 JCombobox setPopupVisible 方法

public void setPopupVisible(boolean v) {
    if(v)
        super.setPopupVisible(v);
}
于 2014-01-23T12:08:19.853 回答
1

我找到了一些简单的解决方案来始终保持弹出窗口打开。它可能对一些自定义 JComboBox 很有用,比如我在项目中使用的 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
            }
        }
    }
}
于 2016-10-07T00:53:42.600 回答
0
jComboBox1 = new javax.swing.JComboBox(){
@Override
public void setPopupVisible(boolean v) {
    super.setPopupVisible(true); //To change body of generated methods, choose Tools | Templates.
}

};

于 2014-11-28T12:21:57.760 回答