当前位置: 首页 > 知识库问答 >
问题:

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

谭嘉容
2023-03-14

我有一个组件(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个答案

冷善
2023-03-14

首先:你不需要使用鼠标侦听器。每个JComponent都有方法setComponentPopupMenu(JPOppMenu)。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);
        }
    }
}
 类似资料:
  • 我是Swing的新手,感谢任何帮助。我有以下情况:一个“主”类,我在其中定义了我的主JPanel和默认标签文本。一个“GUILabel”类(扩展JLabel),我在其中定义了文本标签的外观。一个“弹出菜单”类(扩展JPopupMenu),我在其中定义了弹出菜单的内容。 目标:当我右键点击一个面板时,弹出菜单应该出现(这已经起作用了)。当我选择这个弹出菜单的一个菜单项时,我点击的标签文本应该会改变。

  • 我正在尝试使用Jetpack Compose重写我的项目UI。有没有办法在Android中使用jetpack compose添加弹出菜单?就像这个 我试图使用Stack()布局实现它,但结果并不理想。 而PopupState是 结果是 截图

  • mui框架内置了弹出菜单插件,弹出菜单显示内容不限,但必须包裹在一个含.mui-popover类的div中,如下即为一个弹出菜单内容: <div id="popover" class="mui-popover"> <ul class="mui-table-view"> <li class="mui-table-view-cell"><a href="#">Item1</a></li

  • 本文向大家介绍Java Swing中的下拉式菜单(menu)、弹出式菜单(JPopupMenu)、选项卡窗体(JTabbedPane)组件使用案例,包括了Java Swing中的下拉式菜单(menu)、弹出式菜单(JPopupMenu)、选项卡窗体(JTabbedPane)组件使用案例的使用技巧和注意事项,需要的朋友参考一下 菜单是GUI中最常用的组件,菜单不是Component类的子类,不能放置

  • 主要内容:/etc/rsyslog.conf配置文件的格式,/etc/rsyslog.conf配置文件的内容rsyslogd 服务是依赖其配置文件 /etc/rsyslog.conf 来确定哪个服务的什么等级的日志信息会被记录在哪个位置的。也就是说,日志服务的配置文件中主要定义了服务的名称、日志等级和日志记录位置。 /etc/rsyslog.conf配置文件的格式 该配置文件的基本格式如下所示: authpriv.* /var/log/secure #服务名称[连接符号]日志等级 日志记录位置

  • 我对弹出菜单有问题。我想要的是,当用户在jlist上单击鼠标右键时,会出现一个弹出菜单。我创建了一个类,在其中我创建了弹出菜单,一个扩展了mouselistener的类,以及另一个将鼠标侦听器添加到jlist的类。在扩展mouselistener的类中,我调用弹出菜单的类并显示它。问题是弹出菜单没有出现。 当我点击我得到的是: 在released javax中按released enter。摆动J