如何在Java Swing中创建右键单击上下文菜单?

2022-08-31 09:15:51

我目前正在创建一个右键单击上下文菜单,方法是在右键单击时实例化一个新的菜单,并将其位置设置为鼠标位置的位置...有没有更好的方法?JMenu


答案 1

您可能正在手动调用菜单上的呼叫。这可能会导致菜单中出现一些令人讨厌的错误行为。setVisible(true)

该方法处理您需要发生的所有事情(在鼠标悬停时突出显示内容并在必要时关闭弹出窗口),其中 use 仅显示菜单而不添加任何其他行为。show(Component, int x, int x)setVisible(true)

要创建右键单击弹出菜单,只需创建一个JPopupMenu

class PopUpDemo extends JPopupMenu {
    JMenuItem anItem;
    public PopUpDemo() {
        anItem = new JMenuItem("Click Me!");
        add(anItem);
    }
}

然后,您需要做的就是将自定义MouseListener添加到您希望弹出菜单的组件中。

class PopClickListener extends MouseAdapter {
    public void mousePressed(MouseEvent e) {
        if (e.isPopupTrigger())
            doPop(e);
    }

    public void mouseReleased(MouseEvent e) {
        if (e.isPopupTrigger())
            doPop(e);
    }

    private void doPop(MouseEvent e) {
        PopUpDemo menu = new PopUpDemo();
        menu.show(e.getComponent(), e.getX(), e.getY());
    }
}

// Then on your component(s)
component.addMouseListener(new PopClickListener());

当然,教程有一个稍微深入的解释。

注意:如果您注意到弹出菜单的显示距离用户单击的位置相距甚远,请尝试对 x 和 y 坐标使用 and 方法。e.getXOnScreen()e.getYOnScreen()


答案 2

这个问题有点旧 - 答案(以及教程)也是如此

在 Swing 中设置弹出菜单的当前 API 是

myComponent.setComponentPopupMenu(myPopupMenu);

这样,鼠标和键盘触发器(后者取决于LAF),它将自动显示。此外,它还支持在容器的子级中重用相同的弹出窗口。要启用该功能,请执行以下操作:

myChild.setInheritsPopupMenu(true);

推荐