从嵌套的 JMenuItems 上下文菜单中获取选定的单元格行(Java Swing)
Get selected cell rows from nested JMenuItems context menu (Java Swing)
上下文:在我的 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);
.....
@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();
}
}
对于主菜单(menu1 和 menu2),我可以通过“(JTable)popup.getInvoker();”获取选定的行和列不幸的是,它不适用于 JMenuItems。 if else 语句以及图像仅用于说明目的。谢谢你的建议。
"(JTable)popup.getInvoker();" which unfortunately does not work with JMenuItems.
您已经在使用 getParent()
方法。您不能假设 JPopupMenu 是第一个父项。
您需要创建一个 while 循环,不断获取菜单项的父项,直到找到弹出菜单。然后就可以访问invoker了。
感谢@camickr 和 this post on parent frame of 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();
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();
}
}
上下文:在我的 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);
.....
@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();
}
}
对于主菜单(menu1 和 menu2),我可以通过“(JTable)popup.getInvoker();”获取选定的行和列不幸的是,它不适用于 JMenuItems。 if else 语句以及图像仅用于说明目的。谢谢你的建议。
"(JTable)popup.getInvoker();" which unfortunately does not work with JMenuItems.
您已经在使用 getParent()
方法。您不能假设 JPopupMenu 是第一个父项。
您需要创建一个 while 循环,不断获取菜单项的父项,直到找到弹出菜单。然后就可以访问invoker了。
感谢@camickr 和 this post on parent frame of 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();
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();
}
}