7. Architektur interaktiver Systeme 7.1 Entkopplung durch Sichten 7.2 Ereignisgesteuerter Programmablauf 7.3 Benutzungsoberflächen 7. Architektur interaktiver Systeme 7.1 Entkopplung durch Sichten 'The night ist istfine', the the Walrus said, said, 'Do 'Do you you admire the the view?' Lewis Carroll Schichtenarchitektur Benutzungsoberfläche Window Button Menu (Fachliches) Modell Teammitglied Teambesprechung Ablaufsteuerung Datenhaltung z.b. relationale Datenbank Seite 1
Sichten: Motivierendes Beispiel Sicht 1 Sicht 2 cf: CounterFrame Modell c: Counter value = 7 Counter ctr + count() + reset() + getvalue() Modell und Sicht Sicht 1 Sicht 2 Methodenaufrufe => Änderungen Modell Benachrichtigung über Änderungen Beispiele: Verschiedene Dokumentenansichten, Statusanzeigen, Verfügbarkeit von Menüpunkten Frage: Wie hält man das Modell unabhängig von den einzelnen Sichten darauf? Muster "Observer" Ein Zähler (Beispiel fachliches Modell) class Counter { private int ctr = 0; public void count () { ctr++; public void reset () { ctr = 0; public int getvalue () { return ctr; Seite 2
Beobachtbares Modell (Model) class Counter extends Observable { private int ctr = 0; public void count () { ctr++; setchanged(); notifyobservers(); public void reset () { ctr = 0; setchanged(); notifyobservers(); public int getvalue () { return ctr; Das fachliche Modell enthält keinerlei Bezug auf die Benutzungsoberfläche! 7. Architektur interaktiver Systeme 7.2 Ereignisgesteuerter Programmablauf I claim not not to tohave controlled events, but but confess plainly that that events have have controlled me. me. Abraham Lincoln, 1864 Ereignisse Definition Ein Ereignis ist ein Vorgang in der Umwelt des Softwaresystems von vernachlässigbarer Dauer, der für das System von Bedeutung ist. Eine wichtige Gruppe von Ereignissen sind Benutzerinteraktionen. Beispiele für Benutzerinteraktions-Ereignisse: Drücken eines Knopfs Auswahl eines Menüpunkts Verändern von Text Zeigen auf ein Gebiet Schließen eines Fensters Verbergen eines Fensters Drücken einer Taste Mausklick Seite 3
Beispiel für Ereignisverarbeitung Das erste Java-Programm in der Vorlesung mit einer "graphischen Benutzungsoberfläche"... Hinweis "für Java-Insider": Hier noch reines "AWT", im nächsten Kapitel wird "Swing" eingeführt werden. Aufgabe: Ein leeres, aber schliessbares Fenster anzeigen Schliessknopf (Fenster geschlossen, Programm beendet) Hinweis: Fensterdarstellung ("look and feel") gemäß Solaris CDE; Schliessknopf in Windows-Darstellung: Ereignis-Klassen Klassen von Ereignissen in (Java-)Benutzungsoberflächen: WindowEvent ActionEvent MouseEvent KeyEvent,... Bezogen auf Klassen für Oberflächenelemente (siehe Kapitel 7.3): Window Frame Button TextField,... Zuordnung (Beispiele): Window (mit Frame) erzeugt WindowEvent» z.b. Betätigung des Schliessknopfes Button erzeugt ActionEvent» bei Betätigung des Knopfes Hauptprogramm für Fensteranzeige import java.awt.*; class ExampleFrame extends Frame { public ExampleFrame () { settitle("untitled"); setsize(150, 50); setvisible(true); class GUI1 { public static void main (String[] argv) { ExampleFrame f = new ExampleFrame(); Seite 4
Registrierung für Listener In java.awt.frame (ererbt von java.awt.window): public class Frame... { public void addwindowlistener (WindowListener l) java.awt.event.windowlistener ist eine Schnittstelle: public interface WindowListener {... Methoden zur Ereignisbehandlung Vergleich mit Observer-Muster: Frame bietet einen "Observable"-Mechanismus Window-Listener ist eine "Observer"-Schnittstelle Hauptprogramm für schließbares Fenster import java.awt.*; import java.awt.event.*; class WindowCloser implements WindowListener {... siehe später... class ExampleFrame extends Frame { public ExampleFrame () { settitle("untitled"); setsize(150, 50); addwindowlistener(new WindowCloser()); setvisible(true); class GUI2 { public static void main (String[] argv) { ExampleFrame f = new ExampleFrame(); Seite 5