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

问题

我正在创建一个右键单击上下文菜单,通过右键单击实例化newJMenu并将其位置设置为鼠标位置...有更好的方法吗?


#1 热门回答(134 赞)

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

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

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

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

然后,你需要做的就是将customMouseListener添加到你希望弹出菜单的组件中。

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());

当然,教程有aslightly more in-depth解释。

**注释:**如果你注意到弹出菜单显示在用户单击的位置,请尝试使用e.getXOnScreen()e.getYOnScreen()方法作为x和y坐标。


#2 热门回答(108 赞)

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

用于在Swing中设置popupMenu的当前api是

myComponent.setComponentPopupMenu(myPopupMenu);

这样,它将自动显示,包括鼠标和键盘触发器(后者取决于LAF)。此外,它支持在容器的子项中重复使用相同的弹出窗口。要启用该功能:

myChild.setInheritsPopupMenu(true);

#3 热门回答(18 赞)

在234697513224799873文章中有一个部分是关于如何使用JPopupMenu类的。

本教程中的示例代码显示了如何将MouseListener添加到应显示弹出菜单的组件,并相应地显示菜单。

(你描述的方法与教程提供在组件上显示弹出菜单的方式非常相似。)