Java 一旦鼠标进入嵌入式JCheckboxMenuItem,JPopupMenu就会关闭

Java 一旦鼠标进入嵌入式JCheckboxMenuItem,JPopupMenu就会关闭,java,swing,jpopupmenu,multipleselection,Java,Swing,Jpopupmenu,Multipleselection,我编写了下面的代码来创建一个JPopupMenu,它允许对不同的项目进行多个选择。 问题是,一旦鼠标进入其中一个显示的JCheckboxMenuItems,JPopupMenu就会关闭。如果我将JCheckboxMenuItem替换为例如JLabel,则不会出现此问题,但可以肯定的是,JLabel不能满足我的需要。 你知道什么会引发这个问题吗?你知道如何更好地解决这个问题吗?我为这个新手问题道歉,但我不是java开发人员。提前感谢您的帮助 JPanel panel = new JPanel();

我编写了下面的代码来创建一个JPopupMenu,它允许对不同的项目进行多个选择。 问题是,一旦鼠标进入其中一个显示的JCheckboxMenuItems,JPopupMenu就会关闭。如果我将JCheckboxMenuItem替换为例如JLabel,则不会出现此问题,但可以肯定的是,JLabel不能满足我的需要。 你知道什么会引发这个问题吗?你知道如何更好地解决这个问题吗?我为这个新手问题道歉,但我不是java开发人员。提前感谢您的帮助

JPanel panel = new JPanel();
panel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedborder(),"Select Layers");
panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
for (MyAction layer : layers) {
    JCheckBoxMenuItem box = new JCheckBoxMenuItem(layer);
    box.setIcon(new SquareIcon(myColor));
    panel.add(box);
}

JPopup popup = new JidePopup();
popup.add(panel)

JButton button = new JButton("Layers");
button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        popup.show(button,0,button.getHeight())
    }
});

这是
jpoppemenus
的本质。当调用程序组件失去焦点时,它们就会消失。但我发现了一个小把戏。
创建您自己的类并从
jpopumenu
扩展它。然后重写
setVisible
方法,该方法只将
true
转发到超类,并创建自己的方法,该方法将
setVisible
的超类设置为false

public class StayOpenPopup extends JPopupMenu{
    public void setVisible(boolean visible){
        if(visible == true)
            super.setVisible(visible);
    }

    public void disappear() {
        super.setVisible(false);
    }
}
然后在代码中像这样使用它

[...]
StayOpenPopup popup = new StayOpenPopup();
popup.add(panel);
[...]
button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        if(popup.isVisible())
            popup.disappear();
        else popup.show(button,0,button.getHeight());
    }
});

现在点击按钮就会显示出来。它将一直可见,直到下一次单击按钮。

MyAction做什么?不知道没有您的SSCCE/MCVE、简短、可运行、可编译。是否有理由使用JPanel,因为BasicsPopup…,默认情况下API中有BoxLayout,否则使用JWindow(仅重用一个,在关闭时隐藏,使用setVisible(真/假)@Berger MyAction是一个扩展AbstractAction的类,除了设置其标签外,它还简单地重写与每个JCheckboxMenuItem关联的actionPerformed()方法。@Berger它简单地显示/隐藏链接到菜单项的对象。但我认为问题不在于操作,因为在调用操作之前弹出窗口会关闭,也就是说,只需将鼠标光标移动到菜单项上。