首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >组件上的Swing弹出菜单及其内容

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

Stack Overflow用户
提问于 2014-08-05 08:17:28
回答 1查看 1.6K关注 0票数 0

我有一个组件(Widget -扩展一个JPanel),我在它上实现了一个简单的弹出菜单。它可以在单击面板的边框时工作,并且基本上在任何地方都可以工作,除了面板布局在面板中包含其他组件的地方。

因此,如果面板中有一个JTable,我可以在单击它旁边的菜单时调用它(如果没有其他的),但是当单击JTable时,什么都不会发生(该表显然位于面板的顶部,阻止MouseAdapter注册单击)。

当右键单击面板中的组件时,我可以以某种方式调用弹出菜单吗?下面是我如何创建和调用菜单的示例代码:

代码语言:javascript
复制
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);
    }

谢谢你的建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-05 08:51:30

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

下面是一个例子:

代码语言:javascript
复制
/**
 * 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);
        }
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25134108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档