2015-04-14 6 views
0

Контекст: В моем Jtable, я делаю выбор из нескольких ячеек, а затем выполняю щелчок правой кнопкой мыши. Из выбранного параметра в моем подменю мне нужно получить выбранные ссылки на ячейки. Я могу получить выбранные строки и столбцы из моего всплывающего меню, , но не из вложенного или подменю.Получить выделенные строки ячеек из вложенного контекстного меню JMenuItems (Java Swing)

Menu

Вот мои фрагменты кода:

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, а также изображение предназначены только для иллюстрации. За ваш совет, спасибо.

+0

Не можете ли вы просто сохранить выбор перед всплывающим меню и использовать его из actionPerformed()? – StanislavL

ответ

0

"(JTable) popup.getInvoker();" который, к сожалению, не работает с JMenuItems.

Вы уже используете метод getParent(). Вы просто не можете предположить, что JPopupMenu является первым родителем.

Вам нужно создать цикл while, который продолжает получать родительский элемент меню до тех пор, пока вы не найдете всплывающее меню. Затем вы можете получить доступ к вызову.

+0

спасибо. Я пробовал цикл, но я получаю Null Pointer на разных уровнях .getParent(). – George

+0

эй, теперь он работает с кастингом. Спасибо за вашу помощь. Отправьте свой ответ для справки и примите свой ответ. – George

0

Кредиты для @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(); 
    } 
} 
+0

Использование jMenu.setName ("jMenu1") и source.getParent(). GetName() и было полезно при отладке. – George

 Смежные вопросы

  • Нет связанных вопросов^_^