Java 穿过内部分隔符时是否触发MouseExited事件?

Java 穿过内部分隔符时是否触发MouseExited事件?,java,swing,mouselistener,system-tray,jpopupmenu,Java,Swing,Mouselistener,System Tray,Jpopupmenu,我有一个jpopmpmenu,其中包含一个内部JMenu和一个带有addSeparator()的分隔符。由于一些奇怪的处理,我在jpopmpmenu中添加了一个MouseListener,这使得它在mouseExited事件中不可见。这可以正常工作,但当鼠标试图越过分隔符时,它会触发事件(即使jpopumenu是超级组件) 如果删除addSeparator()行,它将按预期工作 有办法解决这个问题吗?还是我没有正确设置侦听器 代码如下所示: JPopupMenu popupMenu = new

我有一个
jpopmpmenu
,其中包含一个内部
JMenu
和一个带有
addSeparator()
的分隔符。由于一些奇怪的处理,我在
jpopmpmenu
中添加了一个
MouseListener
,这使得它在
mouseExited
事件中不可见。这可以正常工作,但当鼠标试图越过分隔符时,它会触发事件(即使
jpopumenu
是超级组件)

如果删除
addSeparator()
行,它将按预期工作

有办法解决这个问题吗?还是我没有正确设置侦听器

代码如下所示:

JPopupMenu popupMenu = new JPopupMenu();
JMenu innerMenu = new JMenu("Inner");
// ... add JMenuItems
popupMenu.add(innerMenu);
popupMenu.addSeparator();
popupMenu.add(new JMenuItem("Exit"));

popupMenu.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseExited(MouseEvent e) {
        popupMenu.setVisible(false);
    }
});

完整的可编译示例

只需注释并取消注释
popupMenu.addSeparator()
行,即可注意到不同的行为


哇,你正在使用一个系统托盘图标。了解这些信息可能很重要。这就是为什么SSCCE应该发布每个问题的原因

不管怎样,以下方法似乎有效:

if (! popupMenu.contains( e.getPoint() ) )
    popupMenu.setVisible(false);
编辑:

问题似乎是JSepator默认情况下不侦听MouseEvents,因此所有鼠标事件都会传递给其父级。因此,当您离开一个JMenuItem时,会为弹出菜单生成mouseEntered()事件,然后当您重新输入另一个JMenuItem时,会生成mouseExited()事件

如果为jsepator启用MouseEvents,那么jpopumenu似乎无法获取该事件

//popupMenu.addSeparator();
popupMenu.add( new MySeparator() );
...


static class MySeparator extends JSeparator
{
    public MySeparator( )
    {
        super( JSeparator.HORIZONTAL );
        enableEvents(AWTEvent.MOUSE_EVENT_MASK);
    }

    /**
     * Returns the name of the L&F class that renders this component.
     *
     * @return the string "PopupMenuSeparatorUI"
     * @see JComponent#getUIClassID
     * @see UIDefaults#getUI
     */
    public String getUIClassID()
    {
        return "PopupMenuSeparatorUI";

    }
}

哇,你正在使用一个系统托盘图标。了解这些信息可能很重要。这就是为什么SSCCE应该发布每个问题的原因

不管怎样,以下方法似乎有效:

if (! popupMenu.contains( e.getPoint() ) )
    popupMenu.setVisible(false);
编辑:

问题似乎是JSepator默认情况下不侦听MouseEvents,因此所有鼠标事件都会传递给其父级。因此,当您离开一个JMenuItem时,会为弹出菜单生成mouseEntered()事件,然后当您重新输入另一个JMenuItem时,会生成mouseExited()事件

如果为jsepator启用MouseEvents,那么jpopumenu似乎无法获取该事件

//popupMenu.addSeparator();
popupMenu.add( new MySeparator() );
...


static class MySeparator extends JSeparator
{
    public MySeparator( )
    {
        super( JSeparator.HORIZONTAL );
        enableEvents(AWTEvent.MOUSE_EVENT_MASK);
    }

