(Java)如果我在其外面点击,JPopupMenu将不会关闭

Dan*_*ing 7 java

我创建了一个Java Swing应用程序,该应用程序没有可见的主窗口,但通过右键单击可通过其托盘图标进行控制.

我正在使用JPopupMenu,但是当我在弹出菜单外单击时(例如在另一个应用程序的窗口或桌面上),JPopupMenu不会消失,这不是预期的行为.

最初我使用的是popupMenu,它按预期工作,但这不允许我在菜单中有图标.

如我所说,当我点击其他地方时,如何让它关闭?

谢谢!

小智 6

//_Popup is your JPopupMenu, call this method before setting your popup to visible
public void armPopup()
{
    if(_Popup != null)
    {
        Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener()
        {
            @Override
            public void eventDispatched(AWTEvent event) {

                if(event instanceof MouseEvent)
                {
                    MouseEvent m = (MouseEvent)event;
                    if(m.getID() == MouseEvent.MOUSE_CLICKED)
                    {
                        _Popup.setVisible(false);
                        Toolkit.getDefaultToolkit().removeAWTEventListener(this);
                    }
                }
                if(event instanceof WindowEvent)
                {
                    WindowEvent we = (WindowEvent)event;
                    if(we.getID() == WindowEvent.WINDOW_DEACTIVATED || we.getID() == WindowEvent.WINDOW_STATE_CHANGED)
                    {
                        _Popup.setVisible(false);
                        Toolkit.getDefaultToolkit().removeAWTEventListener(this);
                    }
                }
            }

        }, AWTEvent.MOUSE_EVENT_MASK | AWTEvent.WINDOW_EVENT_MASK);

    }
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*ing 2

最后我通过解决这个问题“解决”了这个问题。正如 Camickr 指出的那样,JPopupMenu 存在很多问题。然而,它是唯一允许您在每个菜单元素旁边有一个图标的 Swing 弹出菜单实现。

我的解决方案是在 jpopupmenu 上实现一个监听器,如果用户将鼠标放在菜单上,3 秒后如果用户没有在这段时间内将鼠标放回菜单上,它将设置为 .isVisible(false) 。

为了实现这一点,我必须使用一个单独的线程来不断检查弹出菜单是否处于活动状态。如果是这样,请使用事件侦听器检查鼠标是否位于其上方,如果用户在 3 秒内未再次输入,则将可见性设置为 false。

这不是一个完美的解决方案,因为用户仍然需要等待 3 秒菜单才能消失(如果他/她点击离开,菜单应该立即消失),即使焦点处于焦点,菜单也会消失(除非用户点击,否则菜单不会消失)离开)。然而,它感觉“足够好”,可以被接受。

希望有帮助。