从嵌套的JMenuItems上下文菜单(Java Swing)获取选定的单元格行

从嵌套的JMenuItems上下文菜单(Java Swing)获取选定的单元格行,java,swing,jtable,jmenu,jmenuitem,Java,Swing,Jtable,Jmenu,Jmenuitem,上下文:在Jtable中,我选择多个单元格,然后右键单击。从我的子菜单中的所选选项,我需要获取所选单元格引用。 我可以从弹出菜单中获取选定的行和列,但不能从嵌套菜单或子菜单中获取 以下是我的代码片段: private JMenuItem menuItem1; private JMenuItem makeMenuItem(String label) { JMenuItem item = new JMenuItem(label); item.addActionListener(th

上下文:在Jtable中,我选择多个单元格,然后右键单击。从我的子菜单中的所选选项,我需要获取所选单元格引用。 我可以从弹出菜单中获取选定的行和列,但不能从嵌套菜单或子菜单中获取

以下是我的代码片段:

private JMenuItem menuItem1;
private JMenuItem makeMenuItem(String label) {
    JMenuItem item = new JMenuItem(label);
    item.addActionListener(this);
    return item;
}

JPopupMenu popup = new JPopupMenu();
popup.add(makeMenuItem("Menu1"));
popup.add(makeMenuItem("Menu2"));

JMenu menuItem = new JMenu("Sub-menu");
menuItem1 = new JMenuItem("Sub-1");
menuItem.add(menuItem1);
menuItem1.addActionListener(this);

对于主菜单(menu1和menu2),我可以通过“(JTable)popup.getInvoker();”获取所选的行和列,但遗憾的是,它不适用于JMenuItems。if-else语句以及图像仅用于说明。谢谢你的建议

“(JTable)popup.getInvoker();”,很遗憾,它不适用于JMenuItems

您已经在使用
getParent()
方法。您不能假设jpopmpmenu是第一个父项

您需要创建一个while循环,该循环在找到弹出菜单之前一直获取菜单项的父项。然后您可以访问调用者。

将其归功于@camickr和。以下是有效的方法(用于说明的代码):


您不能在弹出菜单显示之前存储选择并使用actionPerformed()中的选项吗?谢谢。我已经尝试过这个循环,但是在.getParent()的不同级别上都得到了空指针。嘿,它现在可以进行一些转换。谢谢你的帮助。将发布我的答案供参考,并接受您的答案。使用jMenu.setName(“jMenu1”)和source.getParent().getName(),对调试很有帮助。
@Override
public void actionPerformed(ActionEvent e) {
    if(e.getSource() == menuItem1){
        //I am unable to get the selected rows and columns
        JMenuItem source = (JMenuItem)(e.getSource());  
        JOptionPane.showMessageDialog(null,source.getClass().getName() );
    }else{

    Component com = (Component)e.getSource();
    JPopupMenu popup = (JPopupMenu)com.getParent();
    JTable table = (JTable)popup.getInvoker();

    //I am able to get selected rows and columns over here.
    int row[] = table.getSelectedRows();
    int col[] = table.getSelectedColumns();
    }
}
@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();      
        JPopupMenu popup = (JPopupMenu) invoker.getParent();
        JTable table = (JTable)popup.getInvoker();
        int row[] = table.getSelectedRows();
        int col[] = table.getSelectedColumns();
        System.out.println("Test print: "+row[0]+"-"+col[0]);
    }catch(Exception ex){
        ex.printStackTrace();
    }
}