JPopupMenu在鼠标进入嵌入式JCheckboxMenuItem后立即关闭
问题描述:
我编写了下面的代码,让JPopupMenu允许多个不同项目的选择。 问题是,只要鼠标进入显示的JCheckboxMenuItems之一,JPopupMenu就会关闭。如果我将JCheckboxMenuItem替换为JLabel,但是肯定不会出现此问题,但JLabel不适用于我的目的。 任何可能引发此问题的想法?任何想法如何以更好的方式解决这个问题?我为新手问题表示歉意,但我不是Java开发人员。预先感谢您的帮助。JPopupMenu在鼠标进入嵌入式JCheckboxMenuItem后立即关闭
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。
创建您自己的课程并从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());
}
});
现在按钮点击会显示它。它将保持可见,直到下一次点击按钮。
MyAction做什么? – Berger
不知道没有你的SSCCE/MCVE,短的,可运行的,可编译的 – mKorbel
有没有理由使用JPanel,因为BasicsPopup ...在默认情况下在API中具有BoxLayout,否则使用JWindow(仅重用一个,HIDE_ON_CLOSE,使用setVisible包装到invokeLater中) – mKorbel