B1. Ein-/Ausgabebetonte Programmierung

Ähnliche Dokumente
1. Konventionelle Ein-/Ausgabebetonte Programmierung

7. Architektur interaktiver Systeme

B1. Ein-/Ausgabebetonte Programmierung

B1. Ein-/Ausgabebetonte Programmierung

7. Architektur interaktiver Systeme

Medientechnik. Andreas Butz Ludwig-Maximilians-Universität München Sommersemester Vorlesungskonzept: Heinrich Hußmann

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

2. Programmierung von Benutzungsschnittstellen. 2.1 Modell-Sicht-Paradigma 2.2 Bausteine für grafische Oberflächen 2.3 Ereignisgesteuerte Programme

Architektur interaktiver Systeme

Architektur interaktiver Systeme

14) Architektur interaktiver Systeme

Wiederholung: Objektorientierte Oberflächen-Programmierung mit Java und Swing

Architektur interaktiver Systeme

Architektur interaktiver Systeme

2. Programmierung von Benutzungsschnittstellen

26) Architektur interaktiver Systeme

Medientechnik. Heinrich Hußmann Ludwig-Maximilians-Universität München Sommersemester Prof. Hußmann: Medientechnik. LMU München Sommer 2009

Medientechnik. Heinrich Hußmann Ludwig-Maximilians-Universität München Sommersemester Prof. Hußmann: Medientechnik. LMU München Sommer 2010

2. Programmierung von Benutzungsschnittstellen

70. Programmierung interaktiver Systeme mit modularen Controllern

70. Programmierung interaktiver Systeme

70. Programmierung interaktiver Systeme

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

Einführung in die Programmierung für NF. Grafische Benutzeroberflächen

Objektorientierte Software-Entwicklung

Ziele. Kapitel 8: Grafische Benutzerschnittstellen. AWT und Swing. Ziele (2)

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

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

Kapitel 8: Grafische Benutzerschnittstellen

GUI Programmierung mit JAVA Swing

Tag 9: Grafische Benutzeroberflächen

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

Grafische Benutzeroberflächen

In Track B generell gute Java-Kenntnisse vorausgesetzt!

Grafische Benutzeroberflächen

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

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

Grundlagen der Programmierung (GP) Prof. Dr. H. Schlingloff Joachim Hänsel

Grafische Benutzeroberflächen

Betreutes Programmieren Vorlesung Informatik II, Blatt 5

Vorlesung Informatik II

Einführung: Grafische Benutzeroberflächen. Programmieren II. Dr. Klaus Höppner. Hochschule Darmstadt Sommersemester / 22

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

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

Sommersemester Implementierung III: GUI und Verhalten (Teil 2)

Funktionale und Objekt-Orientierte Programmierkonzepte

Einführung in die Programmierung für NF. Übung

Hauptklausur: PRGII MD

Objektorientierte Programmierung

11. GUI-Programmierung mit SWING Überblick

Seite 1. Kapitel 7: GUI-Rahmenwerk: AWT & Swing. Entwicklungstufen von Benutzerschnittstellen

Zentrale Objekte zur Programmierung graphischer Benutzeroberflächen (GUI)

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

Eventhandling. Delegation model Eventhandler model

Eventhandling. Delegation model Eventhandler model

Einführung in die OOP mit Java

NTB Druckdatum:

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

Medientechnik. Übung 3 MVC & Observer

Ereignisse (Events) in Java

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

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

In Track B generell gute Java-Kenntnisse vorausgesetzt!

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

Ist eine Softwarekomponente, die dem Benutzer eines Computers die Interaktion mit der Maschine über grafische Symbole erlaubt

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

Instrumentierung und Dekodierung

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

Medientechnik. Lehr- und Forschungseinheit Medieninformatik

Softwaretechnik (Medieninformatik): GUIs mit Swing Überblick

Liste Programmieren Java Überblick

Einführung in GUI-Programmierung. javax.swing

Kapitel 7: GUI-Rahmenwerk: AWT & Swing

Javakurs für Fortgeschrittene

Java GUI Entwicklung mit Swing

Graphical User Interfaces

Computergrafik 2016 Oliver Vornberger. Kapitel 02: Grafische Benutzeroberflächen

