13.02.06 Menüs

Mit Buttons, Textfeldern und Labels lassen sich zwar schöne GUIs erstellen, zu einem guten Programm gehört aber auch ein gutes Menü. In diesem Kapitel beschäftigen wir uns mit dem Erstellen und Verwenden eines solchen Menüs.

Grundsätzliches

Da es viele Menüs mit unterschiedlichen Namen gibt, möchte ich hier einige Begriffe definieren, damit es nicht zu Missverständnissen kommt:

  • Programmmenü: Darunter versteht man das Menü, in dem alle auf dem Computer installierten Programme aufgeführt sind. Ein Klick auf ein Programm startet es. Mit diesem Menü werden wir uns also hier nicht beschäfitgen.
  • Systemenü: Das Systemmenü erreichen Sie mit einem Klick auf das Programmicon, meistens in der oberen, linken Fensterecke. Über dieses Menü lässt die Größe, die Position und noch einige andere Dinge verändert werden. Unter Umständen können wir mit Java dieses Menü bearbeiten, dies soll aber nicht Inhalt dieses Kapitels sein
  • Menüleiste: Über die Menüleiste lassen sich die meisten Programme steuern. Nahezu alle Menüleisten haben einen „Datei“- , einen „Bearbeiten“- und einen „Hilfe“-Eintrag. Die Menüleiste hat mehrere Untermenüs, welche beliebig verschachtelt werden können. Diese Art von Menü wird der Hauptgegenstand dieses Kapitels sein.
  • Kontexmenü: Wenn Sie in Ihrem Browser die rechte Maustaste drücken, erscheint ein Kontextmenü. Es heißt deshalb so, weil die Einträge immer davon abhängen, auf was Sie gedrückt haben. Diese Art von Menü werden wir in diesem Kapitel kurz behandeln.

Der Aufbau von Menüs

Um eine Menüleiste ein einem Programm zu verwenden sind mehrere Komponenten notwendig. Zunächst benötigt man natürlich einen JFrame, in dem das Menü sein soll. Dem JFrame wird dann ein Objekt der Klasse JMenuBar zugewiesen. Ein JMenuBar-Objekt repräsentiert die eigentliche Menüleiste. In diese Menüleiste werden dann verschiedene JMenu-Objekte gesetzt. Die eigentlichen Steuerelemente des Menüs kommen dann in diese JMenu-Objekte.
Die meistgenutzten Menü-Steuerelemente sind JMenuItem, JRadioButtonMenuItem und JCheckBoxMenuItem und wiederum JMenu. Sämtliche Komponenten zum Erstellen eines Menüs mit Swing finden Sie im Paket javax.swing.

Ein simples Beispiel-Menü ohne Funktion

Folgender Code erstellt einen JFrame mit einer funktionslosen Menüleiste, zwei Menüs und den o.g. Steuerelementen:

