问题
我正在创建一个右键单击上下文菜单,通过右键单击实例化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
添加到应显示弹出菜单的组件,并相应地显示菜单。
(你描述的方法与教程提供在组件上显示弹出菜单的方式非常相似。)