我编写了以下代码来获得一个允许多次选择不同项目的 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 .
创建您自己的类并从 JPopupMenu
扩展它。然后重写 setVisible
方法,它只会将 true
转发给父类(super class),并创建一个自己的方法,将父类(super 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());
}
});
现在,单击按钮即可显示它。并且它将保持可见,直到下次单击按钮。
关于java - 一旦鼠标进入嵌入的 JCheckboxMenuItem,JPopupMenu 就会关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34608190/