我有一个组件(Widget -扩展一个JPanel),我在它上实现了一个简单的弹出菜单。它可以在单击面板的边框时工作,并且基本上在任何地方都可以工作,除了面板布局在面板中包含其他组件的地方。
因此,如果面板中有一个JTable,我可以在单击它旁边的菜单时调用它(如果没有其他的),但是当单击JTable时,什么都不会发生(该表显然位于面板的顶部,阻止MouseAdapter注册单击)。
当右键单击面板中的组件时,我可以以某种方式调用弹出菜单吗?下面是我如何创建和调用菜单的示例代码:
private void initPopupMenu() {
popup = new JPopupMenu();
JMenuItem closeItem = new JMenuItem("Close");
closeItem.setActionCommand(WidgetConstants.Actions.CLOSE.name());
closeItem.addActionListener(this);
popup.add(closeItem);
JMenuItem minimizeItem = new JMenuItem("Minimize");
minimizeItem.setActionCommand(WidgetConstants.Actions.MINIMIZE.name());
minimizeItem.addActionListener(this);
popup.add(minimizeItem);
}
MouseInputListener componentListener = new MouseInputAdapter() {
@Override
public void mousePressed(MouseEvent me) {
// popup
if (me.isPopupTrigger()) {
popup.show(me.getComponent(), me.getX(), me.getY());
}
}
@Override
public void mouseReleased(MouseEvent ev) {
if (ev.isPopupTrigger()) {
popup.show(ev.getComponent(), ev.getX(), ev.getY());
}
}
}
@Override
public void setBorder(Border border) {
removeMouseListener(componentListener);
removeMouseMotionListener(componentListener);
if (border instanceof WidgetBorder) {
addMouseListener(componentListener);
addMouseMotionListener(componentListener);
}
super.setBorder(border);
}谢谢你的建议。
发布于 2014-08-05 08:51:30
首先:您不需要使用鼠标侦听器。每个JComponent都有setComponentPopupMenu(JPopupMenu)方法。Secon:您可以遍历组件树,注册每个组件的弹出菜单。
下面是一个例子:
/**
* Provides component hierarchy traversal.
*
* @param aContainer start node for the traversal.
*/
private void traverse(Container aContainer, JPopupMenu aMenu) {
for (final Component comp : aContainer.getComponents()) {
if (comp instanceof JComponent) {
((JComponent) comp).setComponentPopupMenu(aMenu);
}
if (comp instanceof Container) {
traverse((Container) comp, aMenu);
}
}
}https://stackoverflow.com/questions/25134108
复制相似问题