Programmiertechnik GUI Programmierung mit Java Swing

5. Java Swing Grundlagen der Programmierung II (Java) Prof. Dr. Bernhard Humm Hochschule Darmstadt University of Applied Sciences Sommersemester 2006

Einführung in GUI-Programmierung. javax.swing

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

DHBW Karlsruhe, Angewandte Informatik Programmieren in JAVA W. Geiger, T. Schlachter, C. Schmitt, W.

Übung Nr. 20 Freitag, 09:00-11:00 Uhr in E3.301

CS1005 Objektorientierte Programmierung Bachelor of Science (Informatik)

Grafikprogrammierung mit Java Teil 1/2

Medientechnik. Übung 2 Java Swing

Graphische Benutzungsoberflächen

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

Benutzeroberflächen. Abstract Windowing Toolkit, Rahmen, Wächter, Ereignisbehandlung, Ausgabe, Menüs.

Softwaretechnik Programmieren von GUIs mit Swing

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

GRAFISCHE BENUTZERSCHNITTSTELLEN

Hochschule der Medien Prof. Uwe Schulz 13. Juli 2009 Klausur Informatik, EDV-Nr Seite 1 von 6. Teil 2: Aufgaben

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

Transkript:

B1. Ein-/Ausgabebetonte Programmierung B1.1 Mensch-Maschine-Kommunikation B1.2 Modell-Sicht-Paradigma B1.3 Bausteine für grafische Oberflächen B1.4 Ereignisgesteuerte Programme Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-29 Ereignisgesteuerter Programmablauf 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 Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-30

