Betreutes Programmieren Vorlesung Informatik II, Blatt 5

Ähnliche Dokumente
Betreutes Programmieren Vorlesung Informatik II, Blatt 4 Musterlösung

Betreutes Programmieren Vorlesung Informatik II, Blatt 11

Probeklausur Informatik 2 Sommersemester 2013

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 15/16. Kapitel 7. Grafische Benutzeroberflächen 1

EAD II Übung 5. Graphische Benutzungsoberfläche mit BlueJ

(C) Sortieren und Suchen mit Java.-AWT Seite 1

Ereignisse (Events) in Java

Grafische Benutzeroberflächen

Übersicht. 1 Vorbemerkungen zu Sequenzdiagrammen. 2 Sequenzdiagramm aus Code ableiten. 3 Sequenzdiagramm konstruieren und in Java implementieren

Grafische Benutzeroberflächen

'($)*'+ $, *$+*$'- $..$+/, 01.2$, 2*$0, - $'($)*'+ $, *$+*$

Objektorientierte Software-Entwicklung

Fakultät Angewandte Informatik Programmierung verteilter Systeme Übungen zur Vorlesung Informatik II, Blatt 6

Betreutes Programmieren Vorlesung Informatik II, Blatt 7 Musterlösung

Instrumentierung und Dekodierung

