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

JPopupMenu gets closed as soon as the mouse enters in an embedded JCheckboxMenuItem

我编写了以下代码来实现一个 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())
    }
});

这就是 JPopupMenus 的本质。当调用程序组件失去焦点时,它们就会消失。不过我发现了一个小技巧here.
创建您自己的 class 并从 JPopupMenu 扩展它。然后覆盖 setVisible 方法,它只会将 true 转发给超级 class 并创建一个自己的方法,将超级 class 的 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());
    }
});

现在单击按钮即可显示。在下次单击按钮之前,它将保持可见。