8.2.3 Der erste Maskenaufruf

Beim Spielen fällt sicherlich sehr schnell auf, dass man nicht direkt auf das Spiel wechseln kann, sondern immer über Login und Spielauswahl gegangen werden muss.

Der gewünschte Menüpunkt "Zum Spiel" fügen wir in der Klasse de.golesny.pluesch.client.ui.MainFrame ein. Es ist üblich, dass es pro zu erzeugender Komponente eine create-Methode gibt. In diesem Fall findet man eine Methode createMenuBar(), die das Menü zurückgibt. Die Methode ist simpel aufgebaut und es genügt einen Abschnitt zu kopieren und einzufügen:

Screenshot Eclipse new Button

So erscheint der gewünschte Menüpunkt im Menu, doch was genau passiert denn da eigentlich? Jeder Button "feuert" ein "Event" (Ereignis: in diesem Fall "Button wurde gedrückt mit der linken Maustaste um x Uhr") an alle registrierten Listener (Programmteile, die Interesse an dem Button haben). Das passiert in der Klasse JMenuItem (in Eclipse mit STRG+SHIFT+T und JMI oder JMenuItem eingeben) in der Methode "protected void fireActionPerformed(ActionEvent event);", die von AbstactButton geerbt wurde. Doch woher weiß ich das?

Das Interface ActionListener (addActionListener(ActionListener)) hat nur eine Methode: public void actionPerformed(ActionEvent e);

An diese Methode wird von dem JMenuItem das Event gefeuert. Man kann nun in der Vererbungs-Hierarchie nach einer Methode suchen, die diese aufruft. Mit F4 (in Eclipse) in JMenuItem sieht man welche Komponenten von der Klasse erben und von welchen sie selber erbt. Da JComponent schon vom Namen her nicht mehr nach Aktion aussieht, kann es also nur noch die Klasse AbstractButton sein und es ist auch häufig so, dass man diese Event-Methoden (addListener, removeListener und fireEvent) in eine abstrakte Klasse auslagert, damit diese wiederverwendet werden kann und die eigentliche Komponente nicht so überladen ist.

Die andere Möglichkeit ist etwas praktischer und bei unübersichtlichen Klassen führt diese Methode auch schneller zum Ziel. Da man weiß, an welcher Stelle das Event ankommt (nämlich in der Methode actionPerformed in der ActionDelegate.java), setzt man dort einen Break-Point und startet die Applikation im Debug-Modus (Das Krabbelkäfer-Symbol neben den Play-Pfeil). In Eclipse setzt man einen Break-Point durch einen Doppelklick auf den linken grauen Rand. Dort erscheint dann ein blau ausgefüllter Punkt. Die Applikation hält dort an, wenn man auf dem Button klickt. In Eclipse sieht das dann so aus:

Screenshot Eclipse Break-Point

Im Stack-Trace (Abbildung 10) sieht man dann oben den aktuellen Aufenthaltsort des Threads und darunter die vorher durchlaufenden Code-Stellen. Dort kann man erkennen, dass JMenuItem fireActionPerformed (das rot markierte) aufgerufen hat. Die Klasse in den Klammern bedeutet, dass die Methode von dort geerbt wurde.

Screenshot Eclipse Stack-Trace