Wie kann man ein Kontextmenu erzeugen?

Mit Hilfe eines MouseListeners kann man auf einfache Art und Weise ein Kontextmenu erzeugen, das (auch) zur Programmsteuerung dienen kann.

Screenshot mit Kontextmenu

Man erzeugt hierzu zwei Klassen, eine zur Darstellung eines JFrame - sie enthält auch die main()-Methode - und eine für das Menu.
Die Klasse KontextMenu stellt ein kleines Fenster bereit. Ihm wird mit addMouseListener(this); ein MouseListener hinzugefügt, der zum Aufruf des Kontextmenus dient. In einer Methode setMenu(), die ein MouseEvent-Parameter übergeben bekommt, wird mit Hilfe der Methode isPopupTrigger() überprüft, ob das Ereignis dasjenige ist, was auf der jeweiligen Plattform ein Kontextmenu erzeugt. Ist dies der Fall, wird ein neues Objekt des Menus erzeugt, dem je eine Instanz des aufrufenden Fensters und des MouseEvent übergeben wird.

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class KontextMenu implements MouseListener {

    public KontextMenu() {
        init();
    }
    
    private void init() {
        JFrame frame = new JFrame("Kontextmenu");
        frame.addMouseListener(this);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 200);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private void setMenu(MouseEvent event) {
        if (event.isPopupTrigger()) {
            new Popup((JFrame)event.getSource(), event);
        }
    }

    public void mouseClicked(MouseEvent event) {}

    public void mouseEntered(MouseEvent event) {}

    public void mouseExited(MouseEvent event) {}
    
    public void mouseReleased(MouseEvent event) {}

    public void mousePressed(MouseEvent event) {
        setMenu(event);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new KontextMenu());
    }
}

Die Klasse enthält danach die fünf notwendigen Methoden des MouseListener, die auf die Mouseaktionen achten. In mousePressed(MouseEvent event) wird die das Menu erzeugende Methode setMenu() aufgerufen. Die anderen Methoden bleiben leer.

Die Klasse Popup stellt das eigentliche Menu bereit. Es enthält vier einfache Einträge zum Ausschneiden, Kopieren, Einfügen und zum Beenden der Applikation, sowie ein Untermenu mit zwei weiteren Elementen. Bis auf den Eintrag zum Beenden, erzeugen alle Elemente hier lediglich Textausgaben.
Die Klasse erweitert JPopupMenu und implementiert einen ActionListener zur Erzeugung der gewünschten Aktionen.

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;

public class Popup extends JPopupMenu implements ActionListener {

    private static final long serialVersionUID = 1L;
    
    JMenuItem bmi, ami, emi, kmi, dmi, vmi;
    
    public Popup(JFrame parentComp, MouseEvent event){
//      Submenu
        JMenu menu = new JMenu("\u00D6ffnen");
        dmi = new JMenuItem("Datei");
        dmi.addActionListener(this);
        menu.add(dmi);
        vmi = new JMenuItem("Verzeichnis");
        vmi.addActionListener(this);
        menu.add(vmi);
        add(menu);

        ami = new JMenuItem("Ausschneiden");
        ami.addActionListener(this);
        add(ami);
        kmi = new JMenuItem("Kopieren");
        kmi.addActionListener(this);
        add(kmi);
        emi = new JMenuItem("Einf\u00FCgen");
        emi.addActionListener(this);
        add(emi);

        addSeparator();

        bmi = new JMenuItem("Beenden");
        bmi.addActionListener(this);
        add(bmi);

        show(event.getComponent(), event.getX(), event.getY());
    }

    public void actionPerformed(ActionEvent e) {
        System.out.println(e.getActionCommand());

        if (e.getSource() == bmi) {
            System.exit(0);
        }
    }
}

Zunächst wird das Untermenu vom Typ JMenu erzeugt, dem die Unterpunkte als JMenuItem hinzugefügt werden. Vorher werden sie noch beim ActionListener angemeldet. Das Untermenu wird schließlich dem Kontextmenu hinzugefügt.
Die anderen Elemente sind ebenfalls vom Typ JMenuItem und werden dem Kontextmenu direkt hinzugefügt.
Abschließend muss unbedingt show(event.getComponent(), event.getX(), event.getY()) aufgerufen werden. Der Methode wird die aufrufende Komponente, sowie die horizontale und vertikale Mausposition als linker. oberer Ursprung des Menus übergeben.

Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.