MouseAdapter 中 isPopupTrigger() 的正确处理是什么

what is the correct handling of isPopupTrigger() in MouseAdapter

我需要编写一个 Java Swing 应用程序,它将 运行 并在 Linux、Windows 和 Mac 上执行大致相同的操作。对于我创建的几乎所有小部件,我需要添加一些特殊处理,包括所有内容都需要能够在被询问时弹出菜单。甚至像标签和按钮这样的小部件。

我可以通过添加以下内容来捕获菜单请求:

    MouseListener m = new MouseAdapter() {
      @Override
        public void mousePressed(MouseEvent e)
        {
          if (e.isPopupTrigger())
          {
            onMenuSummons(); //do my thing
          }
        }
    };
    addMouseListener(m);

我的扩展小部件上的构造函数。

但我担心这是一个仅 Linux 的解决方案。我只需要检查 MousePressed 中的 isPopupEvent() 吗?鼠标点击怎么样?我可以确定两者都挂钩,但是我是否 运行 某天某个平台的 isPopupEvent() 对于相同的鼠标操作在两个函数中都为 true 的风险?

理想情况下,MouseAdapter 会通过提供可覆盖的 popupRequest(MouseEvent e) 来解决我的问题,但事实并非如此。那么什么是永远正确、适用于所有平台、永远永远的解决方案?

此外,我正在扩展的一些小部件可能有自己的弹出菜单;我需要压制那些并实施我自己的。如何确保只显示我自己的菜单? TIA.

阅读 Swing 教程中关于 Bringing up a Popup Menu 的部分,了解使用菜单和弹出菜单的基础知识。

编写 MouseListener 的基本代码是:

class PopupListener extends MouseAdapter {
    public void mousePressed(MouseEvent e) {
        maybeShowPopup(e);
    }

    public void mouseReleased(MouseEvent e) {
        maybeShowPopup(e);
    }

    private void maybeShowPopup(MouseEvent e) {
        if (e.isPopupTrigger()) {
            popup.show(e.getComponent(),
                       e.getX(), e.getY());
        }
    }
}

some of the widgets I'm extending may have their own popup menus; I need to suppress those and implement my own.

另请注意教程中的示例较旧。向组件添加弹出菜单的新方法是使用:

component.setComponentPopupMenu(....);

不确定,但由于此方法只允许一个弹出窗口,它可能会替换默认弹出窗口吗?