java - 一旦鼠标进入嵌入的 JCheckboxMenuItem,JPopupMenu 就会关闭

标签 java swing jpopupmenu multipleselection

我编写了以下代码来获得一个允许多次选择不同项目的 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/

相关文章:

java - 如何动态地将按钮添加到 jtoolbar

java - 如何在JComboBox中显示自定义PopupMenu

java - JPopupMenu 不显示 JMenuItem 的文本

java - 如何将整数元素添加到泛型通配符的ArrayList中?

java - 如何在 Eclipse 中更新到最新版本的 Android 支持库?

用于仿真的 Java Swing

java - 卡在绘制一组数据点 (x,y) 上

java - jtable 行的动态(真实)上下文菜单

java - 为什么访问 Tomcat 上的文件(使用 HttpServlet)时得到空指针?

java - 设计模式以避免传递不必要的参数?