Vorlesung Informatik II Universität Augsburg Wintersemester 2011/2012 Prof. Dr. Bernhard Bauer Folien von: Prof. Dr. Robert Lorenz Lehrprofessur für Informatik 12. UML GUI-Schicht 1
GUI-Schicht Sichtbarmachen von fachlichen Daten an der Oberfläche Polling: Regelmäßiges Abfragen von Änderungen der fachlichen Daten durch die GUI-Schicht Beobachtermuster: Signalisieren von Änderungen der fachlichen Daten durch die Fachkonzeptschicht 2
GUI-Schicht Sichtbarmachen von fachlichen Daten an der Oberfläche Bisher: Anzeige von Daten nur durch ein Fenster möglich, das sich selbst aktualisiert Jetzt: Anzeige von Daten simultan in mehreren Fenstern möglich. Aktualisierung aller Fenster durch Implementierung des Beobachtermusters (Polling später) 3
GUI-Schicht Beobachtermuster: Klassendiagramm (grün: API) Sorgt dafür, dass bei Änderung eines Objekts alle davon abhängigen Objekte benachrichtigt und automatisch aktualisiert werden 4
GUI-Schicht Beobachtermuster: Klassendiagramm (grün: API) <<interface>> Observer update(o :Observable, arg :Object) 0..* 1..* observers Observable notifyobservers() setchanged() addobserver() deleteobserver() GUIKlasse update(o :Observable, arg :Object) 0..* subject 1..1 DatenKlasse 5
GUI-Schicht Beobachtermuster: Schnittstelle Oberserver GUI-Klasse implementiert Observer- Schnittstelle update(o:observable,arg:object): aktualisiert angezeigte Daten von o 6
GUI-Schicht Beobachtermuster: Klasse Observable Daten-Klasse erbt von Observable-Klasse und kann dann folgende Operationen benutzen: notifyobservers() Startet Aktualisierung aller Observer-Objekte deleteobserver() Löscht Verbindung zu Observer-Objekt addobserver() Baut Verbindung zu Observer-Objekt auf setchanged() Teilt mit, dass eine Veränderung des Observable-Objekts stattgefunden hat 7
GUI-Schicht Beobachtermuster: Sequenzdiagramm User new GUIKlasse() subject:datenklasse addobserver(this) g:guiklasse... changedaten()... setchanged() notifyobservers() update(subject,null) [g in observers]... loop 8
Bisher: Ein Fenster zum Erfassen, Ändern und Anzeigen von Daten Jetzt: Ein Fenster für das Anzeigen von Daten Ein anderes Fenster für das Erfassen und Ändern von Daten Vorschlag für eine Systematisierung der gegenseitigen Aufrufe von Fenstern (Dialogstruktur) 9
Erfassungsfenster Erstelle für jede Klasse des Fachkonzepts ein Erfassungsfenster zum Erfassung und Ändern von Objekten (Attribute und Beziehungen) Grafisches Interaktionselement für jedes Atribut und jede Beziehung Schaltflächen oder pop-up-menü-einträge für Operationen 10
Erfassungsfenster Erstelle für jede Klasse des Fachkonzepts ein Erfassungsfenster Standardschaltflächen: Ok Fensters Speichern des Objekts und Schließen des Übernehmen Speichern ohne Schließen des Fensters Abbrechen Schließen und Verwerfen der Eingabe Liste Öffnen des zugehörigen Listenfensters 11
Erfassungsfenster Erstelle für jede Klasse des Fachkonzepts ein Erfassungsfenster 1-Assoziationen wie ein als zusätzliches Attribut aufnehmen *-Schaltfläche: öffnet Erfassungsfenster der assoziierten Klasse, Verbindung mit neu erfasstem Objekt...-Schaltfläche: öffnet Auswahlliste der assoziierten Klasse, Verbindung mit selektiertem Objekt 12
Erfassungsfenster Erstelle für jede Klasse des Fachkonzepts ein Erfassungsfenster *-Assoziationen als zusätzliche Liste aufnehmen *-Schaltfläche: öffnet Erfassungsfenster der assoziierten Klasse, neu erfasstes Objekt Liste hinzufügen...-schaltfläche: öffnet Auswahlliste der assoziierten Klasse, selektiertes Objekt Liste hinzufügen x-schaltfläche: Löscht Verbindung mit selektiertem Objekt Bei mehreren Assoziationen: Ein Register pro Assoziation 13
Erfassungsfenster Erstelle für jede Klasse des Fachkonzepts ein Erfassungsfenster Sonderfall Generalisierungen Bei konkreter Oberklasse: Erfassungsfenster für Oberklasse und jede Unterklasse. Zugriff auf alle geerbten Attribute in Erfassungsfenstern für die Unterklassen bei abstrakter Oberklasse: kein Erfassungsfenster für Oberklasse. Zugriff auf alle geerbten Attribute im Erfassungsfenster für die Unterklassen [analog bei mehrstufiger Generalisierung] 14
Erfassungsfenster Erstelle für jede Klasse des Fachkonzepts ein Erfassungsfenster Anbindung an Fachkonzeptklassen Erfassungsfenster kennt zugehörige Fachkonzeptklasse mit Container und kann auf deren Attribute und Operationen zugreifen, aber nicht umgekehrt. Anbindung durch 1-zu-1-Assoziation 15
Erfassungsfenster Erstelle für jede Klasse des Fachkonzepts ein Erfassungsfenster Anbindung an Fachkonzeptklassen DatenKlasseContainer 1..1 GUIErfassung 0..1 subject 1..1 meineobjekte 0..* DatenKlasse 16
Erfassungsfenster Erstelle für jede Klasse des Fachkonzepts ein Erfassungsfenster Standard-Operationen save() update() onok() OnÜbernehmen() OnAbbrechen() OnListe() Übergabe der Eingabedaten an subject Lesen und Darstellen der subject-daten Operationen zu Schaltflächen 17
Erfassung eines Objekts: Sequenzdiagramm User ok:button :GUIErfassung onclick new ActionEvent() e:actionevent actionperformed(e) subject onok() save() getactioncommand() s new DatenKlasse() set...()... 18
Listenfenster Erstelle für jede Containerklasse des Fachkonzepts ein Listenfenster Anzeige aller Objekte einer Klasse mit den wichtigsten Attributen in einer Liste / Tabelle grafisches Interaktionselement für jedes Klassenattribut Schaltflächen oder pop-up-menü-einträge für Klassenoperationen 19
Listenfenster Erstelle für jede Containerklasse des Fachkonzepts ein Listenfenster Standardschaltflächen: Neu Ändern Löschen Öffnen eines leeren Erfassungsfensters Erfassungsfenster für selektiertes Objekt Löschen des selektierten Objekts Schließen Schließen des Listenfensters 20
Listenfenster Erstelle für jede Containerklasse des Fachkonzepts ein Listenfenster Anbindung an Fachkonzeptklassen Listenfenster-Klasse kennt zugehörige Containerklasse, aber nicht umgekehrt Anbindung über *-zu-1-assoziation Benutzung des Bobachtermusters, um simultanes Anzeigen in mehreren Fenstern zu erlauben 21
Listenfenster Erstelle für jede Containerklasse des Fachkonzepts ein Listenfenster Anbindung an Fachkonzeptklassen <<interface>> Observer 0..* 1..* observers Observable GUIListe 0..* alledaten 1..1 DatenKlasseContainer 22
Listenfenster Erstelle für jede Containerklasse des Fachkonzepts ein Listenfenster Standardoperationen update() Containers OnNeu() OnÄndern() OnLöschen() OnSchließen() Auslesen und Darstellen aller Objekte des Operationen zu Schaltflächen 23
Erfassung eines Objekts und Listenfenster aktualisieren: Sequenzdiagramm :GUIErfassung :DatenKlasseContainer actionperformed(e) onok() new DatenKlasse() save() set...() subject adddaten(subject) setchanged() notifyobservers() 24
Mögliche Erweiterungen/Verallgemeinerungen: Eigene Fenster für: Erfassung eines neuen Objekts (Kern-Attribute, keine Beziehungen) Liste zur Auswahl eines Objekts für Erfassung (Übernahme von Attributwerten) Liste zur Auswahl eines Objekts für Aufbau von Objektbeziehungen Liste zur Auswahl eines Objekts für Löschen/Änderungen Modifizierung eines Objekts (alle Attribute und Beziehungen) 25
Mögliche Erweiterungen/Verallgemeinerungen: Darstellung als Zustandsautomat für eine Objekt-Art uebernehmen Zustand: Aktiviertes Fenster erfassen Erfassun g ok abbrechen liste Auswah l starten Programm ok abbrechen ok abbrechen Zustandübergang: Aktionsname beenden liste List e aendern Modifizierun g ok abbrechen loeschen 26
3-Schichtelmodell gesamt <<interface>> Observer 0..* 1..* observers Observable GUIListe GUIErfassung 0..* 0..1 alledaten 1..1 subject 1..1 DatenKlasseContainer 1..1 1..1 meineobjekte 0..* DatenKlasse <<interface>> Datenhaltung store 0..1 1..1 DatenContainer Datei 27