【问题标题】:Getting the position of a JMenuItem from its parent JMenu从其父 JMenu 获取 JMenuItem 的位置
【发布时间】:2014-09-16 00:49:58
【问题描述】:

是否可以在其 JMenu 中获取 JMenuItem 的位置/索引?

例如,我有一个名为“Search”的 JMenu 和 3 个名为“Find”、“Count”和“Replace”的 JMenuItem,而我只有 1 个类管理器来管理所有 3 个 JMenuItem。因此我使用 getSource() 方法来获取点击了哪些 JMenuItem,这样我就可以将 JMenuItem 的索引传递给另一个类的构造函数。

我的问题是,如果想添加更多 JMenuItems 或更改 JMenuItems 的顺序,我将不得不更改传递给其他类的构造函数的索引。

谢谢!

【问题讨论】:

  • “这样我就可以将 JMenuItem 的索引传递给另一个类的构造函数。” 这听起来像一个非常、非常脆弱的方法.
  • 每个 JMenuItem 都链接到 JTabbedPane 中的某个面板,该面板是在另一个类中创建的。你会采用什么方法?
  • @AndrewThompson 我想要做的是当用户单击 JMenu 的 JmenuItem 时,它会创建另一个类,其中 JTabbedPane 选择了右侧面板

标签: java swing indexing jmenu jmenuitem


【解决方案1】:

使用JMenuBar#getMenu()JMenu#getMenuComponent()方法获取所有的JMenu和JMenuItem。

只需迭代任何JMenu 的所有JMenuItem 并获得所需JMenuItem 的索引。

示例程序:

JMenuBar menubar1 = getJMenuBar();
for (int i = 0; i < menubar1.getMenuCount(); i++) {
    JMenu menu1 = menubar1.getMenu(i);
    System.out.println("Menu:" + menu1.getText());
    for (int j = 0; j < menu1.getMenuComponentCount(); j++) {
        java.awt.Component comp = menu1.getMenuComponent(j);
        if (comp instanceof JMenuItem) {
            JMenuItem menuItem1 = (JMenuItem) comp;
            System.out.println("MenuItem:" + menuItem1.getText());
        }
    }
}

【讨论】:

    【解决方案2】:

    从 JMenu 中获取 JMenuItem 的位置/索引


    创建示例嵌套上下文菜单

    JPopupMenu popup = new JPopupMenu();
    popup.setName("popup");
    JMenu jMenu= new JMenu("menu");
    jMenu.setName("menu");
    JMenuItem menuItem1 = new JMenuItem("sub1");
    jMenu.add(menuItem1);
    menuItem1.addActionListener(this);
    popup.add(jMenu);
    

    从 JMenu 中获取 JMenuItem 的位置/索引

    @Override
    public void actionPerformed(ActionEvent e) {
        JMenuItem source = (JMenuItem)(e.getSource());
        try{
            JMenuItem menuItem = (JMenuItem) e.getSource(); 
            JPopupMenu popupMenu = (JPopupMenu) menuItem.getParent(); 
            Component invoker = popupMenu.getInvoker();  
            // Print MenuItem index against the total number of items
            System.out.println(popupMenu.getComponentZOrder(menuItem)
            +"/"+popupMenu.getComponentCount());
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多