Java AWT: Menü

Willemers Informatik-Ecke

Menüs werden nicht wie bei Windows und einigen anderen Systemen üblich per Ressource definiert, sondern im Programm bei der Initialisierung erstellt und in den Frame eingehängt. Die Methode dazu lautet auch setMenuBar.

Richtfest

Ein Menü besteht aus mehreren Komponenten.

Javaklasse Element
MenuBar Der Querbalken, der die Hauptpunkte enthält (Datei, Bearbeiten...)
Menu Das senkrechte Element, das aufklappt und die Punkte enthält
MenuIten Der anwählbare Punkt, der die Aktion auslöst

Im folgenden Listing wird gezeigt, wie man ein extrem einfaches Menü aufbaut. Es gibt nur ein Dateimenü mit dem einzigen Punkt Ende. Nacheinander werden MenuBar, Menu und MenuItem erzeugt und in der Elternkomponente eingeklinkt.

  MenuBar myMenuBar = new MenuBar();
  myFrame.setMenuBar(myMenuBar);
  Menu fileMenu = new Menu("Datei");
  myMenuBar.add(fileMenu);
  MenuItem EndeItem = new MenuItem("Ende");
  fileMenu.add(EndeItem);

Wenn sich die Ereignisse überstürzen

So elegant ein Menü auch sein mag, es ist weitgehend uninteressant, wenn das Programm nicht erfährt, das ein Punkt ausgewählt wurde. Um das Ereignis der Menüauswahl zu fangen, braucht man einen ActionListener. Eine Instanz dieser Klasse wird mit der Funktion addActionListener an das MenuItem gebunden. Dessen Memberfunction actionPerformed wird beim Eintreten des Ereignisses aufgerufen.

In der folgenden Variante wird im Aufruf von addActionListener eine solche Instanz direkt erzeugt und die Funktion actionPerformed direkt eingehängt.

  MenuItem EndeItem = new MenuItem("Ende");
  EndeItem.addActionListener(new ActionListener() {
                               public void actionPerformed(ActionEvent e) {
                                 System.exit(0);
                               }
                             }
  );
  fileMenu.add(EndeItem);

Man kann MenuBar und ActionListener in einer Klasse aufsetzen, wodurch die komplette Menübehandlung zusammengefasst wird. Das sieht beispielsweise so aus:

import java.awt.*;
import java.awt.event.*;

public class PimfMenu extends MenuBar implements ActionListener 
{
   PimfMenu(Frame myFrame) 
   {
       myFrame.setMenuBar(this);
       Menu fileMenu = new Menu("Datei");
       add(fileMenu);
        
        MenuItem EndeItem = new MenuItem("Ende");
        EndeItem.setActionCommand("exit");
        EndeItem.addActionListener(this);
        fileMenu.add(EndeItem);
    }

    // hier wird auf das Ereignis reagiert
    public void actionPerformed(ActionEvent event)
    {
        if (event.getActionCommand()=="exit") {
            Pimf.Exit();
        }
    }
}

Mit der Funktion setActionCommand kann dem Menüpunkt ein Befehl gegeben werden, der unabhängig von der Beschriftung intern verwendet wird. Er kann aus dem Ereignis per getActionCommand entnommen werden. Hier wird die Exit-Routine des Hauptprogrammes gerufen. Dort wird dann entschieden, ob dem Programm mit System.exit() wirklich die Luft abgedreht werden soll.


Homepage - Java (C) Copyright 2000 Arnold Willemer