一旦鼠标进入嵌入式 JCheckboxMenuItem,JPopupMenu 就会关闭
JPopupMenu gets closed as soon as the mouse enters in an embedded JCheckboxMenuItem
我编写了以下代码来实现一个 JPopupMenu,它允许对不同的项目进行多项选择。
问题是,一旦鼠标进入显示的 JCheckboxMenuItems 之一,JPopupMenu 就会关闭。如果我将 JCheckboxMenuItem 替换为 JLabel 等,则不会出现此问题,但可以肯定的是,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())
}
});
这就是 JPopupMenus
的本质。当调用程序组件失去焦点时,它们就会消失。不过我发现了一个小技巧here.
创建您自己的 class 并从 JPopupMenu
扩展它。然后覆盖 setVisible
方法,它只会将 true
转发给超级 class 并创建一个自己的方法,将超级 class 的 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());
}
});
现在单击按钮即可显示。在下次单击按钮之前,它将保持可见。
我编写了以下代码来实现一个 JPopupMenu,它允许对不同的项目进行多项选择。 问题是,一旦鼠标进入显示的 JCheckboxMenuItems 之一,JPopupMenu 就会关闭。如果我将 JCheckboxMenuItem 替换为 JLabel 等,则不会出现此问题,但可以肯定的是,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())
}
});
这就是 JPopupMenus
的本质。当调用程序组件失去焦点时,它们就会消失。不过我发现了一个小技巧here.
创建您自己的 class 并从 JPopupMenu
扩展它。然后覆盖 setVisible
方法,它只会将 true
转发给超级 class 并创建一个自己的方法,将超级 class 的 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());
}
});
现在单击按钮即可显示。在下次单击按钮之前,它将保持可见。