是否可以在JMenu中获取JMenuItem的位置/索引?
例如,我有一个名为“Search”的JMenu和3个名为“Find”,“Count”和“Replace”的JMenuItems,我只有1个类管理器来管理所有3个JMenuItems。因此,我使用getSource()方法来获取单击了哪个JMenuItem,以便我可以将JMenuItem的索引传递给另一个类的构造函数。
我的问题是如果想要添加更多JMenuItems或更改JMenuItems的顺序,我将不得不更改传递给另一个类的构造函数的索引。
谢谢!
答案 0 :(得分:1)
使用JMenuBar#getMenu()和JMenu#getMenuComponent()方法获取所有JMenu和JMenuItem。
只需迭代任意JMenuItem
的所有JMenu
,即可获得所需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());
}
}
}
答案 1 :(得分:0)
创建示例嵌套上下文菜单
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();
}
}