Java 如何在填充JComboBox时使其弹出菜单保持打开状态?

Java 如何在填充JComboBox时使其弹出菜单保持打开状态?,java,swing,combobox,applet,jcombobox,Java,Swing,Combobox,Applet,Jcombobox,我的面板上有一个JComboBox。其中一个弹出菜单项是“更多”,当我单击它时,我会获取更多菜单项并将它们添加到现有列表中。在此之后,我希望保持弹出菜单打开,以便用户意识到已获取更多项目,但是,弹出窗口关闭。我使用的事件处理程序代码如下 public void actionPerformed(ActionEvent e) { if (e.getSource() == myCombo) { JComboBox selectedBox = (JComb

我的面板上有一个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);
        }
    }
public void actionPerformed(ActionEvent e)
{
如果(例如getSource()==myCombo){
JComboBox selectedBox=(JComboBox)e.getSource();
字符串项=(字符串)selectedBox.getSelectedItem();
if(item.toLowerCase().equals(“更多”)){
获取项目(selectedBox);
}
selectedBox.showPopup();
selectedBox.setPopupVisible(真);
}
}
私有void fetchItems(JComboBox)
{
box.removeAllItems();
/*获取项目并将其存储在集合项目中的代码*/
用于(字符串s:项){
框.增补项;
}
}

我不明白为什么showPopup()和setPopupVisible()方法不能按预期工作。

在fetchItems方法中添加以下行

SwingUtilities.invokeLater(new Runnable(){

    public void run()
    {

       box.showPopup();
    }
}


如果您调用selectedBox.showPopup();在invokelater内部,它也可以工作。

覆盖JCombobox设置PopupVisible metod

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

我找到了一些简单的方法来保持弹出窗口的打开。它可能对一些定制的JComboBox很有用,比如我在项目中使用的JComboBox,但有点粗糙。

公共类MyComboBox扩展了JComboBox
{
布尔值keep_open_flag=false;//当该标志=true时,弹出窗口将保持打开状态
公共邮箱(){
keep_open_flag=true;//在需要的地方设置该标志
setRenderer(新的MyComboxRenderer());//我们的特殊渲染
}
类MyComboxRenderer扩展了BasicComboxRenderer{
公共组件GetListCellRenderComponent(JList列表、对象值、,
整型索引,布尔型isSelected,布尔型cellHasFocus){
如果(索引==-1){//如果弹出窗口隐藏
if(keep_open_flag)showPopup();//再次显示
}
}
}
}

谢谢。。成功了。我必须创建一个实现Runnable接口的新内部类,并将JComboBox实例传递给内部类的构造函数,因为run()中的box对象将超出fetchItems()函数的作用域。@Stormshadow:不,您不需要创建内部类;一个更简单的解决方案是将box声明为final:private void fetchItems(final JComboBox)。那么这个答案中的代码就可以完美地工作了。
jComboBox1 = new javax.swing.JComboBox(){
@Override
public void setPopupVisible(boolean v) {
    super.setPopupVisible(true); //To change body of generated methods, choose Tools | Templates.
}