我编写了以下代码,以获得一个允许多个不同项目选择的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())
}
});
答案 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());
}
});
现在只需点击一下按钮即可显示。它会保持可见,直到下次点击按钮。