只要鼠标进入嵌入式JCheckboxMenuItem,JPopupMenu就会关闭

时间:2016-01-05 09:28:33

标签: java swing jpopupmenu multipleselection

我编写了以下代码,以获得一个允许多个不同项目选择的JPopupMenu。 问题是,只要鼠标进入其中一个显示的JCheckboxMenuItems,JPopupMenu就会关闭。如果我用例如JLabel替换JCheckboxMenuItem但不会发生此问题,但是,肯定的是,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())
    }
});

1 个答案:

答案 0 :(得分:1)

这就是JPopupMenus的性质。当调用程序组件失去焦点时,它们会消失。但我发现了一个小技巧here 创建自己的类并从JPopupMenu扩展它。然后覆盖它只会将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());
    }
});

现在只需点击一下按钮即可显示。它会保持可见,直到下次点击按钮。