/** Main-Methode erzeugt einen neuen Editor zum Testen */ public static void main(string[] args) { new Editor();

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 7. Grafische Benutzeroberflächen

Objektorientierte Programmierung Studiengang Medieninformatik

Funktionale und Objekt-Orientierte Programmierkonzepte

Swing Lernen am Code Teil 1

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Was passiert, wenn Button "Ok?" mit Maus angeklickt?

GUI Programmierung mit JAVA Swing

Heute. Grafische Benutzeroberflächen (Anonyme) innere Klassen Einfache Simulationen main / ausführbare jar-files IT I - VO 11 1

Seite Architektur interaktiver Systeme. 7. Architektur interaktiver Systeme. 7.1 Entkopplung durch Sichten. Schichtenarchitektur

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik GUI-Programmierung mit Swing

Programmieren II. Java im Vergleich zu anderen Sprachen. Einführung: GUI. Einführung: Grafische Benutzeroberflächen. Dr.

GUI-Programmierung. Teil I. Unterlagen zum Modul OOP mit Java V by MOU2/BFH-TI. Berner Fachhochschule Technik und Informatik

Graphische Benutzungsoberflächen

Punkte. Teil 1. Teil 2. Summe. 1. Zeigen Sie, dass der untenstehende Suchbaum die AVL-Bedingung verletzt und überführen Sie ihn in einen AVL-Baum.

Institut für Programmierung und Reaktive Systeme 17. Juli Programmieren II. Übungsklausur

Objektorientierte Programmierung Studiengang Medieninformatik

Musterlösung Stand: 5. Februar 2009

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

GUI-Programmierung mit Java. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 11: GUI 1: AWT (1) GUI-Programmierung mit Java.

Sommersemester Implementierung III: GUI und Verhalten (Teil 2)

Exkurs: ANONYME KLASSEN. Techniken der Programmentwicklung Prof. Dr. Wolfgang Schramm

Programmieren II. Events (Ereignisse) Heusch 16.6 (2. Bd) Ratz 15. Institut für Angewandte Informatik

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

7. Architektur interaktiver Systeme

Klausur Software-Entwicklung März 01

Swing :Komponenten I (Teil 2)

12 Abstrakte Klassen, finale Klassen und Interfaces

Programmieren 2 Selbststudium Semesterwoche 4

Programmieren in Java -Eingangstest-

Einführung in die Programmierung

Institut für Programmierung und Reaktive Systeme. GUIs mit Swing. Markus Reschke

Vorlesung Informatik II

Klausur: Java (Liste P)

Wuerfel - augenzahl: int + Wuerfel() + wuerfeln() + gibaugenzahl(): int

Institut für Informatik

Hauptklausur: PRGII MD

Graphische Benutzungsoberflächen mit Java. Einführung in NetBeans

Probeklausur: Programmierung WS04/05

Programmieren II. Events (Ereignisse) Heusch 16.6 (2. Bd) Ratz 15. Institut für Angewandte Informatik

Die Klasse java.lang.object. Thorsten Treffer

Einstieg in die Informatik mit Java

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Programmieren II. Innere Klassen. Heusch 10, Ratz 5.2.1, Institut für Angewandte Informatik

Arbeitsblatt 5 EAD II NetBeans

Universität Paderborn Prof. Dr. Stefan Böttcher. Abschluss von Kapitel 2: Programmierung Grafischer Oberflächen mit der Swing-Bibliothek

Eingabe von Texten. Vorlesung Software-Entwicklung / Folie 101

AK-Automatisierungs und Kommunikationstechnik TI Technische Informatik. NWT Netzwerktechnik

Ein Manager mit CardLayout layout/cards.java

16. Dezember 2004 Dr. M. Schneider, P. Ziewer

Dr. Monika Meiler. Inhalt

14 Abstrakte Klassen, finale Klassen, Interfaces

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

JTable. W. Lang HWR Berlin, SS

1 Abstrakte Klassen, finale Klassen und Interfaces

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

Einführung in die Programmierung 1

Institut für Programmierung und Reaktive Systeme 7. Juli Programmieren II. Übungsklausur

11. GUI-Programmierung mit SWING Überblick

Ziel dieses Kapitels: Einführung in die Grundzüge der Programmierung graphischer Benutzeroberflächen (engl.: "graphical user interface", GUI) in Java

NTB Druckdatum:

Objektorientierte Programmierung

Algorithmen und Datenstrukturen

1 Aufgaben 1.1 Umgebungsvariable setzen: CLASSPATH

Einstieg in die Informatik mit Java

1 Klassen und Objekte

Einstieg in die Informatik mit Java

Vorlesung Informatik II

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

Aufgabe 1: Objekte, Klassen, Vererbung (15 Punkte)

Hochschule der Medien Prof. Uwe Schulz 14. Juli 2010 Klausur Informatik, EDV-Nr Seite 1 von 5. Teil 2: Aufgaben

DHBW Karlsruhe, Vorlesung Programmieren, Events Musterlösung

Heute. Nachbetrachtung Wissensüberprüfung. Sortieren Interface Comparable TreeSet Sortieren von Arrays: Arrays.sort() 3.12.

Grafische Benutzeroberflächen mit Swing

Polymorphie/Späte Bindung Abstrakte Klassen Interfaces. Polymorphie/Späte Bindung Abstrakte Klassen Interfaces

Innere Klassen. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

7. Architektur interaktiver Systeme

Programmieren in Java

System.out.println("TEXT");

Vorlesung Informatik II

Kapitel 5: Interfaces

Objektorientierte Programmierung Studiengang Medieninformatik

Schlussendlich geben wir die Listen aus. Es kommt zu folgender Ausgabe:

Transkript:

SS 2011 Fakultät für Angewandte Informatik Lehrprofessur für Informatik 01.06.2011 Prof. Dr. Robert Lorenz Betreutes Programmieren Vorlesung Informatik II, Blatt 5 Programmieraufwand für geübte Programmierer: max. 45 min Programmieraufwand für ungeübte Programmierer: 1 1,5 h Musterlösung: ca. 79 Codezeilen Grafischer ToDoManager In der letzten Woche haben Sie ein Datenmodell für einen ToDoManager erstellt. Heute werden Sie eine grafische Anbindung programmieren, um den ToDoManager auch wirklich einsetzen zu können. Die GUI soll mit AWT erstellt werden, so wie Sie es in der Vorlesung gesehen haben. Als Erinnerungshilfe erhalten Sie zunächst nocheinmal das UML-Diagramm der letzten Woche. + Aufgabe - beschreibung: String nicht-leer - prioritaet: Integer 0, 5 + Aufgabe(beschreibung: String, prioritaet: Integer) + getbeschreibung(): String + getprioritaet(): Integer + equals(o: Object): Boolean + Object 0..* - aufgaben 1..1 «interface» Iterable<Aufgabe> + iterator(): Iterator<Aufgabe> + Aufgaben - unique: Aufgaben = null - Aufgaben() + instance(): Aufgaben + addaufgabe(aufgabe: Aufgabe) + popaufgabe(): Aufgabe + iterator(): Iterator<Aufgabe> Abbildung 1: UML-Klassendiagramm der Datenkomponenten Es ist Ihnen freigestellt, Ihren eigenen Code oder den Code auf den nächsten Seiten zu benutzen. Zunächst die Klasse Aufgabe: Die Einschränkungen der beiden Attribute werden im Konstruktor überprüft und ggf. werden Standardwerte benutzt. public class Aufgabe private String beschreibung; private int prioritaet; public Aufgabe(String beschreibung, int prioritaet) Nicht gezählt: Leerzeilen, Kommentare, imports. In eigenen Zeilen: und (ca. 22x), jede Anweisung, außer bei Deklarationen gleichen Typs (z. B. int a, b, c = 0,... ) oder bei einer einzelnen Anweisung nach einem if oder einem else. Nicht benutzt:?:-operator. 1

this.beschreibung = beschreibung; if (beschreibung == null beschreibung.length() == 0) this.beschreibung = "(keine Beschreibung)"; this.prioritaet = prioritaet; if (prioritaet > 5) this.prioritaet = 5; if (prioritaet < 0) this.prioritaet = 0; public String getbeschreibung() return beschreibung; public int getprioritaet() return prioritaet; public boolean equals(object o) if (o instanceof Aufgabe && prioritaet == ((Aufgabe) o).prioritaet && beschreibung.equalsignorecase(((aufgabe) o).beschreibung)) return true; return false; Die Klasse AufgComp wird benötigt, um Aufgaben in eine Ordnung zu bringen. Auf diese Weise können die Container von Java intern alle Objekte sortiert vorhalten, wobei die Reihenfolge der Sortierung vom Programmierer abgeändert werden kann. Damit AufgComp dazu eingesetzt werden kann, muss die Schnittstelle Comparator besser Comparator<Aufgabe> implementiert werden. Die Methode compare() bekommt dann zwei Aufgaben übergeben und soll entscheiden, ob beide Objekte gleich sind (Rückgabewert 0), das erste Objekt vor das zweite einsortiert werden soll (negativer Rückgabewert) oder andersherum (positiver Rückgabewert). import java.util.comparator; public class AufgComp implements Comparator<Aufgabe> public int compare(aufgabe a1, Aufgabe a2) if (a1.getprioritaet() == a2.getprioritaet()) return a1.getbeschreibung().comparetoignorecase(a2.getbeschreibung()); return a2.getprioritaet() - a1.getprioritaet(); In der Klasse Aufgaben können nun die Früchte der Vorarbeit geerntet werden, indem als Container die Klasse PriorityQueue benutzt wird. So eine Warteschlange sortiert Objekte nach einer Priorität und stellt den Zugriff auf das dringlichste Objekt bereit. Um den Mechanismus nun benutzen zu können, wird ein Objekt der Klasse AufgComp dem Konstruktor von PriorityQueue übergeben. Der Rest läuft von selbst. import java.util.iterator; import java.util.priorityqueue; public class Aufgaben implements Iterable<Aufgabe> private static Aufgaben unique = null; 2

private Aufgaben() aufgaben = new PriorityQueue<Aufgabe>(10, new AufgComp()); public static Aufgaben instance() if (unique == null) unique = new Aufgaben(); return unique; PriorityQueue<Aufgabe> aufgaben; public void addaufgabe(aufgabe aufgabe) if (!aufgaben.contains(aufgabe)) aufgaben.offer(aufgabe); public Aufgabe popaufgabe() return aufgaben.poll(); public Iterator<Aufgabe> iterator() return aufgaben.iterator(); Aufgabenstellung Setzen Sie das UML-Klassendiagramm aus Abbildung 2 in Java-Code um und berücksichtigen Sie dabei die weiteren Beschreibungen nach dem Diagramm. Auch wenn Ihnen noch nicht alle Elemente des Diagramms klar sein sollten, sollten Sie in der Lage sein, den Code gewissermaßen als Grundgerüst aufzuschreiben. «interface» java.awt.event.adjustmentlistener + adjustmentvaluechanged(e: AdjustmentEvent) + java.awt.frame «interface» java.awt.event.actionlistener + actionperformed(e: ActionEvent) + java.awt.dialog + ToDoManager - aufgaben: Aufgaben + ToDoManager() + actionperformed(e: ActionEvent) + adjustmentvaluechanged(e: AdjustmentEvent) + TopAufgabe + TopAufgabe(owner: Frame, aufgabe: Aufgabe) + actionperformed(e: ActionEvent) Abbildung 2: UML-Klassendiagramm der GUI-Komponenten. 3

Im Hauptfenster der GUI-Anbindung soll es möglich sein, Aufgaben hinzuzufügen. Dazu soll zum Einen eine Beschreibung in ein Eingabefeld eingegeben werden können und zum Anderen soll mittels eines Schiebereglers eine Priorität festgelegt werden können. Danach soll ein Klick auf eine Schaltfläche mit der Aufschrift "eintragen" die neue Aufgabe in das System einfügen. Neben dem Eingabefeld soll der Schriftzug "Beschreibung: " stehen, neben dem Schieberegler der Text "Priorität: #", wobei statt des Gartenzauns die eingestellte Priorität eingesetzt sein soll. Eine weitere Schaltfläche mit der Aufschrift "Aufgabe!!!" soll ein zweites Fenster öffnen, in dem die Beschreibung der nächsten Aufgabe mit der höchsten Priorität angezeigt werden soll. Eine Schaltfläche mit der Aufschrift "Erledigt!" soll das zweite Fenster wieder schließen. Falls keine Aufgabe im System vorhanden sein sollte, soll im Fenster der Text "Nichts zu tun!" erscheinen sowie die Schaltfläche die Aufschrift "Juhu!" tragen. Die erledigte Aufgabe soll aus dem System gelöscht werden. Hilfestellungen Allgemeine Erklärungen sind bereits auf den letzten beiden Blättern enthalten. Hier erhalten Sie nur Beispiel- Code für die Programmierung von grafischen Oberflächen mit Java AWT. Zunächst wird das Hauptfenster der Anwendung erzeugt. Das Grundgerüst der Klasse kann als allgemeine Schablone für GUI-Fenster dienen. Da es sich um das Hauptfenster für eine Anwendung handelt, wird die Klasse ToDoManager von der AWT- Klasse Frame abgeleitet. Um dem Fenster einen Titel zu verpassen, wird der Konstruktor der Klasse Frame, der eine Zeichenkette als Parameter erwartet, benutzt. Sind eigene Initialisierungen nötig, können diese nun erledigt werden. Danach wird ein passendes Layout gewählt und alle GUI-Elemente werden erzeugt und im Fenster platziert. Wenn das Fenster über Ereignisbehandlung verfügen soll, muss es dazu auch angemeldet sein. Dazu dienen die verschiedenen add...listener()-methoden. Als nächstes wird die Größe des Fensters eingestellt. Eine passende Größe kann von AWT automatisch ermittelt werden, wozu die Methode pack() zum Einsatz kommt. Schließlich wird das Fenster schließbar gemacht, sodass die Applikation auch beendet werden kann. Abschließend wird das Fenster sichtbar gemacht, womit es auf dem Bildschirm angezeigt wird und auch die Ereignisbehandlung beginnt. Das Sichtbarmachen übernimmt die Methode setvisible(). Um auf auftretende Ereignisse reagieren zu können, werden sog. Listener eingesetzt. In der Regel wird das Fenster selbst dazu bestimmte Schnittstellen z. B. ActionListener implementieren, sodass neben den eigenen Methoden auch Methoden zur Ereignisbehandlung in die Klasse aufgenommen werden müssen. Um alle Klassen und Schnittstellen zur Verfügung zu haben, müssen sie am Anfang der Datei importiert werden, sodass die Schablone nun folgendes Aussehen hat: notwendige Importe, v. a. der verwendeten AWT-Klassen und Schnittstellen public class ToDoManager extends Frame benötigte Schnittstellen benötigte Attribute, insbesondere AWT-Elemente public ToDoManager() super("todomanager"); eigene Initialisierungen Layout wählen GUI-Elemente erzeugen und hinzufügen Fenster zur Ereignisbehandlung anmelden 4

pack(); Fenster schließbar machen setvisible(true); benötigte Methoden, insbesondere Ereignisbehandlungsmethoden Um ein Fenster schließbar zu machen, gibt es mehrere Möglichkeiten. Will man ein Fenster schließen, z. B. durch einen Klick auf eine entsprechende Schaltfläche, so wird ein Ereignis vom Typ WindowEvent ausgelöst, auf das das Fenster dann reagieren kann. Um über das Ereignis informiert zu werden, muss die Schnittstelle WindowListener implementiert werden. Da diese Schnittstelle jedoch mehrere Methoden verlangt, wird hier ein einfacherer Weg gewählt: Über den WindowAdapter. Es wird ein anonymes 1 Objekt erzeugt, das von der Klasse WindowAdapter abgeleitet ist und bei dem die Methode windowclosing() geeignet überschrieben wird. Nachdem das Objekt über addwindowlistener() als WindowListener bekannt gemacht wurde, kümmert es sich fortan um das Schließen des Fensters mittels dispose() und das Beenden der Anwendung durch System.exit(). addwindowlistener(new WindowAdapter() public void windowclosing(windowevent e) dispose(); System.exit(0); ); Für die Wahl des Layout stellt AWT eine ganze Reihe an Klassen zur Verfügung. Es lohnt sich, die Dokumentation ein wenig zu durchstöbern. Für den ToDoManager empfiehlt sich der Einfachheit halber ein GridLayout mit drei Zeilen und zwei Spalten. Zusätzlich gibt es jeweils fünf Pixel Zwischenraum in horizontaler und vertikaler Richtung. setlayout(new GridLayout(3, 2, 5, 5)); Die Elemente, aus denen die Oberfläche aufgebaut ist, werden von links nach rechts und von oben nach unten im Fenster angeordnet. Die beiden Texte werden als Label realisiert. Auf den Text "Beschreibung" muss nach der Erstellung nicht mehr zugegriffen werden, sodass das betreffende Objekt nicht als Attribut gespeichert wird. Die Zeichenkette "Priorität: #" muss immer wieder geändert werden, sodass das Label-Objekt als Attribut gespeichert wird. Auf das Eingabefeld und den Schieberegler muss ebenfalls wieder zugegriffen werden, weswegen zwei weitere Attribute hinzukommen. Die beiden Schaltflächen werden lediglich benötigt, um das Fenster bei ihnen zur Ereignisbehandlung anzumelden; also keine weiteren Attribute; außer aufgaben, das als Abkürzung dienen soll, um nicht immer über die statische instance()- Methode auf das Singleton- Objekt zugreifen zu müssen. So kommt also diese Liste an Attributen zustande. private Aufgaben aufgaben; private TextField beschreibung; private Label prioritaet; private Scrollbar schieber; Das Attribut aufgaben wird im Konstruktor einmalig initialisert. aufgaben = Aufgaben.instance(); 1 Ein Objekt, das nicht über eine Variable ansprechbar ist und gewissermaßen keinen Namen besitzt. 5

Mit den oben erwähnten Vorgaben gestaltet sich nun die Erstellung der grafischen Oberfläche wie folgt: add(new Label("Beschreibung:")); beschreibung = new TextField(40); add(beschreibung); prioritaet = new Label("Priorität: 0"); add(prioritaet); schieber = new Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 0, 6); add(schieber); Button eintragen = new Button("eintragen"); add(eintragen); Button aufgabe = new Button("Aufgabe!!!"); add(aufgabe); Was genau die einzelnen Parameter in den verschiedenen Konstruktoren bedeuten und welche anderen Konstruktoren die verwendeten AWT-Klassen haben, können Sie in der Dokumentation nachschlagen. Wie schon angekündigt, wird das Fenster selbst als Ereignisbehandler bei den Schaltflächen und dem Schieberegler angemeldet. eintragen.addactionlistener(this); aufgabe.addactionlistener(this); schieber.addadjustmentlistener(this); Damit dies möglich wird, muss ToDoManager die passenden Schnittstellen implementieren, die durch Komma getrennt zusammen mit dem Schlüsselwort implements an die Signaturzeile der Klasse angehängt werden. implements ActionListener, AdjustmentListener Die Methoden, die sich um die Ereignisbehandlung kümmern, werden der Klasse ebenfalls hinzugefügt. Vom Schieberegler erhält das Fenster ein Ereignis gesandt, das über seine getvalue()-methode Zugriff auf den aktuellen Wert des Reglers gestattet. Dieser Wert wird zusammen mit der Zeichenkette "Priorität: " als neuer Text von prioritaet gesetzt. public void adjustmentvaluechanged(adjustmentevent e) prioritaet.settext("priorität: " + e.getvalue()); Bei den Schaltflächen muss zuerst geklärt werden, von welcher der beiden das Ereignis gesandt wurde. Abhängig davon wird eine neue Aufgabe erzeugt und dem Container hinzugefügt oder das zweite Fenster geöffnet. public void actionperformed(actionevent e) if (e.getactioncommand().equals("eintragen")) aufgaben.addaufgabe(new Aufgabe(beschreibung.getText(), schieber.getvalue())); beschreibung.settext(""); schieber.setvalue(0); prioritaet.settext("priorität: 0"); else new TopAufgabe(this, aufgaben.popaufgabe()); 6

