Java 使用jpopmpmenu从JMenuItem获取JMenu
我希望在使用JPopupMenu单击我的JMenuItem时获得jMenus的名称 我在每个JMenuItem上放置了一个名为“MenuContextureListener”的ActionListener:Java 使用jpopmpmenu从JMenuItem获取JMenu,java,swing,jmenu,jmenuitem,jpopupmenu,Java,Swing,Jmenu,Jmenuitem,Jpopupmenu,我希望在使用JPopupMenu单击我的JMenuItem时获得jMenus的名称 我在每个JMenuItem上放置了一个名为“MenuContextureListener”的ActionListener: ActionListener menuContextuelListener = new ActionListener() { public void actionPerformed(ActionEvent event) { System.out.println(eve
ActionListener menuContextuelListener = new ActionListener() {
public void actionPerformed(ActionEvent event) {
System.out.println(event.getActionCommand());
}
};
如何从选中的JMenuItem中获取JMenu父项的名称
我也在同一个侦听器中尝试了这种方法,但不起作用:
JMenuItem jmi = (JMenuItem) event.getSource();
JPopupMenu jpm = (JPopupMenu) jmi.getParent();
JMenu menu = (JMenu) jpm.getInvoker();
这张照片来自:
侦听器的完整代码:
ActionListener menuContextuelListener = new ActionListener(){
public void actionPerformed(ActionEvent event)
{
JMenuItem source = (JMenuItem)(event.getSource());
try{
JMenuItem menuItem = (JMenuItem) event.getSource();
JPopupMenu popupMenu = (JPopupMenu) menuItem.getParent();
Component invoker = popupMenu.getInvoker();
JPopupMenu popup = (JPopupMenu) invoker.getParent();
System.out.println("NAME OF JMENU: "+popup.getName());
}catch(Exception ex){
ex.printStackTrace();
}
}
};
下面是菜单构造的示例(动态):
我用下面的代码检查。。。我可以看到JMenu的名称:
System.out.println(tJMenu.get(tJMenu.size()-1).getName());
您在论坛中找到了关于如何执行此操作的建议,为什么要更改找到的代码
快速浏览一下,您的代码中有一个额外的getParent()语句
调用程序将是JMenu。不需要第二条getParent()语句
下面是一些更通用的代码,允许您获取菜单项和子菜单项的JMenu:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MenuItemAction implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
JMenuItem mi = (JMenuItem)e.getSource();
mi.setText(mi.getText() + "0");
JMenu menu = getMenuBarMenu(mi);
System.out.println("Menu: " + menu.getText());
JFrame frame = (JFrame)SwingUtilities.windowForComponent(menu);
System.out.println("Frame: " + frame.getTitle());
}
private JMenu getMenuBarMenu(JMenuItem item)
{
JMenu menu = null;
while (menu == null)
{
JPopupMenu popup = (JPopupMenu)item.getParent();
item = (JMenuItem)popup.getInvoker();
if (! (item.getParent() instanceof JPopupMenu) )
menu = (JMenu)item;
}
return menu;
}
private static void createAndShowGUI()
{
ActionListener listener = new MenuItemAction();
// Create menu bar
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu( "File" );
menuBar.add( menu );
JMenuItem item1 = new JMenuItem("Item 1");
menu.add( item1 );
JMenu subMenu1 = new JMenu("SubMenu 1");
menu.add( subMenu1 );
JMenuItem subItem1 = new JMenuItem("SubItem 1");
subMenu1.add( subItem1 );
JMenu subMenu12 = new JMenu("SubMenu 12");
subMenu1.add( subMenu12 );
JMenuItem subItem12 = new JMenuItem("SubItem 12");
subMenu12.add( subItem12 );
item1.addActionListener( listener );
subItem1.addActionListener( listener );
subItem12.addActionListener( listener );
JFrame frame = new JFrame("Get Menu and Frame");
frame.setJMenuBar( menuBar );
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.setSize(200, 200);
frame.setLocationRelativeTo( null );
frame.setVisible(true);
}
public static void main(String[] args)
{
EventQueue.invokeLater( () -> createAndShowGUI() );
/*
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowGUI();
}
});
*/
}
}
将来当你提问时,请像我一样发布一个完整的答案,这样我们就可以准确地看到你在做什么。是的,但它返回“NAME OF JMENU:null”。你的代码的哪一部分会打印这个?嗨,伯杰,请在下面的答案中找到代码。感谢您的支持。如果
getName
返回空值,请尝试使用自定义名称首先在菜单上调用setName
。我将名称设置为“fMenu=newjmenu(“文件”);”。您认为我必须设置名称吗?谢谢您的回答和通用代码。它工作得很好。
System.out.println(tJMenu.get(tJMenu.size()-1).getName());
JMenuItem menuItem = (JMenuItem) event.getSource();
JPopupMenu popupMenu = (JPopupMenu) menuItem.getParent();
Component invoker = popupMenu.getInvoker();
//JPopupMenu popup = (JPopupMenu) invoker.getParent(); // why did you add this?
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MenuItemAction implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
JMenuItem mi = (JMenuItem)e.getSource();
mi.setText(mi.getText() + "0");
JMenu menu = getMenuBarMenu(mi);
System.out.println("Menu: " + menu.getText());
JFrame frame = (JFrame)SwingUtilities.windowForComponent(menu);
System.out.println("Frame: " + frame.getTitle());
}
private JMenu getMenuBarMenu(JMenuItem item)
{
JMenu menu = null;
while (menu == null)
{
JPopupMenu popup = (JPopupMenu)item.getParent();
item = (JMenuItem)popup.getInvoker();
if (! (item.getParent() instanceof JPopupMenu) )
menu = (JMenu)item;
}
return menu;
}
private static void createAndShowGUI()
{
ActionListener listener = new MenuItemAction();
// Create menu bar
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu( "File" );
menuBar.add( menu );
JMenuItem item1 = new JMenuItem("Item 1");
menu.add( item1 );
JMenu subMenu1 = new JMenu("SubMenu 1");
menu.add( subMenu1 );
JMenuItem subItem1 = new JMenuItem("SubItem 1");
subMenu1.add( subItem1 );
JMenu subMenu12 = new JMenu("SubMenu 12");
subMenu1.add( subMenu12 );
JMenuItem subItem12 = new JMenuItem("SubItem 12");
subMenu12.add( subItem12 );
item1.addActionListener( listener );
subItem1.addActionListener( listener );
subItem12.addActionListener( listener );
JFrame frame = new JFrame("Get Menu and Frame");
frame.setJMenuBar( menuBar );
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.setSize(200, 200);
frame.setLocationRelativeTo( null );
frame.setVisible(true);
}
public static void main(String[] args)
{
EventQueue.invokeLater( () -> createAndShowGUI() );
/*
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowGUI();
}
});
*/
}
}