【问题标题】:JPopupMenu gets closed as soon as the mouse enters in an embedded JCheckboxMenuItem一旦鼠标进入嵌入的 JCheckboxMenuItem,JPopupMenu 就会关闭
【发布时间】:2016-04-09 01:42:57
【问题描述】:

我编写了以下代码来拥有一个 JPopupMenu,它允许对不同的项目进行多项选择。 问题是,一旦鼠标进入显示的 JCheckboxMenuItem 之一,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())
    }
});

【问题讨论】:

  • MyAction 是做什么的?
  • 没有你的 SSCCE / MCVE 不知道,简短,可运行,可编译
  • 有没有理由使用JPanel,因为BasicsPopup...,API中默认有BoxLayout,否则要使用JWindow(只复用一个,HIDE_ON_CLOSE,玩setVisible(true/false),包裹成调用后)
  • @Berger MyAction 是一个扩展 AbstractAction 的类,除了设置标签之外,它还简单地覆盖了与每个 JCheckboxMenuItem 关联的 actionPerformed() 方法。
  • @Berger 它只是显示/隐藏链接到菜单项的对象。但我认为问题不在于操作,因为弹出窗口在调用操作之前已关闭,即只需将鼠标光标移动到菜单项上。

标签: java swing jpopupmenu multipleselection


【解决方案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());
    }
});

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 2018-08-15
    • 2011-03-14
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多