Kapitel 7: GUI-Rahmenwerk: AWT & Swing



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

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

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

Objektorientierte Software-Entwicklung

1. Konventionelle Ein-/Ausgabebetonte Programmierung

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

2. Programmierung von Benutzungsschnittstellen

GUI Programmierung mit JAVA Swing

7. Architektur interaktiver Systeme

B1. Ein-/Ausgabebetonte Programmierung

Zentrale Objekte zur Programmierung graphischer Benutzeroberflächen (GUI)

In Track B generell gute Java-Kenntnisse vorausgesetzt!

7. Architektur interaktiver Systeme

B1. Ein-/Ausgabebetonte Programmierung

B1. Ein-/Ausgabebetonte Programmierung

GRAFISCHE BENUTZERSCHNITTSTELLEN

Graphische Benutzungsoberflächen

Java I Vorlesung 11 Graphische Oberflächen mit Swing

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

GUI Programmierung in Java

Objektorientierte Programmierung

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

Swing Lernen am Code Teil 1

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

NTB Druckdatum:

Kapitel 8: Grafische Benutzerschnittstellen

Grafische Benutzeroberflächen mit Swing

2. Programmierung von Benutzungsschnittstellen

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

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

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

Kap. 35 Swing: Grundlagen Kap Swing: Hauptfenster

Das Model View Controller (MVC) Konzept

Grundlagen der Programmierung APPLETS

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

Abteilung Informatik, JFC/Swing 2004 Diego Schmidlin V2.2

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

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

Design Patterns 2. Model-View-Controller in der Praxis

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

In Track B generell gute Java-Kenntnisse vorausgesetzt!

Benutzeroberflächen. Java Teil 4

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

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Einstieg in die Informatik mit Java

Beispiel: Eine Choice-Liste...

AK-Automatisierungs und Kommunikationstechnik TI Technische Informatik. NWT Netzwerktechnik

Swing :Komponenten I (Teil 2)

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

Vorlesung Informatik II

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

Applets. Applets. Applets. Applet: Java-Programm Eingebettet in einer HTML-Seite Ausführung von einem Java-fähigen Web-Browser oder sog.

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

Java Projekt: Tic Tac Toe + GUI

11. GUI-Programmierung mit SWING Überblick

GUI-Programmierung in Java

Objektorientierte Programmierung. Kapitel 12: Interfaces

Java: Vererbung. Teil 3: super()

Grafikausgabe mit dem Abstract- Windowing-Toolkit. Eine Einführung

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

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI

Ereignisbehandlung 21

2A Basistechniken: Weitere Aufgaben

Tag 9: Grafische Benutzeroberflächen

JButton, JCheckBox, JRadioButton. Programmieren II. Vorlesung 7. Handout S. 1. Dr. Klaus Höppner. Hochschule Darmstadt Sommersemester 2009.

Mit der Maus im Menü links auf den Menüpunkt 'Seiten' gehen und auf 'Erstellen klicken.

Funktionale und Objekt-Orientierte Programmierkonzepte

Objektorientierte Softwareentwicklung

Ereignisverwaltung und Layout-Typen

Programmieren in Java

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Auswahl aus mehreren Alternativen:

Javakurs für Fortgeschrittene

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

DHBW Karlsruhe, Vorlesung Programmieren, Events Musterlösung

Einführung in GUI-Programmierung. javax.swing

Java Design und Event Handling. Natascha Hoebel Professur Prof. R. V. Zicari. AWT SWING Layout Design Event Handling

Java Einführung Umsetzung von Beziehungen zwischen Klassen. Kapitel 7

Einführung in die Programmierung

Innere Klassen in Java

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

Jetzt sollt ihr von der Vorlage der Grundversion 1.0 ein eigenes Textadventure erstellen.

Drucken, GUI, Design Pattern,... PDF, Usability, Observer Pattern, MVC

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

Programmierkurs Java

J.1. J.1 GUI-Programmierung in in Java Prof. Dr. Rainer Manthey Informatik II 1

Architektur interaktiver Systeme

Java Einführung Abstrakte Klassen und Interfaces

Prinzipien Objektorientierter Programmierung

Einführung in die Java- Programmierung

