组件及其内容上的Swing弹出菜单

时间:2014-08-05 08:17:29

标签: java swing mouselistener jpopup

我有一个组件(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);
    }

感谢您的任何提示。

1 个答案:

答案 0 :(得分:3)

首先:您不需要使用鼠标监听器。每个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);
        }
    }
}