Alles, was jetzt noch fehlt, sind die Importe aller verwendeten Klassen und Schnittstellen am Anfang der Datei. import java.awt.frame; import java.awt.gridlayout; import java.awt.label; import java.awt.textfield; import java.awt.button; import java.awt.scrollbar; import java.awt.event.actionlistener; import java.awt.event.actionevent; import java.awt.event.adjustmentlistener; import java.awt.event.adjustmentevent; import java.awt.event.windowadapter; import java.awt.event.windowevent; Um den grafischen ToDoManager später auch starten zu können, wird eine main()-funktion in der Klasse ToDoManager untergebracht. Ihre einzige Aufgabe ist es, ein neues Fenster zu erzeugen. Der Konstruktoraufruf kehrt erst zurück, wenn das Fenster geschlossen wird. public static void main(string[] args) new ToDoManager(); Die Erstellung des zweiten Fensters folgt einer ähnlichen Schablone. Diesmal handelt es sich nicht um das Hauptfenster einer Anwendung, sondern um ein ein zusätzliches Fenster. Solche Fenster werden von der AWT- Klasse Dialog abgeleitet. Dialogfenster können in zwei verschiedenen Arten auftreten: modal und nicht-modal. Ein modales Dialogfenster blockiert den Rest des Programms, das erst fortgesetzt wird, wenn dieses Fenster wieder geschlossen ist. Ein nicht-modales Dialogfenster blockiert die Anwendung nicht, und es kann zwischen den Fenstern gewechselt werden. Die Klasse Dialog besitzt einen Konstruktor, der als dritten Parameter die Modalität als boolesche Variable kodiert erwartet. Der zweite Parameter ist eine Zeichenkette, die als Titel benutzt wird und als ersten Parameter wird der Eigentümer übergeben. Der Eigentümer ist das Fenster, zu dem gewechselt werden soll, wenn der Dialog geschlossen wird. In dieser Schablone wurde auf Attribute, eigene Initialisierungen und das Schließbarmachen des Fensters verzichtet, da diese Elemente in der Implementierung Implementierung der Klasse keine Rolle spielen. Für eigene Klassen wird das sicher anders sein. benötigte Importe, v. a. der AWT-Klassen public class TopAufgabe extends Dialog notwendige Schnittstellen public TopAufgabe(Frame owner, Aufgabe aufgabe) super(owner, "Aufgabe!!!", true); Layout setzen GUI-Elemente erzeugen und platzieren Fenster als Ereignisbehandler anmelden pack(); setvisible(true); benötigte Methoden, insbesondere zur Ereignisbehandlung 7

