Wie kann man ein Kontextmenu erzeugen?
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.