Мой главный класс - это окно, содержащее графические компоненты, включая JTable
.JTable + JPopupMenu + ActionListener = Nightmare
Я создал публичный класс ContextMenu
, который является специальной реализацией JPopupMenu
и содержит несколько JMenuItem
.
Я зарегистрировал mouseListener на своем JTable
, чтобы показать экземпляр ContextMenu
, когда обнаружен щелчок правой кнопкой мыши.
Проблема заключается в следующем: «Как передать выбранные строки в разные функции в соответствии с выбранными JMenuItem
?»
Очевидным ответом было бы установить ActionListener на моем JMenuItem
, но помните, что JTable
находится в другом классе/объекте, чем JPopupMenu
.
Некоторые снайперы кода стоят тысячи слов.
public class Tab implements ITab {
private ContextMenu contextMenu;
private JTable table;
private List<SomeObject> toProcess;
--- code --
private JScrollPane drawScrollTable() {
Object columns[] = {
"something",
"somethingElse"
};
Object rows[][] = {};
table = new JTable(new DefaultTableModel(rows, columns));
JScrollPane scrollPane = new JScrollPane(table);
table.setSelectionForeground(Color.BLACK);
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
int selectedRow = table.rowAtPoint(e.getPoint());
if (selectedRow >= 0 && selectedRow < table.getRowCount()) {
if (!table.getSelectionModel().isSelectedIndex(selectedRow)) {
table.setRowSelectionInterval(selectedRow, selectedRow);
}
}
if (e.isPopupTrigger() && e.getComponent() instanceof JTable) {
this.show(e);
}
}
private void show(MouseEvent e){
contextMenu.show(e.getComponent(), e.getX(), e.getY());
}
});
return scrollPane;
}
-- code --
}
public class ContextMenu extends JPopupMenu {
JMenuItem item;
public ContextMenu(IBurpExtenderCallbacks callbacks){
this.item= new JMenuItem("item");
this.item(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// Do action involving the selected row, even better if possible action involving the value hold in the column 0 of the selected row and the toProcess private field
}
});
add(item);
}
}
Я не знаю, возможно ли то, что я прошу.
Намного лучше, чем размещение фрагменты коды - создать и опубликовать действительный [mcve], то есть ** ** маленькой скомпилирована и работоспособная программа, которая демонстрирует нам свои * точную * проблему. Если вы можете это сделать, это значительно повысит ваши шансы получить достойный ответ. Обратите внимание, что весь код и связь должны быть сделаны здесь в исходном вопросе, а не в ссылке. –