Programmieren 2 Selbststudium Semesterwoche 4

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

8 Design Patterns. Events

Sommersemester Implementierung III: GUI und Verhalten (Teil 2)

Tutorial04: Swing: Erstellen eines JFrames mit einem JSplitPane

Ein Manager mit CardLayout layout/cards.java

Programmieren 2 07 JavaFX-Properties und Data-Binding

Transkript:

Kapitel 7: GUI-Rahmenwerk: AWT & Swing 7.1 Aufbau & Funktionsweise 7.2 Beispiel Counter im Detail 7.3 Grafikprogrammierung an Beispielen 'The night is fine', the Walrus said, 'Do you admire the view?' Lewis Carroll Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-1

Entwicklungstufen von Benutzerschnittstellen Stapelverarbeitungssprache (batch control, job control) Zeilenorientierte Kommandosprache (Dialoge) z.b. Kommandosprachen von MS-DOS, UNIX Skriptsprachen-Interpreter: Shells Bildschirm- und Masken-orientierter Dialog z.b. Dialogoberfläche von MVS, VM/CMS Graphische Benutzungsoberfläche (Graphical User Interface) Multimedia-Benutzungsoberfläche Virtuelle Welt,... Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-2

GUIs: Meilensteine der Entwicklung 1980: Smalltalk-80-Oberfläche (Xerox-Star) 1983/84: Lisa/Macintosh-Oberfläche (Apple) 1985+: X-Windows / Motif (OSF) 1988: NextStep (Next) 1989?: OpenLook (Sun) 1987/91: OS/2 Presentation Manager (IBM) 1990: Windows 3.0 (Microsoft) 1995+: Windows 95/NT/XT (Microsoft) 1995+: AWT und Swing (SunSoft) und Linux CDE... AWT teils schon legacy Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-3

1973: XEROX Alto Maus & Bitmap 1984: Apple Macintosh 1981: XEROX Star echte Fenster 1985: X-Windows MIT 1988: NextStep Display- Postscript Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-4

Java Abstract Window Toolkit & Swing AWT: Grafik, Oberflächenkomponenten ( heavyweight ), Layout-Manager, Ereignisbehandlung Swing: AWT-Ergänzung, leistungsstarke Komponenten ( lightweight ) AWT: Look and Feel an Plattform angepasst Swing: Look and Feel von Plattform unabhängig Windows Solaris Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-5

GUIs erfüllen ergonomische Anforderungen Entspanntes Arbeiten Kontrolle beim Benutzer statt beim Programm Gedächtnis entlasten: Browsing statt Kommandos Fehlertoleranz: Undo-Operationen Menschengerechte Darstellung von Systemzustand: direkt manipulierbar Datenmengen: Ausschnitte in Fenstern, navigierbar Verzahnte Abläufe unterstützt flexibel & aufgabenangemessen den Menschen unterstützen Daten quasiparallel in verschiedenen Werkzeugen Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-6

7.1 Aufbau & Funktionsweise Ergonomische Anforderungen umsetzen: Kontrolle beim Benutzer => Call-Backs (OS und Java!), aktiviert auf Ereignisse hin. Einheitliches Look & Feel Menschengerechte Darstellung => Fenster aus Standard-Komponenten, zusammengebaut nach Layout-Strategien, direkt manipulierbar durch Benutzer. Verzahnte Abläufe => möglich durch Tasking (siehe Kap. 6), unterstützt durch MVC-Architektur(-Muster). Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-7

Oberflächenbausteine in Java - 1 Component (abstrakt): Oberklasse (fast!) aller Bestandteile der Oberfläche public void setsize (int width, int height); public void setvisible (boolean b); u.a. Basis des Event-Handlings Container (abstrakt): Oberklasse der Komponenten, die andere Komponenten enthalten public void add (Component comp); public void setlayout (LayoutManager mgr); u.a. Basis der Layout-Gestaltung Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-8

Oberflächenbausteine in Java - 2 JPanel (konkret): Standard-Container für Layout rahmenlose Zeichenfläche Oberklasse von Applet Window (abstrakt): Gemeinsamkeiten von Frame und Dialog public void pack(); JFrame (konkret): echtes Anwendungs-Fenster mit Titel Dialog (abstrakt): Oberklasse von modalen Eingabe-Fenstern z.b. MessageDialog, InputDialog Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-9