Das Layout für dieses Fenster ist einspaltig und besteht aus zwei Zeilen, wobei wieder fünf Pixel Abstand eingefügt werden. setlayout(new GridLayout(2, 1, 5, 5)); Die Oberfläche selbst besteht in der oberen Zeile aus der Beschreibung der übergebenen Aufgabe und in der unteren Zeile aus einer Schaltfläche, mit der das Fenster wieder geschlossen werden kann. Falls die übergebene Aufgabe null sein sollte, ist nichts im Container vorhanden und also auch nichts zu tun. if (aufgabe!= null) add(new Label(aufgabe.getBeschreibung())); else add(new Label("Nichts zu tun!")); Button erledigt; if (aufgabe!= null) erledigt = new Button("Erledigt!"); else erledigt = new Button("Juhu!"); add(erledigt); Wenn die Schaltfläche gedrückt wird, soll sich das Fenster wieder schließen. Also muss das Fenster bei ihr als Ereignisbehandler angemeldet werden. erledigt.addactionlistener(this); Dazu muss auch die richtige Schnittstelle implementiert werden. implements ActionListener Und auch die entsprechende Methode geschrieben werden, die in diesem Fall die einzige Aufgabe hat, das Dialogfenster zu schließen. public void actionperformed(actionevent e) dispose(); Die vielen verwendeten Klassen und Schnittstellen werden wieder am Anfang der Datei importiert. import java.awt.dialog; import java.awt.frame; import java.awt.gridlayout; import java.awt.label; import java.awt.button; import java.awt.event.actionlistener; import java.awt.event.actionevent; Nun hat man einen kompletten ToDoManager mit grafischer Oberfläche. Juhu!! 8