Roberto
Roberto

Reputation: 243

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

I wrote the following code to have a JPopupMenu that allows multiple selection of different items. The problem is that, as soon as the mouse enters one of the displayed JCheckboxMenuItems, the JPopupMenu gets closed. This issue doesn't occur if I replace JCheckboxMenuItem with, for example, JLabel but, for sure, JLabel doesn't work for my purpose. Any idea of what could trigger this issue? Any idea of how this problem can be resolved in a better way? I apologize for the newbie question but I'm not a java developer. Thanks in advance for any help.

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())
    }
});

Upvotes: 2

Views: 200

Answers (1)

ArcticLord
ArcticLord

Reputation: 4039

Thats in the nature of JPopupMenus. They disappear when the invoker component loses the focus. But I found a little trick here.
Create your own class and extend it from JPopupMenu. Then override the setVisible method that it will only forward true to the super class and create an own method that will setVisible of the super class to false.

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

    public void disappear() {
        super.setVisible(false);
    }
}

Then use it like this in your code

[...]
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());
    }
});

Now one click on button will show it. And it will stay visible until next click on Button.

Upvotes: 1

Related Questions