Oberflächenbausteine in Java - 3 JTextComponent: Oberklasse von TextField und TextArea public void settext(string t); public String gettext(); public void seteditable(boolean b); JTextField: Textfeld mit einer Zeile JLabel: Einzeiliger unveränderbarer Text JButton: Druckknopf mit Textbeschriftung Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-10

AWT-Klassenhierarchie (Ausschnitt) Object Bekanntes Muster!! MenuComponent Component * MenuBar MenuItem Text Component Label Button Container Menu TextField Panel Window ScrollPane PopupMenu Swing-Komponenten mit einem J davor Dialog FileDialog Frame Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-11

Layout-Festlegung Layout-Manager-Objekte ordnen Container-Inhalt an FlowLayout (links-/rechtsbündig/zentriert, Abstände) GridLayout (Zeilen[0=*], Spalten, Abstände) BorderLayout (Platzierungen: North, West,..., Center) GridBagLayout (für gehobene Ansprüche) leer / selbstdefinierter LayoutManager Beispiel für Entwurfsmuster Strategy Kapselung der Strategie in einem Manager-Objekt ähnlich verwendbar bei Spiel-Strategien ähnlich auch bei Durchlauf-Strategien für Graphen Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-12

Am Beispiel: Layout-Strategien für 5 Buttons JButton button1 = new JButton("einfach"); JButton button2 = new JButton("eine"); JButton button3 = new JButton("Reihe"); JButton button4 = new JButton("von"); JButton button5 = new JButton("JButtons"); panel.setlayout( new FlowLayout(FlowLayout.LEFT,10,30)); panel.setlayout( Eins von beiden! new GridLayout(0,2,10,30)); panel.add(button1); panel.add(button2); panel.add(button3); panel.add(button4); panel.add(button5); Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-13

Wirkung der Layout-Strategien FlowLayout(FlowLayout.LEFT,10,30) 30 10 10 30 30 30 10 GridLayout(0,2,10,30)) Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-14

Layout-Festlegung absolut Es geht auch ohne Layout-Manager: JButton b = new JButton("fest"); JPanel p = (JPanel)getContentPane(); p.setlayout(null); p.add(b); b.reshape(100,50,60,10); // Einzüge links und oben, Breite, Höhe Vorgehen nicht erstrebenswert, weil Probleme bei größenverändernden Fensteroperationen, z.b. Knopf verschwindet in nicht sichtbarem Bereich Verschiedene OS-Fenstersysteme verschiedene Proportionen realisieren => Portierungsprobleme Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-15

Ereignisse Definition: Ein Ereignis ist ein Vorgang in der Umwelt des Softwaresystems von vernachlässigbarer Dauer, der für das System von Bedeutung ist, z.b. eine Benutzerinteraktion. Beispiele für Benutzerinteraktions-Ereignisse: Drücken eines Knopfs, einer Taste, Mausklick Auswahl eines Menüpunkts Verändern von Text Zeigen auf ein Gebiet Öffnen, Schließen oder Verschieben eines Fensters Andere Ereignisse sind z.b. Signale von Timern oder von anderen Programmen Objekte, die Ereignisse beobachten, heißen Listener. Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-16

Behandlung von Ereignissen Benutzereingabe (Tastendruck, Mausklick) Tastatur- bzw. Maustreiber gibt Daten (Scancode, Position, Zeit) an OS Fenstersystem des OS gibt Daten an angesprochenes Fenster Fenster mit Java-Programm ermittelt (über Layout) die Komponente Controller Java gibt Daten an den zur Komponente gehörigen Listener weiter Der vom Programmierer entwickelte Callback-Code ändert Modell View Modelländerung zieht evtl. Änderung des Fensterinhalts nach sich Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-17

Ereignis-Klassen Klassen der Benutzeroberfläche: Window / Frame Panel Button TextField,... entsprechende Ereignisklassen: WindowEvent MouseEvent ActionEvent KeyEvent,... Zuordnung (Beispiele): Window (Frame) erzeugt WindowEvent» z.b. bei Betätigung des Schließknopfes Button erzeugt ActionEvent Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-18

