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