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


person George    schedule 14.04.2015    source источник
comment
Разве вы не можете просто сохранить выбор перед отображением всплывающего меню и использовать его из actionPerformed()?   -  person StanislavL    schedule 14.04.2015


Ответы (2)


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

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

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

person camickr    schedule 14.04.2015
comment
благодаря. Я пробовал цикл, но получаю нулевой указатель на разных уровнях .getParent(). - person George; 15.04.2015
comment
эй, теперь это работает с некоторым кастингом. Спасибо за вашу помощь. Опубликую свой ответ для справки и приму ваш ответ. - person George; 15.04.2015