如何防止通过单击 JPopupMenu 外部来关闭 JPopupMenu 时触发其他事件?
我想用 JPopupMenu 复制右键单击上下文菜单的一些属性:
- 当菜单打开并单击其他位置时,菜单将关闭。
- 当菜单打开并单击其他位置时,不会发生其他情况。
我已经把第一部分写得很好了。但是当我单击其他地方时,可能会发生其他事件。例如,假设我有按钮 A,它执行某些操作 B。当前,如果 JPopupMenu 打开,并且我单击 A,则 JPopupMenu 关闭并执行 B。我希望 JPopupMenu 关闭并且 B 不被执行。这可能吗?
谢谢
There are some properties of the right-click context menu I would like to replicate with a JPopupMenu:
- When menu is open and you click elsewhere, menu closes.
- When menu is open and you click elsewhere, nothing else happens.
I've got the first part down just fine. But when I click elsewhere, other events can occur. For instance, lets say I have button, A, which performs some action, B. Currently, if the JPopupMenu is open, and I click A, the JPopupMenu closes and B is performed. I would prefer that JPopupMenu close and B NOT be performed. Is this possible?
Thanks
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这有效,并且更简单......尽管可能会被某些外观和感觉覆盖。
还值得注意的是,这仅消耗了 MOUSE_PRESSED 事件,后续的 MOUSE_CLICKED 事件不会被消耗。您可以通过在 mousePressed() 中设置标志并在 mouseReleased() 中测试它来模拟鼠标单击。如果初始按下的鼠标被消耗,则不会在 mouseReleased() 中设置该标志
This works, and is a lot simpler... although could be overridden by some look and feels.
It is also worth noting this only consumes the MOUSE_PRESSED event, the subsequent MOUSE_CLICKED event is not consumed. You can emulate mouse clicked by setting flag in mousePressed() and testing it in mouseReleased(). If the initial mouse pressed is consumed then the flag won't be set in the mouseReleased()
考虑到您的问题和评论中所说的内容,我将通过以下方式之一解决您的问题。
从技术上讲,您在这里有两个选择:
1.每当用户将鼠标移到弹出窗口之外时隐藏弹出窗口。这样您就不会遇到用户点击的问题,因为弹出窗口会自行消失。
2.全局捕获这个特定的鼠标事件,如果弹出窗口可见,则在左键单击时使用该事件。我在下面的示例中展示了这个特定的解决方案。
您可以通过右键单击按钮左侧来测试示例,然后将显示弹出窗口。然后,如果您单击该按钮,则不会调用其操作。如果弹出窗口隐藏,则通常会调用该操作。此功能由以下代码行
Toolkit.getDefaultToolkit().addAWTEventListener(...)
提供。您可以注释掉该行并观察到该操作在您当前遇到的任何情况下都会发生。Taking into account what was said in your question and comments, I would approach your problem in one of the following ways.
Technically you have two options here:
1.Hide the popup whenever user moves the mouse outside of the popup. This way you do not have the problem of user clicking since the popup will disappear itself.
2.Capture this particular mouse event globally and consume the event on left click if the popup is visible. I show this particular solution in the example below.
You can test the example by right clicking slightly on the left of the button then the popup will show. Then if you click over the button its action will not be called. The action is called normally if the popup is hidden. This functionality is provided by the following line of code
Toolkit.getDefaultToolkit().addAWTEventListener(...)
. You can comment out the line and observe that then the action will occur in any case as you experience it currently.