【问题标题】:Swing popup menu on a component and its content组件及其内容的 Swing 弹出菜单
【发布时间】:2014-08-05 08:17:28
【问题描述】:

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

感谢您的任何提示。

【问题讨论】:

    标签: java swing mouselistener jpopup


    【解决方案1】:

    首先:您不需要使用鼠标监听器。每个 JComponent 都有方法 setComponentPopupMenu(JPopupMenu)。第二:可以遍历组件树,为每个组件注册弹出菜单。

    示例如下:

    /**
     * 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);
            }
        }
    }
    

    【讨论】:

    • 像魅力一样工作。谢谢!
    • 有点不同意容器内的循环,在 JComponents 注册 (+1) setComponentPopupMenu(JPopupMenu) 之后,可以通过将 PopupMenuListener 添加到 JPopupMenu 来完成所有内容(例如添加/删除/更改/在 popupMenuWillBecomeVisible 中管理 JPopupMenu 中的 Items,因为 event.getSource();返回.....,编辑 :-) 使用 source.getInvoker();
    猜你喜欢
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多