Ereignis-Klassen Klassen von Ereignissen in (Java-)Benutzungsoberflächen: WindowEvent ActionEvent MouseEvent KeyEvent,... Bezogen auf Klassen für Oberflächenelemente: Window JFrame JButton JTextField,... Zuordnung (Beispiele): JFrame erzeugt WindowEvent» z.b. Betätigung des Schliessknopfes JButton erzeugt ActionEvent» bei Betätigung des Knopfes Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-31 Hauptprogramm für Fensteranzeige import java.awt.*; Import javax.swing.*; class ExampleFrame extends JFrame { public ExampleFrame () { settitle("untitled"); setsize(150, 50); setvisible(true); class GUI1 { public static void main (String[] argv) { ExampleFrame f = new ExampleFrame(); Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-32

Ereignis-Delegation (1) Laufzeit-System betätigt Schliessknopf Benutzer Reaktion auf ein Ereignis durch Programm: Ereignis wird vom Laufzeitsystem erkannt Programm soll von technischen Details entkoppelt werden Beobachter-Prinzip:» Programmteile registrieren sich für bestimmte Ereignisse» Laufzeitsystem sorgt für Aufruf an passender Stelle Objekte, die Ereignisse beobachten, heißen bei Java Listener. Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-33 Ereignis-Delegation (2) Laufzeit-System betätigt Schliessknopf Benutzer f: Frame Quelle vom System neu erzeugt: e: WindowEvent registriert bei l: WindowListener Delegation: Aufruf einer Methode von l mit Argument e Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-34

Registrierung für Listener In javax.swing.jframe (ererbt von java.awt.window): public class JFrame... { 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 Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-35 java.awt.event.windowlistener public interface WindowListener extends EventListener { public void windowclosed (WindowEvent ev); public void windowopened (WindowEvent ev); public void windowiconified (WindowEvent ev); public void windowdeiconified (WindowEvent ev); public void windowactivated (WindowEvent ev); public void windowdeactivated (WindowEvent ev); public void windowclosing (WindowEvent ev); java.util.eventlistener: Basisinterface für alle "Listener" (keine Operationen) Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-36

java.awt.event.windowevent public class WindowEvent extends AWTEvent {... // Konstruktor, wird vom System aufgerufen public WindowEvent (Window source, int id); // Abfragemöglichkeiten public Window getwindow();... Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-37 java.awt.event.actionevent, ActionListener public class ActionEvent extends AWTEvent {... // Konstruktor, wird vom System aufgerufen public ActionEvent (Window source, int id, String command); // Abfragemöglichkeiten public Object getsource (); public String getactioncommand();... public interface ActionListener extends EventListener { public void actionperformed (ActionEvent ev); Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-38

WindowListener für Ereignis "Schließen" import java.awt.*; import java.awt.event.*; class WindowCloser implements WindowListener { public void windowclosed (WindowEvent ev) { public void windowopened (WindowEvent ev) { public void windowiconified (WindowEvent ev) { public void windowdeiconified (WindowEvent ev) { public void windowactivated (WindowEvent ev) { public void windowdeactivated (WindowEvent ev) { public void windowclosing(windowevent event) { System.exit(0); Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-39 Hauptprogramm für schließbares Fenster import java.awt.*; import java.awt.event.*; import javax.swing.*; class WindowCloser implements WindowListener {... siehe vorhergehende Folie... class ExampleFrame extends JFrame { public ExampleFrame () { settitle("untitled"); setsize(150, 50); addwindowlistener(new WindowCloser()); setvisible(true); class GUI2 { public static void main (String[] argv) { ExampleFrame f = new ExampleFrame(); Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-40

java.awt.event.windowadapter public abstract class WindowAdapter implements WindowListener { public void windowclosed (WindowEvent ev) { public void windowopened (WindowEvent ev) { public void windowiconified (WindowEvent ev) { public void windowdeiconified (WindowEvent ev) { public void windowactivated (WindowEvent ev) { public void windowdeactivated (WindowEvent ev) { public void windowclosing (WindowEvent ev) { Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-41 Vereinfachung 1: WindowAdapter benutzen import java.awt.*; import java.awt.event.*; import javax.swing.*; class WindowCloser extends WindowAdapter { public void windowclosing(windowevent event) { System.exit(0); class ExampleFrame extends JFrame { public ExampleFrame () { settitle("untitled"); setsize(150, 50); addwindowlistener(new WindowCloser()); setvisible(true); class GUI3 { public static void main (String[] argv) { ExampleFrame f = new ExampleFrame(); Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-42

Schließbares Fenster: Klassenstruktur <<interface>> WindowListener windowclosing (e: WindowEvent) Window addwindowlistener (l: WindowListener) <<use>> WindowAdapter WindowEvent JFrame setsize settitle setvisible WindowCloser registriert bei ExampleFrame Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-43 Vereinfachung 2: Innere Klasse benutzen import java.awt.*; import java.awt.event.*; import javax.swing.*; class ExampleFrame extends JFrame { class WindowCloser extends WindowAdapter { public void windowclosing(windowevent event) { System.exit(0); public ExampleFrame () { settitle("untitled"); setsize(150, 50); addwindowlistener(new WindowCloser()); setvisible(true); class GUI4 { public static void main (String[] argv) { ExampleFrame f = new ExampleFrame(); Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-44

Vereinfachung 3: Anonyme Klasse benutzen import java.awt.*; import java.awt.event.*; import javax.swing.*; class ExampleFrame extends JFrame { public ExampleFrame () { settitle("untitled"); setsize(150, 50); addwindowlistener(new WindowAdapter() { public void windowclosing(windowevent event) { System.exit(0); ); setvisible(true); class GUI5 { public static void main (String[] argv) { ExampleFrame f = new ExampleFrame(); Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-45 Zähler-Beispiel: Entwurf der Bedienelemente JPanel buttonpanel JButton countbutton JButton resetbutton JButton exitbutton Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-46

Die Sicht (View): Bedienelemente class class CounterFrame extends JFrame JFrame { JPanel JPanel valuepanel = new new JPanel(); JTextField valuedisplay = new new JTextField(10); JPanel JPanel buttonpanel = new new JPanel(); JButton countbutton = new JButton("Count"); JButton resetbutton = new JButton("Reset"); JButton exitbutton = new JButton("Exit"); public public CounterFrame (Counter c) c) { settitle("swingcounter"); valuepanel.add(new JLabel("Counter value")); valuepanel.add(valuedisplay); valuedisplay.seteditable(false); getcontentpane().add(valuepanel); buttonpanel.add(countbutton); buttonpanel.add(resetbutton); buttonpanel.add(exitbutton); getcontentpane().add(buttonpanel); pack(); setvisible(true); Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-47 Layout-Manager Definition Ein Layout-Manager ist ein Objekt, das Methoden bereitstellt, um die graphische Repräsentation verschiedener Objekte innerhalb eines Container-Objektes anzuordnen. Formal ist LayoutManager ein Interface, für das viele Implementierungen möglich sind. In Java definierte Layout-Manager (Auswahl): FlowLayout (java.awt.flowlayout) BorderLayout (java.awt.borderlayout) GridLayout (java.awt.gridlayout) In awt.component: public void add (Component comp, Object constraints); erlaubt es, zusätzliche Information (z.b. Orientierung, Zeile/Spalte) an den Layout-Manager zu übergeben Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-48

Flow-Layout Grundprinzip: Anordnung analog Textfluß: von links nach rechts und von oben nach unten Default für JPanels z.b. in valuepanel und buttonpanel für Hinzufügen von Labels, Buttons etc. Parameter bei Konstruktor: Orientierung auf Zeile, Abstände Constraints bei add: keine 1 2 3 4 5 6 Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-49 Border-Layout Grundprinzip: Orientierung nach den Seiten (N, S, W, O) bzw. Mitte (center) Default für Window, JFrame z.b. in CounterFrame für Hinzufügen von valuepanel, buttonpanel Parameter bei Konstruktor: Keine Constraints bei add: BorderLayout.NORTH, SOUTH, WEST, EAST, CENTER Oberer ("Nord")-Bereich (z.b. valuepanel) Unterer ("Süd")-Bereich (z.b. buttonpanel) Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-50

Grid-Layout Grundprinzip: Anordnung nach Zeilen und Spalten Parameter bei Konstruktor: Abstände, Anzahl Zeilen, Anzahl Spalten Constraints bei add: Zeilen- und Spaltenindex als int-zahlen 1,1 1,2 1,3 2,1 2,2 2,3 Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-51 Die Sicht (View): Alle sichtbaren Elemente class class CounterFrame extends JFrame JFrame { JPanel JPanel valuepanel = new new JPanel(); JTextField valuedisplay = new new JTextField(10); JPanel JPanel buttonpanel = new new JPanel(); JButton countbutton = new new JButton("Count"); JButton resetbutton = new new JButton("Reset"); JButton exitbutton = new new JButton("Exit"); public public CounterFrame (Counter c) c) { settitle("swingcounter"); valuepanel.add(new JLabel("Counter value")); valuepanel.add(valuedisplay); valuedisplay.seteditable(false); getcontentpane().add(valuepanel, BorderLayout.NORTH); buttonpanel.add(countbutton); buttonpanel.add(resetbutton); buttonpanel.add(exitbutton); getcontentpane().add(buttonpanel, BorderLayout.SOUTH); pack(); setvisible(true); Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-52

Model-View-Controller-Architektur View Controller bc: ButtonController cf: CounterFrame <<beobachtet>> <<steuert>> Model c: Counter k = 7 Counter k + count() + reset() + getvalue() Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-53 Zähler-Beispiel: Anbindung Model/View class class CounterFrame extends JFrame JFrame implements Observer {...... JTextField valuedisplay = new new JTextField(10);...... public public CounterFrame (Counter c) c) {...... valuepanel.add(valuedisplay); valuedisplay.seteditable(false); valuedisplay.settext(string.valueof(c.getvalue()));...... c.addobserver(this); pack(); setvisible(true); public public void void update update (Observable o, o, Object Object arg) arg) { Counter c = (Counter) o; o; valuedisplay.settext(string.valueof(c.getvalue())); Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-54

Grundidee der Implementierung von Observable Der Programmierer muß den hier skizzierten Code nicht kennen, sondern nur indirekt anwenden! public class Observable { private Collection observed; private boolean changed = false;... public void addobserver (Observer o) { observed.add(o); public void setchanged() { changed = true; public void notifyobservers (Object arg) { Iterator it = observed.iterator(); if (!changed) return; while (it.hasnext()) { (it.next()).update(this, arg); Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-55 java.awt.event.actionevent, ActionListener public class ActionEvent extends AWTEvent {... // Konstruktor wird vom System aufgerufen public Object getsource () public String getactioncommand()... public interface ActionListener extends EventListener { public void actionperformed (ActionEvent ev); Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-56

Wieviele Controller? Möglichkeit 1: Ein Controller für mehrere Buttons (sh.nächste Folie) Speicherplatzersparnis Aber: Wie unterscheiden wir, woher die Ereignisse kommen? Z.B. über getsource()und Abfrage auf Identität mit Button-Objekt Z.B. über getactioncommand() und Abfrage auf Kommando-String» Default: Kommando-String aus Button-Beschriftung» Kann gesetzt werden mit setactioncommand()» Standard-Kommando-String gleich Button-Label - nicht ungefährlich Möglichkeit 2: Direkte Angabe von Eventhandlern» am knappsten über anonyme innere Klassen Viele Controller-Objekte Siehe weiter hinten Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-57 Die Steuerung (Controller) class ButtonController implements ActionListener { Counter mycounter; public void actionperformed (ActionEvent event) { String cmd cmd = event.getactioncommand(); if if (cmd.equals("count")) mycounter.count(); if if (cmd.equals("reset")) mycounter.reset(); if if (cmd.equals("exit")) System.exit(0); public ButtonController (Counter c) c) { mycounter = c; c; Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-58

Zähler-Beispiel: Anbindung des Controllers class CounterFrame extends JFrame {...... JPanel buttonpanel = new new JPanel(); JButton countbutton = new new JButton("Count"); JButton resetbutton = new new JButton("Reset"); JButton exitbutton = new new JButton("Exit"); public CounterFrame (Counter c) c) {...... ButtonController bc bc = new new ButtonController(c); countbutton.setactioncommand("count"); countbutton.addactionlistener(bc); buttonpanel.add(countbutton); resetbutton.setactioncommand("reset"); resetbutton.addactionlistener(bc); buttonpanel.add(resetbutton); exitbutton.setactioncommand("exit"); exitbutton.addactionlistener(bc); buttonpanel.add(exitbutton);...... Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-59 Alles zusammen: CounterFrame (1) class CounterFrame extends JFrame implements Observer { JPanel valuepanel = new JPanel(); JTextField valuedisplay = new JTextField(10); JPanel buttonpanel = new JPanel(); JButton countbutton = new JButton("Count"); JButton resetbutton = new JButton("Reset"); JButton exitbutton = new JButton("Exit"); public CounterFrame (Counter c) { settitle("swingcounter"); valuepanel.add(new JLabel("Counter value")); valuepanel.add(valuedisplay); valuedisplay.seteditable(false); valuedisplay.settext(string.valueof(c.getvalue())); getcontentpane().add(valuepanel,borderlayout.north); ButtonController bc = new ButtonController(c); countbutton.setactioncommand("count"); countbutton.addactionlistener(bc); buttonpanel.add(countbutton); resetbutton.setactioncommand("reset"); resetbutton.addactionlistener(bc); buttonpanel.add(resetbutton); exitbutton.setactioncommand("exit"); exitbutton.addactionlistener(bc); buttonpanel.add(exitbutton); getcontentpane().add(buttonpanel,borderlayout.south); Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-60

Alles zusammen: CounterFrame (2) addwindowlistener(new WindowCloser()); c.addobserver(this); pack(); setvisible(true); public void update (Observable o, Object arg) { Counter c = (Counter) o; valuedisplay.settext(string.valueof(c.getvalue())); class ButtonController implements ActionListener {... (wie oben)... class WindowCloser implements WindowListener extends WindowAdapter { public void windowclosing(windowevent event) { System.exit(0); Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-61 Controller durch anonyme Klassen class CounterFrame extends JFrame { private Counter ctr; public CounterFrame (Counter c) { settitle("counter"); ctr = c; countbutton.addactionlistener(new ActionListener() { public void actionperformed (ActionEvent event) { ctr.count(); ); Controller und View bilden eine Einheit: In der Praxis weit verbreitet. Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-62

"Look-and-Feel" Jede Plattform hat ihre speziellen Regeln für z.b.: Gestaltung der Elemente von "Frames" (Titelbalken etc.) Standard-Bedienelemente zum Bewegen, Schließen, Vergrößern, von "Frames" Dasselbe Java-Programm mit verschiedenen "Look and Feels": Windows Solaris (CDE) Macintosh (Classic) Macintosh (MacOS X) Einstellbares Look-and-Feel: Standard-Java oder plattformspezifisch Ludwig-Maximilians-Universität München Prof. Hußmann Medientechnik B1-63