2016-01-05 41 views
1

我编写了下面的代码,让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()) 
    } 
}); 
+0

MyAction做什么? – Berger

+0

不知道没有你的SSCCE/MCVE,短的,可运行的,可编译的 – mKorbel

+0

有没有理由使用JPanel,因为BasicsPopup ...在默认情况下在API中具有BoxLayout,否则使用JWindow(仅重用一个,HIDE_ON_CLOSE,使用setVisible包装到invokeLater中) – mKorbel

回答

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

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