JFrame frame = new JFrame("Menü-Demo");
frame.setBounds(300,300,500,500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("Datei");
JMenu editMenu = new JMenu("Bearbeiten");
menuBar.add(fileMenu);
menuBar.add(editMenu);
frame.setJMenuBar(menuBar);

JMenuItem exitItem = new JMenuItem("Beenden");
JMenuItem saveItem = new JMenuItem("Speichern");
JCheckBoxMenuItem autoSaveItem = new JCheckBoxMenuItem("Autom. speichern");
fileMenu.add(exitItem);
fileMenu.add(saveItem);
fileMenu.add(autoSaveItem);

JRadioButtonMenuItem left = new JRadioButtonMenuItem("Links");
JRadioButtonMenuItem  center = new JRadioButtonMenuItem("Zentriert");
JRadioButtonMenuItem right = new JRadioButtonMenuItem("Rechts");
ButtonGroup group = new ButtonGroup();
group.add(left); group.add(center); group.add(right);
editMenu.add(left);
editMenu.add(center);
editMenu.add(right);

frame.setVisible(true);

Wie Sie sehen können, ist die Erstellung einer Menüzeile nicht schwer, da Sie schon fast alle Komponenten kennen, trotzdem ist die Erstellung einer Menüzeile recht zeitaufwändig.

Die Items werden in einem Menü immer ans Ende des Menüs gesetzt, die Items erscheinen im Menü also in derselben Reihenfolge wie Sie sie im Quellcode hinzufügen.

Um Ihre Menüs übersichtlicher zu machen können zum einen Menüs verschachteln, das heißt, sie können beliebig viele JMenus in JMenus setzen.
Eine andere Möglichkeit ist mittels jmenu.addSeperator eine Trennlinie ans Ende des Menüs zu setzen.

Aktionen ins Menü einbauen

Im Grunde müssen Sie nichts neues erlernen damit Ihre Menüs Benutzereingaben verarbeiten können. Sie können alle Steuerelemente im Menü so bedienen wie ihre „normalen“ Pendants, also JMenuItem wie JButton, JRadioButtonMenuItem wie JRadioButton und JCheckBoxMenuItem wie JCheckBox.
Die Parameter aller drei Komponenten sind jeweils fast gleich und auch die Methoden sind dieselben, da alle Menüschaltflächen wie auch die normalen Schaltflächen von AbstractButton erben.
Folgender Code verleiht der Beenden-Schaltfläche eine Funktion:

JMenuItem exitItem = new JMenuItem("Beenden");
exitItem.addActionListener(new ActionListener() {

  public void actionPerformed(ActionEvent e) {
    System.exit(0);
  }
});

Da die Bedienung der Menüschaltflächen (abgesehen von der Platzierung) diesselbe ist wie bei den normalen Schaltflächen, können Sie in Kapitel 13.02.05 genaueres nachlesen.

Kontextmenüs erstellen

Kontextmenüs erscheinen oft, wenn man mit der rechten Maustaste auf ein Steuerelement kilckt. Kontextmenüs werden durch die Klasse JPopUpMenu repräsentiert. Diese Verhalten sich genau so wie JMenus, sie können das Kontextmenü also genau so bestücken wie eine normale Menüleiste:

JPopUpMenu contextMenu = new JPopUpMenu();
contextMenu.add(new JMenuItem("Einfügen"));
contextMenu.add(new JMenuItem("Kopieren"));
contextMenu.add(new JMenuItem("Ausschneiden"));
contextMenu.add(new JCheckBoxMenuItem("Zeilennummern an/aus"));

Nun müssen Sie nur noch Ihrem Steuerelement sagen, dass es ein Kontextmenü aufrufen soll. Dazu schreiben wir einen MouseListener, der bei einem Mausdruck auf die richtige Maustaste das Kontextmenü auslöst:

component.addMouseListener(new MouseAdapter() {

  @Override
  public void mouseReleased(MouseEvent evt) {
    if (evt.isPopupTrigger()) {
      contextMenu.show(component,evt.getX(),evt.getY());
    }
  }

  public void mousePressed(MouseEvent evt) {
    if (evt.isPopupTrigger()) {
        contextMenu.show(component,evt.getX(),evt.getY());
     }
  }
});

Wir müssen mousePressed(..) und mouseReleased(...) implementieren, da es von Betriebssystem abhängt, wann ein MouseEvent ein Auslöser für ein Kontextmenü ist. Dies wird mit MouseEvent.isPopUpTrigger() geprüft.
Die Zeile contextMenu.show(component,evt.getX(),evt.getY()) macht das Kontextmenü sichtbar. Der erste Parameter
gibt an, auf welchem Steuerelemet das Kontextmenü gezeigt werden soll, danach kommmen jeweils die Koordinaten, an denen das Kontexmenü erscheinen soll.
Durch den Aufruf von MouseEvent.getX() bzw. MosueEvent.getY() werden die Koordinaten ermitttelt, auf die geklickt wurde, also an denen das MouseEvent ausgelöst wurde. Mit dieser Technik erscheint das Kontextmenü immer unter dem Mauszeiger.

Viel fehlt nicht mehr

In den letzten Kapiteln haben Sie schon sehr viel über Swing gelernt und können es inzwischen gut einsetzen. Seit diesem Kapitel können Sie nun auch mit Menüleisten und Kontexmenüs arbeiten. Wenn Sie das nächste Kapitel gelesen haben werden Sie auch mit Tabellen in Swing zurecht kommen.

2 Replies to “13.02.06 Menüs”

  1. Daniel Triphaus

    Beim überfliegen des Artikels ist mir aufgefallen, dass im Abschnitt „Kontextmenüs erstellen“ im ersten Codebeispiel schließende Klammern fehlen beim add() auf das contextMenu.

    Grüße!

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.