Meine Hauptklasse ist ein Fenster mit grafischen Komponenten einschließlich einer JTable
.JTable + JPopupMenu + ActionListener = Albtraum
Ich habe eine öffentliche Klasse ContextMenu
erstellt, die eine benutzerdefinierte Implementierung eines JPopupMenu
ist und mehrere JMenuItem
enthält.
Ich habe einen MouseListener auf meiner JTable
registriert, um eine Instanz von ContextMenu
anzuzeigen, wenn ein Rechtsklick erkannt wird.
Das Problem ist das folgende: "Wie übergibt man die ausgewählten Zeilen an verschiedene Funktionen entsprechend der gewählten JMenuItem
?"
Die offensichtliche Antwort wäre Action auf meinem JMenuItem
zu setzen, aber nicht vergessen, dass JTable
ist in einer anderen Klasse/Objekt als die JPopupMenu
.
Einige Code-Snipets sind mehr als tausend Worte.
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);
}
}
Ich weiß nicht, ob das, was ich frage, möglich ist.
Viel besser als Code-Schnipsel veröffentlichen - erstellen und eine gültige [MCVE] veröffentlichen, das ist ein ** klein ** übersetzbar und lauffähiges Programm, das genaue * Problem für uns Ihre * zeigt. Wenn Sie dies tun können, wird es erheblich Ihre Chancen verbessern, eine anständige Antwort zu bekommen. Beachten Sie, dass der gesamte Code und die Kommunikation hier in Ihrer ursprünglichen Frage und nicht in einem Link erfolgen sollten. –