Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

Jetzt lerne ich Java 6

Workshop AWT-Mini-Rechner 2

Testen Sie unsere 2016 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Um das Wissen über grafische Oberflächen, AWT-Komponenten und Event-Handling etwas zu festigen, programmieren wir in diesem Workshop einen einfachen Rechner. Teil 2 des Workshops hier anwählbar.
20:40

Transkript

Als allererstes werden wir uns darum kümmern, dass wir das Hauptfenster auch wieder schließen können und damit auch die Applikation beenden. Dafür brauchen wir Events und im ersten Schritt gehen wir also hier hoch und importieren uns erstmal die passenden Events. Finden wir ein "java.awt.event", kleingeschrieben, achten Sie darauf, dass Sie nicht aus Versehen hier die Klasse auswählen, es geht hier um das Paket. Okay, damit haben wir die Events und jetzt müssen wir das Ganze zuweisen und da benutzen wir einfach, wie Sie es bereits gelernt haben, einen anonymen Listener und den implementieren wir auch dann einfach direkt, das geht dann einfach entsprechend schneller. Den setzten wir also hier in unser Hauptfenster rein. Gehen wir einfach hier ganz nach unten im Konstruktor noch hier hin, // Event-Handling für's Hauptfenster, daher "this", damit wählen wir uns den obersten Container, also unser Hauptfenster aus, "addWindowListener", machen wir also, als ob wir schon eine entsprechende Klasse gemacht hätten, haben wir noch nicht, aber das ist nicht schlimm, denn Sie haben ja das Prinzip der anonymen Listener schon kennengelernt, dann einen Window Listener zu verwenden, ist extrem stressig. Window Listener ist ein Interface und wir bräuchten sieben Methoden letztendlich, die wir implementieren müssten, und daher benutzen wir den passenden Adapter dazu, den sogenannten Window Adapter. Auch dazu gab es eine eigene Lektion und wir instanziieren uns hier also direkt einen neuen Window Adapter. Zwei runde Klammern. Und da wir den auch noch nicht haben, in dem Sinne, machen wir uns hier jetzt ein bisschen Platz, geschweifte Klammern auf und zu und direkt zwischen die beiden geschweiften Klammern setzen wir jetzt unseren Code. Was wollen wir denn für eine Methode überschreiben? Ja eigentlich nur Window Closing, denn dann hat jemand hier oben auf den Knopf gedrückt, also "public void windowClosing" übergeben mit einem "WindowEvent", das nehmen wir an, nennen es "e", nochmal geschweifte Klammern und dann führen wir ein "System.exit (0)" aus. Damit ist unsere Applikation dann zu. Und jetzt müssen wir das Ganze mal so lange sortieren, dass wir die passenden Stellen finden für das Semikolon. Sie sehen, das wird jetzt ein bisschen verwirrend. Klammer, Klammer. Diese Klammer hier gehört zu dieser hier. Das ist entsprechend die Implementierung für hier das "new". Das Ganze hier noch etwas hoch. Die ist zu. Die setzen wir hier dahinter. Damit ist der Block zu. Dann kommt dahinter eine runde Klammer, Semikolon und damit ist die Sache auch zu. Wir können den Quellcode neu schreiben lassen. Voilà, das war es. Also wie gesagt einfach durchgehen hier, dass man wirklich auch alles wieder schließt, was man aufgemacht hat, in der richtigen Reihenfolge. Gut, dann schließen wir jetzt hier auch das noch laufende Programm im Hintergrund. Dann machen wir das zu, gehen hier auf MiniRechner und lassen den jetzt entsprechend hier als Applikation laufen, und wenn wir jetzt hier oben auf "Schließen" drücken, wird wirklich das Ganze auch entsprechend geschlossen. Jetzt können wir uns, während das Ganze läuft, noch einmal überlegen, was wir jetzt tun müssen. Wir müssen ja jetzt für jeden dieser vier Knöpfe eigentlich eine eigene Berechnung durchführen. Jetzt aber für jeden dieser Knöpfe einen eigenen ActionListener zu implementieren ist recht viel Arbeit und Sie haben in den Kapiteln über Eventverarbeitung ja auch gelernt, man kann das ja innerhalb des ActionListeners entsprechend noch herausfinden, welcher Knopf gedrückt wurde. In Anbetracht dessen werden wir das Wissen jetzt hier noch nutzen und jetzt einen ActionListener für alle aufbauen und dann entsprechend sortieren. Das ist also jetzt unser nächster Schritt. Hierfür achten wir darauf, dass wir außerhalb unseres Konstruktors stehen. "// Event-Handling für die Berechnung" und damit auch für die Knöpfe. In unserem ersten Schritt brauchen wir eine eigene Klasse, die wir "KnopfAktion" nennen, und hier implementieren wir ein Interface, und zwar den ActionListener. Hier lohnt es sich eben nicht, einen Adapter zu benutzen, da es sowieso nur eine einzige Methode in ActionListener gibt, daher gibt es auch keinen Adapter dazu. Okay. Die Meldung zeigt uns auch hier direkt an: Hey, du musst "action.Performed", also die Methode implementieren. Das machen wir auch hier jetzt direkt. Public void actionPerformed und übergeben wird diesmal ein "ActionEvent", dass wir netterweise "e" nennen und diesmal brauchen wir es auch auf jeden Fall. Und jetzt wenden wir einfach das Wissen an, was wir in dem Grundlagenkapitel über Events gelernt haben. Wir rufen nämlich ein und dieselbe Funktion auf für alle vier Knöpfe. Die Funktion werden wir "berechnung" nennen, aber damit wir in der Funktion herausfinden können, welche Berechnung wir machen müssen, also welcher Knopf eigentlich gedrückt worden ist, übergeben wir hier einfach das Objekt ActionEvent, also das "e" und darin können wir später herausfinden, was eigentlich gemacht werden soll. Jetzt kriegen wir natürlich den Fehler: hey, du hast diese Funktion noch überhaupt nicht gemacht, die hast du gar nicht geschrieben. Da hat er Recht. Daher gehen wir jetzt hier unten einfach heraus, achten darauf, dass wir noch innerhalb meiner Klasse stehen, aber außerhalb unserer Klassendefinition für KnopfAction und legen uns einfach schonmal pro forma die Methode "Berechnung" an. Die ist "private", weil von außen hat da in dieser Funktion überhaupt keiner was zu suchen und zurückgegeben wird auch nichts, "berechnung". Und übergeben wird an diese Funktion ein "ActionEvent" als Parameter, nennen wir es auch hier "e", kommen wir nicht durcheinander, zwei geschweifte Klammern, da drin kommt nacher unsere Funktionalität. Schreiben wir es einfach mal kurz rein, "// Hier wird berechnet." Okay, und schon verschwindet hier nämlich auch der Fehler, denn jetzt existiert diese Methode entsprechend auch. Gut, das war jetzt nur ein kleiner Seitensprung hier runter. Wir haben hier oben einen ActionListener implementiert, "KnopfAction" und entsprechend müssen jetzt die Knöpfe mit diesem Listener versehen werden. Das heißt, wir scrollen an die passende Stelle, wo es um die Knöpfe geht, am besten hier. Jetzt können wir halt entweder unten alles mit Events zusammenfassen, ich finde das da oben einfach schöner. Werden also dort, wo es um die Knöpfe geht, entsprechend dann auch die Listener stehen. "// Events für die Knöpfe". der liebe Knopf "plus". Der Knopf "plus" bekommte also hier mit addActionListener entsprechend jetzt seine KnopfAction. Einfach eine neue Instanz bilden und damit wird hier eine neue Instanz von dieser Klasse hier gebildet. Gut, das Ganze müssen wir jetzt natürlich auch für "minus" machen. Und weil mir das jetzt zu viel Arbeit ist, das jeweils zu tippen, kopiere ich mir das noch zweimal für "multi" und für "divi". Gut, das war es soweit. Wir können das Ganze jetzt laufen lassen, es passiert noch nicht viel. Zur Kontrolle können wir einfach hier unten in unsere Methode gehen und uns einfach mal eine Kontrollnachricht ausgeben lassen. "Ich soll was berechnen". Ist immer ganz gut bei der Programmierung immer schrittweise vorzugehen, hier testen wir, kommen wir wirklich hier an. Okay, dann gehen wir wieder in unseren MiniRechner und lassen das Ganze laufen. Wir klicken, schauen dabei hier in die Konsole und Sie sehen, wir kommen wirklich in der Methode an und können jetzt hier unsere Funktionalität reinlegen für die einzelnen Knöpfe. Gut, die Funktion für die Knöpfe, das heißt, wir können hier das Gnaze rausschmeißen aus der Methode und stattdessen uns überlegen, wie wir berechnen. In "e" drin steht letztendlich in ActionCommand drin, welcher Knopf gedrückt wurde, denn das Label wird übergeben und abhängig von diesem Label können wir dann die Berechnung durchführen. An sich brauchen wir also dafür eine Variable für das Ergebnis und dieses Ergebnis werden wir dann als Text in das Label schaffen, was Ergenbis heißt in der graphischen Oberfläche. Das heißt, im ersten Schritt definieren wir uns ein Ergebnis. Das wäre am besten ein "double", nennen wir sie "erg" und belegen die direkt schön vor, "0,0", und legen wir double rein. Danach müssen wir uns drum kümmern, tja, woher kommen denn unsere Zahlen, mit denen wir arbeiten. Die kommen aus Textfeldern. Textfelder haben die Methode getText. Und was getText uns zurückliefert ist natürlich ein String. Aber mit einem String können wir nichts anfangen, denn mit Strings können wir nicht berechnen. Wir müssen diese Strings in Doubles umwandeln. Hierfür können wir Wrapperklassen zum Beispiel benutzen, haben Sie im Grundlagenteil gelernt. Diese bringen die Funktion "Parse" mit, jeweils passend zu ihrem Typ, also "parseDouble", dann zum Beispiel für die Doubles. Und diese Umwandlung sollten wir dann auf jeden Fall durchführen, bevor wir die Berechnung durchführen. Also // Umwandlung der Strings in Double. Im nächsten Schritt müssen wir einfach feststellen, "// Welcher Knopf wurde gedrückt," und dann gleichzeitig "// Berechnen". Ja und im letzten Schritt müssen wir das Ergebnis wieder ausgeben, aber das Ergebnis ist ja dann eine Double. Sie haben ja "erg" vorgelegt, das heißt, dieses Double muss wieder umgewandelt werden in einen String, denn "Ergebnis" ist ja ein Label und Labels können mit der Methode setText mit Hilfe eines Strings dann entsprechend beschriftet werden. Das heißt wir brauchen dann wieder einen String aus unserem Ergebnis. Das wird einfach mal gefasst unter "// Ergebnis ausgeben". Damit haben wir jetzt unsere Struktur für das, was wir als nächstes tun wollen. Also, wandeln wir zuerst einmal um. Hier können wir wieder von innen nach außen gehen, das finde ich schonmal ganz praktisch, wir nehmen unsere Zahl 1. "Zahl 1", was ist das? Ein Textfeld, Okay. Setzen den Punkt und können die Methode "getText" nutzen. Und Sie sehen, da kommt ein String zurück, okay. Jetzt haben wir einen String. Als nächstes müssen wir diesen String in ein Double wandeln. Hierfür können wir eine Wrapperklasse benutzen. Das heißt, wir gehen hier nach vorne und nehmen uns die passende Wrapperklasse, also Double. Ein Double selber bringt eine Methode mit, die "Parse" heiß. Passend, wie gesagt, zur Wrapperklasse und die heißt parseDouble und an die dürfen wir einen String übergeben. Das heißt, die wählen wir uns aus. Jetzt muss hier unser String, der hier zurückkommt einfach nur noch in diese Klammern da rein, das heißt, wir schneiden da aus und setzen das da ein. Das Ganze sieht jetzt schon relativ komplex aus, aber wenn man, wie gesagt, es langsam von innen nach außen liest, wie wir das gerade gemacht haben, dann ist es schon logisch. Das heißt wir haben jetzt ein Double. Und dieses Double wollen wir natürlich nicht nur einfach um den Selbstzweck ins Leben rufen, sondern wir wollen das Ganze speichern. Und dafür legen wir uns einfach eine Variable "z1" an, die auch ein Double ist und legen unser Ergebnis da einfach rein. Ende der Zeile Semikolon nicht vergessen. Und das Ganze brauchen wir dann natürlich nochmal, für auch die zweite Zahl, und das war es. Und falls Sie jetzt die Kapitel schon über Exceptions, also Ausnahmen, gesehen haben, dann müsste bei Ihnen da jetzt schon was klingeln, denn hier kann natürlich Folgendes passieren, es können Exceptions ausgelöst werden. Und zwar es könnte passieren, dass die Zahl oder der String nicht umwandelbar ist in eine Zahl und das sieht man, wenn man hier mal einfach mit der Maus drübergeht, ein bisschen drüber steht. Ich kann jetzt leider mit der Maus nicht draufzeigen, weil dann das gelbe Fähnchen verschwindet, aber wenn Sie das komplett lesen, sehen Sie, dass die Methode "parseDouble" eine NumberFormatException werfen kann. Und wenn Sie wollen, können Sie diese entsprechend dann auffangen und dann bearbeiten. Das heißt, Sie könnten dann zum Beispiel eine Fehlermeldung ausgeben: Hey, du hast in deine Felder keine Zahlen eingegeben, ich kann das nicht umwandeln. Falls Sie dazu Fragen haben, schauen Sie sich einfach die entsprechenden Kapiteln bei Exceptions und Ausnahmen an. Ich werde das in diesem Beispiel jetzt hier einfach nicht zeigen und werde es einfach drauf ankommen lassen. Java wird selber den Fehler behandeln. Aber wenn Sie dieses Beispiel einfach weiter stricken wollen, hier wäre zum Beispiel die erste Exception, die Sie abfangen müssten. Gut. So weit, so gut. Das heißt wir haben jetzt Double und jetzt wollen wir natürlich herausfinden, welcher Knopf gedrückt wurde. Also "wenn- if", woher wissen wir das, aus dem ActionEvent e, was wir uns übergeben gelassen haben, also "e.", dann tun wir die "Methode getActionCommand" verwenden, da kommt ein String zurück, und zwar das, was die Komponente auszeichnet und bei einem Button ist das entsprechend die Beschriftung. Und die testen wir ab und anstatt die jetzt fest da reinzuschreiben, sagen wir einfach: wir nehmen uns den Button "plus" und nutzen einfach seine Methode "getLabel", die uns sein Label zurückgibt, und vergleichen die beiden einfach. Achten Sie darauf, dass hier ein == hinkommt, Ohne Leerzeichen dazwischen, das ist der Vergleichsoperator. Nicht, dass Sie hier eine Zuweisung machen. Ok, damit wissen wir an dieser Stelle, dass es sich wirklich um eine Addition handelt. Und was wir dann machen müssen ist einfach: "erg = z1+z2". Okay, das hätten wir. Jetzt können wir das Ganze kopieren. "Plus". Hier ein "minus". Jetzt müssen wir noch die natürlich voneinander abziehen, ist dann eine Subtraktion. Dann ist es der Knopf "multi", ist eine Multiplikation. Und das Letzte ist dann "divi", das ist dann die Division. Und auch hier müsste es wieder klingeln. Hallo, wir dividieren hier was. Das heißt, es könnte sein, dass z2 Null ist, und damit hätten wir entsprechend eine Exception. Die merkt er jetzt hier selber nicht in der Methode, ganz klar, aber wir wissen es. Und das ist eine Arithmetic Exception und auch die könnten wir natürlich abfangen und entsprechend ausgeben: hey, du versuchst hier eine Division durch 0. Das können Sie mit dem Wissen aus Exceptions und Ausnahmen selber dann implementieren. Am leichtesten wäre es dann, wenn Sie um die ganzen Berechnungen hier einfach ein "try" setzen und mit "catch" dann entsprechend die einzelnen Exceptions abfangen. Wie Sie mit catch mehrere Exceptions abfangen haben Sie ebenfalls in den passenden Kapiteln dort gelernt. Okay, wir haben jetzt alles berechnet, das heißt, wir können jetzt das Ergebnis in Ruhe einfach ausgeben. In Ruhe in soweit, als dass wir unser Ergebnis, was eben noch eine Double ist, umwandeln müssen in einen String. Wie machen wir das? Relativ einfach. Wir nehmen uns unser Ergebnis, benutzen dann String als Wrapperklasse und String bring netterweise uns "ValueOf" mit. Sie sehen, da können wir so ziemlich alles reinschmeißen, was wir wollen und daher muss "erg" natürlich entsprechend hier in die Klammer hinein und damit haben wir jetzt einen String. Dieser String, auch wieder kein Selbstzweck, der muss nach Ergebnis, und das können wir jetzt hier mit mehreren Schritten machen, aber ich denke mittlerweile sind Sie soweit, dass wir es auch in einem Schritt machen können. Das heißt wir sagen hier: das Feld "Ergebnis" ist ein Label, hat eine eigene Methode, eine get Methode und eine set Methode. Diesmal brauchen wir eine set Methode um etwas zuzuweisen, das heißt "setText" und an die wird ein String übergeben und zufälligerweise haben wir den gerade. Und das war es dann. Ok, auch das nochmal von innen nach außen. Wir haben ein "Double Ergebnis". Das wird mit der Hilfe der Wapperklasse String und seiner Methode ValueOf umgewandelt in einen String, dann haben wir hier einen String stehen und dieser wird dem Label Ergebnis, der die Methode setText hat entspechend zugewiesen. Wenn wir uns jetzt hier nicht irgendwo größer verhauen haben, müsste das Ganze jetzt gegessen sein. Also, werfen wir unseren MiniRechner wieder an. Tauch auf, jetzt geben wir zum Beispiel mal "25" und "5" ein, drücken auf +, kommt 30 raus, könnte grade so stimmen, - kommt 20 raus, * kommt 125 und / kommt 5 raus. Sie sehen also, unser Rechner funktioniert. Und jetzt wie gesagt als Transferaufgabe für Sie, um einfach weiter daran zu arbeiten, können wir jetzt mal hier einfach "gg" eingeben, das ist definitiv keine Zahl. Sie sehen, er tut nichts in soweit, als dass wenn ich hier mal öffne, Sie sehen die passenden Exceptions hier auftauchen. Das ist die NumberFormatException, von der ich vorhin gesprochen habe, die wir abfangen können. Geben wir wieder eine Zahl ein. Jetzt gebe ich hier mal eine 0 ein, lösche auch hier gerade mal die Ausgabe, und das geht gar nicht während das Ganze noch läuft, dann müssen wir das Ganze einfach nochmal neu starten. Teilen jetzt die 25 einfach mal durch 0 und hier kommt jetzt "Infinity" raus, also unendlich, entsprechend müssten Sie dann auch diese Exception abfangen. Das war es, das war jetzt so ein kleines AWT-Mini Projekt. Sie haben eine Oberfläche gebaut, die Sie jetzt natürlich noch weiter gestalten können, Sie haben EventListener eingebaut, einmal über Interfaces, einmal über Adapterklasse. Sie haben eine Funktionalität herbeigeführt und ich denke, damit sind Sie doch schon relativ weit gekommen.

Jetzt lerne ich Java 6

Steigen Sie ein in die Programmierung mit Java 6, lernen Sie die Grundlagen kennen und unternehmen Sie anschließend Ihre ersten Schritte in der objektorientierten Programmierung.

12 Std. 27 min (98 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!