Beispiel Fenster schließen public interface WindowListener extends EventListener { public void WindowClosed (WindowEvent ev); public void WindowOpened (WindowEvent ev); public void WindowIconified (WindowEvent ev);... public void WindowClosing (WindowEvent ev); public class WindowAdapter implements WindowListener { Andere Beispiele für Adapter-Muster vgl Kap 4, S. 25 ff public void WindowClosed (WindowEvent ev) { public void WindowOpened (WindowEvent ev) { public void WindowIconified (WindowEvent ev) {... public void WindowClosing (WindowEvent ev) {... implementiert alle Aktionen formal durch Nichtstun Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-19

Schließbares Fenster in Java import java.awt.*; import java.awt.event.*; class WindowCloser extends WindowAdapter { public void windowclosing(windowevent event) { System.exit(0); class ExampleFrame extends Frame { public ExampleFrame () { settitle("example"); setsize(150,50); addwindowlistener(new WindowCloser()); setvisible(true); public static void main (String[] argv) { ExampleFrame f = new ExampleFrame(); Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-20

Schließbares Fenster: Klassenstruktur <<interface>> WindowListener windowclosing (e: WindowEvent) Window addwindowlistener (l: WindowListener) <<use>> WindowEvent WindowAdapter Frame setsize settitle setvisible WindowCloser registriert bei ExampleFrame Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-21

Die Model-View-Controller-Architektur Graphische Oberflächen erlauben, dass dieselbe Information in mehreren (verschiedenen oder gleichartigen) Fenstern gleichzeitig angezeigt wird oder mehrfach in einem Fenster auf verschiedene Weisen (z.b. Explorer mit Dateibaum und Dateiliste). Dabei ist ein zeitlich verzahntes, quasi-paralleles Arbeiten auf derselben Information möglich. Die verschiedenen Fenster müssen irgendwie synchronisiert und die Information konsistent gehalten werden. Fenster können dynamisch hinzukommen oder entfallen. Die Model-View-Controller-Architektur wurde entwickelt, um mit solchen Situationen systematisch umzugehen: Das Modell (Model) repräsentiert Programmzustand und -daten. Die Sicht (View) ist die Darstellung der Information auf dem Bildschirm. Die ereignisorientierte Steuerung (Controller) ist für die Verarbeitung der Benutzereingaben zuständig. Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-22

Modell und Sicht Ereignisse bewirken Änderungen Sicht Sicht Benachrichtigung über Änderungen Modell Beispiel: Dokumentenansicht, Statusanzeige,... Frage: Wie hält man das Modell unabhängig von den einzelnen Sichten darauf? Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-23

Das Beobachter - Muster (auch Publisher/Subscriber ) A-Beobachter update beobachtet * <<interface>> Observer update A for all observers o do: o.update() Observable addobserver deleteobserver setchanged notifyobservers Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-24

java.util.observable, java.util.observer public class Observable { public void addobserver(observer o); public void deleteobserver(observer o); protected void setchanged(); public void notifyobservers(); public void notifyobservers(object arg); public interface Observer { public void update (Observable o, Object arg); Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-25

Beispielablauf (Sequenzdiagramm) a: A b1: A-Beobachter b2: A-Beobachter addobserver(b1) addobserver(b2) setchanged() notifyobservers(arg) update(arg) update(arg) Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-26

Zum Beobachter-Muster Beobachtete Klassen definieren, welche Veränderungen beobachtbar sind, d.h. aktiv den Beobachtern mitgeteilt werden und wann die Mitteilung erfolgen soll. Beobachtete Klassen haben keine Information darüber, was die Beobachter konkret tun; sie müssen nicht geändert werden, wenn sich Beobachter verändern, wenn neue Beobachter dazukommen oder Beobachter wegfallen. Die Argumente für notify() beschreiben»meist nur Art der Änderung, nicht gesamte Zustandsinformation» Beobachter können normale Methodenaufrufe nutzen, um sich näher zu informieren. Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-27

7.2 Beispiel Counter im Detail Dear System Builder, I love to count. Build me a system to help me with that counting.... I love to count lots of things. Regards, The Count Peter Coad & Jill Nicola Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-28

Das Counter-Beispiel Ein paar Details nur im kompletten Programm! Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-29

Counter-Steuerung über Menü Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-30

Counter-Steuerung über Knöpfe Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-31

Model-View-Controller-Architektur View Controller bc: ButtonController cf: CounterFrame <<beobachtet>> <<ändert>> Model c: Counter 4711 Counter value increment setvalue Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-32

Counter: das fachliche Modell class Counter { private int value = 0; public int getvalue() { return value; public void setvalue(int v) { value = v; public void reset() { setvalue(0); public void increment() { setvalue(getvalue()+1); public void decrement() { setvalue(getvalue()-1); Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-33

Beobachtbares Modell (Model) class Counter extends Observable { private int value = 0; public int getvalue() { return value; public void setvalue(int v) { value = v; setchanged(); notifyobservers(); Von Observable ererbte Methoden! public void reset() { setvalue(0); public void increment() { setvalue(getvalue()+1); public void decrement() { setvalue(getvalue()-1); Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-34

CounterFrame: kombiniert View & Controller Komponenten vereinbaren Paneele, Knöpfe, Menü, Wertanzeige mit Beschriftung View erzeugen im Konstruktor von CounterFrame JPanel, JButtons,... Panele mit LayoutManagern ausstatten Komponenten in Panele bzw. Menü einfügen Controller für Komponenten Aktionen für Knöpfe und Menü-Punkte Anbindung ans Modell muss also ein Observer sein (update-methode) Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-35

Counter: Struktur der Oberfläche Fensterrahmen (OS-spezifisch) mit Titel & Knöpfen change menubar valuelabel valuedisplay diplaypanel incbutton resetbutton decbutton buttonpanel panel Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-36

Counter: die Komponenten anlegen panel = (JPanel)getContentPane(); buttonpanel = new JPanel(); incbutton = new JButton("Increment"); resetbutton = new JButton("Set to Zero"); decbutton = new JButton("Decrement"); displaypanel = new JPanel(); valuelabel = new JLabel("Current Value: "); valuedisplay = new JTextField("0",8); menubar = new JMenuBar(); change = new JMenu("Change"); negative = new JMenuItem("times (-1)"); tovalue = new JMenuItem("to..."); tomax = new JMenuItem("to Max"); Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-37

Counter: Container und LayoutManager panel.setlayout(new BorderLayout()); buttonpanel.setlayout(new FlowLayout()); buttonpanel.add(incbutton); buttonpanel.add(resetbutton); buttonpanel.add(decbutton); panel.add(buttonpanel,"south"); displaypanel.add(valuelabel); valuedisplay.sethorizontalalignment(4); valuedisplay.seteditable(false); displaypanel.add(valuedisplay); panel.add(displaypanel,"center"); change.add(negative); change.add(tovalue); change.add(tomax); menubar.add(change); setjmenubar(menubar); FlowLayout ist Default! rechtsbündig Norden, Osten und Westen bleiben leer Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-38

Counter: Aktionen für Knöpfe incbutton.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { mycounter.increment(); ); Anonyme innere Klassen resetbutton.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { mycounter.setvalue(0);... mit redefinierten Methoden ); decbutton.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { mycounter.decrement(); ); Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-39

Counter: Aktionen für Menüpunkte tovalue.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { String num = JOptionPane.showInputDialog("new value is?"); mycounter.setvalue(integer.parseint(num)); ); negative.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { mycounter.setvalue(0-mycounter.getvalue()); ); tomax.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { mycounter.setvalue(2147483647); ); Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-40

Counter: Anbindung ans Modell // die Modellanbindung im Konstruktor final Counter mycounter = c; c.addobserver(this); final, damit in inneren Klassen ansprechbar // dazu eine Observer-spezifische Methode public void update(observable o, Object a){ valuedisplay.settext( String.valueOf(((Counter)o).getValue()) ); wenn sich das Model ändert Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-41

7.3 Grafikprogrammierung an Beispielen Jedes Paneel bringt seinen Zeichenstift mit, den man sich wie folgt beschaffen kann: Graphics g = drawpane.getgraphics() (); Elementare Zeichenoperationen: g.setcolor(color.blue); //.black. oder... g.drawline(fromx,fromy,tox,toy); g.drawarc(...); // Bezier g.setfont(...); g.drawstring("hallo"); "); Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-42

Komplexere Grafikoperationen Mehr siehe Graphics2D g.drawoval(topleftx,toplefty,width,height); g.filloval(topleftx,toplefty,width,height); g.drawrect(topleftx,toplefty,width,height); g.fillrect(topleftx,toplefty,width,height); topleft height width g.drawpolygon(xkoords,ykoords,size); g.fillpolygon(xkoords,ykoords,size); Zwei Arrays der Länge Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-43

Beispiel Scribble Eine minimale Grafik-Anwendung, das Scribble -Zeichenprogramm: Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-44

Scribble : die Komponenten anlegen // Komponenten als Attribute vereinbaren: private int lastx, lasty; // letzte Maus-Koordinaten JPanel panel; JButton erasebutton; im Konstruktor // Komponenten anlegen und platzieren: panel = (JPanel)getContentPane(); panel.setlayout(new BorderLayout()); erasebutton = new JButton("Erase"); panel.add(erasebutton,"south"); final JPanel drawpane = new JPanel(); panel.add(drawpane,"center"); Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-45

Scribble : Aktionen für Fenster und Knopf // Fenster schließbar addwindowlistener(new WindowAdapter() { public void windowclosing(windowevent e) { dispose(); System.exit(0); ); // Scribble-Operation Erase erasebutton.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { Graphics g = drawpane.getgraphics() (); g.setcolor(drawpane.getbackground drawpane.getbackground()); g.fillrect(0,0,getsize().width, ); getsize().height); Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-46

Scribble : Aktionen für Mausbewegungen // Scribble-Maus-Operationen drawpane.addmouselistener(new MouseAdapter() { public void mousepressed (MouseEvent e) { lastx = e.getx(); lasty = e.gety(); ); drawpane.addmousemotionlistener (new MouseMotionAdapter() { public void mousedragged (MouseEvent e) { int x = e.getx(); int y = e.gety(); Graphics g = drawpane.getgraphics(); g.drawline(lastx,lasty,x,y); ); lastx = x; lasty = y; Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-47

Beobachtung bei Scribble Bei Fensterbewegungen, -größenveränderung etc verschwindet das gezeichnete Bild?! Zusammenspiel der Zeichenmethoden im Grafikframework: update() nach Fensterbewegungen etc automatisch paint() die eigentliche Zeichenmethode => redefinieren! repaint() Anstossen des Zeichenvorgangs vom Progamm aus Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-48

Technik des Double Buffering class... extends JPanel { public void paint (Graphics g) { if (im == null) { im = createimage(width,height); gr = im.getgraphics(); // mit gr auf im zeichnen g.drawimage(im,0,0,width,height,this); public void refresh ( ) { im = null; flickerfreie Animation Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-49

Beispiel Dashboard Eine komplexere Grafik-Anwendung ist das Dashboard - Simulationsprogramm: Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-50

Beispiel Dashboard zeigt viel: Simulation lose gekoppelte Geräte => Observer & Observable Zeittakt-gesteuert => Timer-Thread Gerätehierarchie Dial (rpm, mph) Gauge (Fuel, Temp, Oil) => Double Buffering Pedal (Accelerator, Brake) Benutzersteuerbare Geräte Gas, Bremse, Schaltung Knöpfe zum Tanken => Controlle / Listener Layout Fenster insgesamt im Border-Layout 3 x 3 Grid im Center-Bereich des Fensters darunter (South) die Knöpfe in zentriertem Flow-Layout Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-51

Dashboard : Struktur des Center-Panels Gridlayout 3 x 3 : Fensterrahmen (OS-spezifisch) mit Titel & Knöpfen FuelView TempView OilView SpeedView TurnView Acc.-View GearView BrakeView Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-52

Dashboard : Klassendiagramm Panel GaugeView DialView PedalView GearView FuelView OilView TempView TurnView SpeedView Acc.-View BrakeView dependants Observer Dashboard CarModel Timer Observable Thread Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-53

Dashboard : View- und Controller-Klassen ItemListener MouseListener MouseAdaptor als innere Klassen in Dashboard!! Gear- Item- Listener Brake- Mouse- Listener Acc.- Mouse- Listener GearView BrakeView Acc.-View Dashboard Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektorientierte Programmierung K7-54