Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

Java 7 Grundkurs

Einen Listener implementieren I

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Hier erfahren Sie, wie Sie in Ihrem Java-Programm auf Ereignisse der grafischen Oberfläche, wie z.B. das Klicken auf einen Button, reagieren können.
07:58

Transkript

Das Festlegen der Funktionalität einer grafischen Oberfläche erfolgt ereignisbasiert. Sie erstellen Listener-Objekte, in denen Sie beschreiben, was bei einem bestimmten Ereignis passieren soll. Dann melden Sie diese Listener bei den entsprechenden Oberflächenelementen an. Tritt dann das entsprechende Ereignis ein, also z. B. ein Button wird gedrückt, dann informiert dieses Oberflächenelement den Listener von dem Ereignis. Jetzt wollen wir uns anschauen, wie man das implementiert. Dazu habe ich hier diese Mini-Anwendung. Die macht einfach nur ein Hauptfenster auf, und darin befindet sich ein Button. Auf dem Button steht "Beenden". Ich führe das mal vor: Rechte Maustaste hier rein, "Run file". Das ist das Fenster, da ist der Button, und wenn ich drauf drücke, passiert nichts. Wie wir ja gerade gesehen haben, müssen wir ein Listener-Objekt erzeugen. Und um ein Objekt erzeugen zu können, müssen wir erstmal eine Klasse deklarieren. Diese Klasse muss das Interface "Action Listener" implementieren, also schreibe ich "class", nennen wir ihn "BeendenListener", "implement ActionListener". ActionListener steht im Paket Java AWT Event, wir brauchen also hier oben den entsprechenden Import. Geschweifte Klammer auf und "Enter". Sie wundern sich vielleicht, dass ich diese Klasse hier innerhalb einer anderen Klasse deklariere. Das ist in Java überhaupt kein Problem, Sie können eine Klasse prinzipiell an jeder Stelle deklarieren. Für die Sichtbarkeit gilt dann aber natürlich das Gleiche, wie für die Deklaration von Variablen: Deklariere ich die Klasse innerhalb meiner Klasse "ListenerDemo", dann ist sie auch nur innerhalb der Klasse sichtbar. Und deklariere ich sie wie hier, innerhalb des Konstruktors "ListenerDemo", dann ist sie auch nur innerhalb des Konstuktors sichtbar. Eine solche Klasse wird aus naheliegenden Gründen "Innere Klasse" genannt. Innere Klassen verwendet man aus zwei Gründen: Erstens ergeben Sie in der Regel wenig Sinn, wenn wir sie separat stellen würden, und zweitens, eine innere Klasse hat Zugriff auf die Elemente der sie umgebenden Klasse, auch wenn diese "private" sein sollten. Eine innere Klasse ist quasi ein gleichberechtigtes Mitglied der Familie, so wie die anderen Methoden und Attribute der umschließenden Klasse. Auf diese Weise kann ich aus der inneren Klasse heraus auf Attribute und/oder Methoden der umschließenden Klasse zugreifen, die von außen möglicherweise gar nicht erreichbar wären. Diese innere Klasse hat aber noch ein Compiler-Problem: "ActionListener" erfordert eine Methode, nämlich die Methode "ActionPerformed". Und die fehlt hier noch. Wir können uns die aber von der IDE einfügen lassen, indem wir hier aufs Lämpchen klicken und sagen: "Implement all abstract methods". Und schon ist die "ActionPerformed"-Methode da. Natürlich möchten wir hier keine "Exception" werfen, deswegen nehmen wir diese Zeile raus und ersetzen sie durch unseren eigenen Code. Da auf dem Button "Beenden" steht, verlassen wir hier einfach mal das Programm, indem wir "system.exit" schreiben. Und als Rückgabe-Code schreiben wir eine "0", das heißt, es ging alles glatt. So dann haben wir unsere Listener-Klasse deklariert, jetzt können wir eine Instanz davon erzeugen. Deklarieren wir uns also eine Referenz-Variable vom Typ "ActionListener", nennen die Variable "beendenListener" und sagen "= new BeendenListener()". Was jetzt noch fehlt, ist diesen Listener "beim Button anmelden". Das können wir natürlich erst machen, nachdem wir den Button erzeugt haben, also hier. "beendenButton." Jetzt gibt es eine Methode, die heißt "addActionListener", mit der fügen wir ActionListener hinzu, und wie Sie hier sehen können, können wir auch gar nichts anderes hinzufügen, denn der Parameter muss vom Typ "ActionListener" sein. Das heißt also, irgendein Objekt, das dieses Interface anbietet. Also, "Enter" und NetBeans schlägt mir hier schon den "beendenListener" vor, das ist vollkommen korrekt. Brauche ich also nur noch Enter zu drücken. Also, wir haben nun eine Klasse deklariert, dann haben wir eine Instanz dieser Klasse erzeugt, und schließlich haben wir diese Instanz bei unserem Button als Listener angemeldet. Schauen wir mal, ob das Ganze funktioniert: Rechte Maustaste, "Run file". Hier ist unsere Anwendung, hier ist der Button, jetzt drücke ich auf den Button drauf, lasse ihn los. und die Anwendung ist beendet. Damit tut unsere Anwendung also eigentlich, was sie soll. Draußen in der harten Praxis werden Sie diesen Code allerdings eher selten so sehen, wie er hier steht. Stattdessen wird eine etwas kompaktere Variante bevorzugt. Der Gedankengang ist dabei ungefähr folgender: Wir deklarieren hier oben eine Klasse, und dann erzeugen wir genau ein Mal eine Instanz von dieser Klasse. Danach brauchen wir diese Klassen-Deklaration nie wieder. Deshalb gibt es die Möglichkeit, dass man hier, wo der Name dieser Klasse steht, stattdessen die Deklaration der Klasse hinschreibt. Die Deklaration der Klasse; das heißt, wir schreiben hin: Es ist ein Ding, was einen ActionListener implementiert, und das hier ist die Methode dazu. Das sieht dann so aus: Wir schreiben hier nicht hin: "new BeendenListener", sondern "new ActionListener". "ActionListener" ist ein Interface, und Interfaces kann man natürlich nicht instanziieren. Das weiß auch der Compiler, deswegen kriegen wir hier diese rote Kringel-Linie. Was ihm fehlt, ist die Implementierung, also diese Methode hier oben. Um den Compiler glücklich zu machen, fügen wir also einfach diese Implementierung hier vor dem Semikolon noch ein. Dazu kopiere ich diesen Bereich hier, einschließlich der geschweiften Klammern; Strg+C. Und hier, vor dem Semikolon, füge ich es ein; Strg+V. Damit brauche ich die Klassen-Deklaration hier oben nicht mehr, ich lösche Sie aber mal nicht, sondern lasse sie noch drin stehen. Ich mache nur Strg+Shift+C, also ich kommentiere sie einfach aus. Es geht aber noch weiter. Wir sehen nämlich, diese Variable, die wir hier deklarieren, benutzen wir genau ein Mal. Nämlich hier unten, um den gerade frisch erzeugten "ActionListener" hier beim Button anzumelden. Statt uns nun die Referenz auf dieses Objekt, das wir hier oben erzeugen, erst in einer Variablen zu merken und dann hier unten diese Variable zu übergeben, könnten wir natürlich auch direkt die Erzeugung des Objektes, also das hier, dort hineinschreiben. Und genau das tun wir jetzt, also beginnt beim "new" bis "}", aber ohne Semikolon. Strg+C und dann hier unten "addActionListener(" und dieses "beendenListener" ersetzen wir jetzt durch das, was wir gerade kopiert haben; Strg+V. Und damit brauchen wir auch hier oben diese Deklaration nicht mehr; Strg+Shift+C. So, damit haben wir die Endstufe der Verkürzung erreicht, und wir machen jetzt drei Dinge in einem Schritt. Wir deklarieren eine Klasse, die einen "ActionListener" implementiert, und zwar mit dieser Methode. Dann erzeugen wir eine Instanz dieser Klasse, und dann übergeben wir die Referenz auf diese erzeugte Instanz an die Methode "addActionListener" vom Beenden-Button. Was wir hier jetzt verwendet haben, ist nicht nur eine innere Klasse, es ist eine anonyme innere Klasse, denn sie hat ja nicht mal mehr einen Namen. Wenn das Interface übrigens mehrere Methoden erfordern würde, wie z. B. das Interface "MouseListener", dann würden wir die hier einfach untereinander deklarieren. So wie in einer ganz normalen Klasse auch. Diese ganze Konstruktion geht natürlich davon aus, dass Sie nur exakt ein Mal ein Objekt erzeugen wollen, und das dann auch sofort verwenden und woanders anmelden. Benötigen Sie hingegen mehrere Instanzen, oder möchten Sie diesen Listener hier, z. B. bei mehreren Buttons anmelden, dann wäre das natürlich Quatsch, jedes Mal die komplette Implementierung der Klasse immer wieder mit dazu zu schreiben. In solchen Fällen sollten Sie dann die ursprüngliche Variante vorziehen. Jetzt muss ich Ihnen natürlich noch zeigen, dass das Programm immer noch genau so funktioniert wie vorher. Also, rechte Maustaste, "Run file", Mausklick. Die Anwendung wird planmäßig beendet. Damit haben Sie nun gesehen, wie Sie Ereignis-Behandlungen in einer Swing-Anwendung manuell implementieren können und Sie wissen jetzt sogar, was eine anonyme innere Klasse ist.

Java 7 Grundkurs

Machen Sie sich mit den Grundlagen der Java-Programmierung vertraut und lernen Sie die Syntax der Sprache sowie das Konzept der objektorientierten Softwareentwicklung kennen.

8 Std. 32 min (66 Videos)
Derzeit sind keine Feedbacks vorhanden...
 

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!