2016-08-25 10 views
0

Я хотел бы получить имя JMenu, когда я нажимаю на свой JMenuItem с помощью JPopupMenu.Получить JMenu от JMenuItem с JPopupMenu

Я поставил ActionListener под названием "menuContextuelListener" на каждом JMenuItem:

ActionListener menuContextuelListener = new ActionListener() { 
    public void actionPerformed(ActionEvent event) { 
     System.out.println(event.getActionCommand()); 
    } 
}; 

Как я могу получить имя родителя JMenu из JMenuItem выбранного?

Я также попробовал этот способ в том же слушателем, но он не работает:

JMenuItem jmi = (JMenuItem) event.getSource(); 
JPopupMenu jpm = (JPopupMenu) jmi.getParent(); 
JMenu menu = (JMenu) jpm.getInvoker(); 

И это один из how to get the name of a JMenu when a JMenuItem is clicked:

JPopupMenu menu = (JPopupMenu) ((JMenuItem) evt.getSource()).getParent(); 
JMenu actMenu = menu.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(); 
         } 
       } 
     }; 

Здесь приведен пример построения меню (динамически):

tJMenu.add(new JMenu(ligne.substring(0, pos-1))); 
tJMenu.get(tJMenu.size()-1).setName(ligne.substring(0, pos-1)); 

и проверить на код ниже ... и я могу видеть имена JMenu:

System.out.println(tJMenu.get(tJMenu.size()-1).getName()); 
+0

Да, но он возвращает «НАЗВАНИЕ JMENU: null». – Fred

+0

Какая часть вашего кода печатает это? – Berger

+0

Привет Бергер, пожалуйста, найдите код в ответе ниже. Thnak вам за вашу поддержку. – Fred

ответ

0
JMenuItem menuItem = (JMenuItem) event.getSource(); 
JPopupMenu popupMenu = (JPopupMenu) menuItem.getParent(); 
Component invoker = popupMenu.getInvoker();  
//JPopupMenu popup = (JPopupMenu) invoker.getParent(); // why did you add this? 

Вы нашли предложения на форуме о том, как сделать это так, почему вы меняете код, который вы нашли?

С кратким взглядом у вас есть дополнительный оператор 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(); 
      } 
     }); 
*/ 
    } 
} 

В будущем, когда вы задаете вопрос, пожалуйста, напишите полный SSCCE как у меня поэтому мы можем точно видеть, что вы делаете.

+0

Благодарим вас за ответ и ваш общий код. Он отлично работает. – Fred