    /**
     * Returns the name of the L&F class that renders this component.
     *
     * @return the string "PopupMenuSeparatorUI"
     * @see JComponent#getUIClassID
     * @see UIDefaults#getUI
     */
    public String getUIClassID()
    {
        return "PopupMenuSeparatorUI";

    }
}

哇,你正在使用一个系统托盘图标。了解这些信息可能很重要。这就是为什么SSCCE应该发布每个问题的原因

不管怎样,以下方法似乎有效:

if (! popupMenu.contains( e.getPoint() ) )
    popupMenu.setVisible(false);
编辑:

问题似乎是JSepator默认情况下不侦听MouseEvents,因此所有鼠标事件都会传递给其父级。因此,当您离开一个JMenuItem时,会为弹出菜单生成mouseEntered()事件,然后当您重新输入另一个JMenuItem时,会生成mouseExited()事件

如果为jsepator启用MouseEvents,那么jpopumenu似乎无法获取该事件

//popupMenu.addSeparator();
popupMenu.add( new MySeparator() );
...


static class MySeparator extends JSeparator
{
    public MySeparator( )
    {
        super( JSeparator.HORIZONTAL );
        enableEvents(AWTEvent.MOUSE_EVENT_MASK);
    }

    /**
     * Returns the name of the L&F class that renders this component.
     *
     * @return the string "PopupMenuSeparatorUI"
     * @see JComponent#getUIClassID
     * @see UIDefaults#getUI
     */
    public String getUIClassID()
    {
        return "PopupMenuSeparatorUI";

    }
}

哇,你正在使用一个系统托盘图标。了解这些信息可能很重要。这就是为什么SSCCE应该发布每个问题的原因

不管怎样,以下方法似乎有效:

if (! popupMenu.contains( e.getPoint() ) )
    popupMenu.setVisible(false);
编辑:

问题似乎是JSepator默认情况下不侦听MouseEvents,因此所有鼠标事件都会传递给其父级。因此,当您离开一个JMenuItem时,会为弹出菜单生成mouseEntered()事件,然后当您重新输入另一个JMenuItem时,会生成mouseExited()事件

如果为jsepator启用MouseEvents,那么jpopumenu似乎无法获取该事件

//popupMenu.addSeparator();
popupMenu.add( new MySeparator() );
...


static class MySeparator extends JSeparator
{
    public MySeparator( )
    {
        super( JSeparator.HORIZONTAL );
        enableEvents(AWTEvent.MOUSE_EVENT_MASK);
    }

    /**
     * Returns the name of the L&F class that renders this component.
     *
     * @return the string "PopupMenuSeparatorUI"
     * @see JComponent#getUIClassID
     * @see UIDefaults#getUI
     */
    public String getUIClassID()
    {
        return "PopupMenuSeparatorUI";

    }
}

发布演示问题的
SSCCE
。@camickr完成。尽可能简洁,即使这是一个复杂的设置。发布你的
SSCCE
,演示问题。@camickr完成。尽可能简洁,即使这是一个复杂的设置。发布你的
SSCCE
,演示问题。@camickr完成。尽可能简洁,即使这是一个复杂的设置。发布你的
SSCCE
,演示问题。@camickr完成。使它尽可能简洁,即使它是一个复杂的设置。是的,工程伟大!谢谢你的解决办法。不过,你知道一开始发生了什么吗?对我来说,这似乎真的很奇怪。没猜到发生了什么事,很有趣。谢谢你的洞察力。很高兴知道。是的,很好用!谢谢你的解决办法。不过,你知道一开始发生了什么吗?对我来说,这似乎真的很奇怪。没猜到发生了什么事,很有趣。谢谢你的洞察力。很高兴知道。是的,很好用!谢谢你的解决办法。不过,你知道一开始发生了什么吗?对我来说,这似乎真的很奇怪。没猜到发生了什么事,很有趣。谢谢你的洞察力。很高兴知道。是的,很好用!谢谢你的解决办法。不过,你知道一开始发生了什么吗?对我来说,这似乎真的很奇怪。没猜到发生了什么事,很有趣。谢谢你的洞察力。很高兴知道。