Schwerpunkte. Java-Programmbeispiel: Quellen. Aufgabe. 15. Ereignisse (Events) Java-Beispiel: EyesApplet.java Eyes.java

Ähnliche Dokumente
11. GUI-Programmierung mit SWING Überblick

Eventhandling. Delegation model Eventhandler model

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

Grafikprogrammierung mit Java Teil 1/2

NTB Druckdatum:

Einstieg in die Informatik mit Java

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

Design Patterns I. Observer, Listener & MVC

Objektorientierte Software-Entwicklung

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

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

Einstieg in die Informatik mit Java

Einführung in die OOP mit Java

8.6 Visualisierung der Sortieralgorithmen

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

I. Grundlagen II. Ereignistypen III. Ereignisempfänger. Event-Handling (EH)

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

Abstrakte Klassen, Interfaces

Praktikum 4: Grafiken und Ereignisse

Einführung in die Informatik - Teil 4b - Zeichnen mit der Maus im JBuilder

Universität Paderborn Prof. Dr. Stefan Böttcher. Kapitel 3: Java Applets

Funktionale und Objekt-Orientierte Programmierkonzepte

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

GUI Programmierung in Java

Graphische Benutzungsoberflächen

Theorie zu Übung 8 Implementierung in Java

Graphische Programmierung: GUIs: graphical user interfaces

GUI Programmierung mit JAVA Swing

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

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

Algorithmen und Datenstrukturen

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

Session 1: Classes and Applets

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

Objektorientierte Programmierung

Klausur Software-Entwicklung März 01

Kapitel 13. Abstrakte Methoden und Interfaces. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

Beispiele für Ausdrücke. Der imperative Kern. Der imperative Kern. Imperativer Kern - Kontrollstrukturen. Deklarationen mit Initialisierung

JavaFX Interaction. Events Eventhandler Lambda-Ausdrücke

Grundlagen der Programmierung APPLETS

Graphical User Interfaces

6. Eventhandling in Java

Java Game Development Fabian Birzele Programmierpraktikum 2008 / 2009

GRAFISCHE BENUTZERSCHNITTSTELLEN

Der Ball kann angezeigt werden: anzeigen( ) {... } Der Ball kann z.b. seine Größe verändern: groesseaendern(int veraenderung) {... } usw.

Wiederholung. Klassenhierarchie:

Liste Programmieren Java Überblick

Objektorientierte Programmierung Studiengang Medieninformatik

Grafische Benutzeroberflächen

Grafische Benutzeroberflächen

Java - AWT Basispraktikum SystemArchitektur WS 2008/ Atanas Dimitrov

Aufbau einer typischen Java-Datei

14 Abstrakte Klassen, finale Klassen, Interfaces

Transkript:

Schwerpunkte 15. Ereignisse (Events) Java-Beispiel:.java Eyes.java Ereignisbehandlung (Event Handling) Vom Problem zum Programm SW-Architektur: Programme mit graphischer Nutzeroberfläche Ein Beispiel zu Events, Applets und Graphics Ereignisse: erzeugen und ist so ähnlich wie Ausnahmen erzeugen und API-Klassen: - - MouseEvent - Applet - Graphics K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 20015/16 Version: 1. Feb. 2016 2 Java-Programmbeispiel: Quellen Basierend auf einer Idee von S.N. Kamin, M.D. Mickunas, E.M. Reingold: An introduction to computer science Using Java, McGraw-Hill, 1 st und 2 nd Edition, 1998, 2002 Aufgabe Man entwickle ein Applet, in dem Augenpaare dem Cursor (der von der Maus bewegt wird) folgen. 3 Cursor bewegt (Ereignis) Position des Cursors abfragen Pupillen neu zeichnen 4

Ereignis Besonderes Vorkommnis außerhalb des Programms (Hardware) Tastatur betätigt (z. B. Enter-Taste) Maus bewegt / Taste betätigt graphisches Nutzerinterface bedient (z.b. Button gedrückt) löst bestimmte Reaktion des Programms aus. Ausgabe des Grad-Celsius-Wertes (TempApplet.java) Veränderte Augenpaare (Eyes.java,.java) Graphisches Objekt erscheint o. ä. Ereignisgesteuerte Programmausführung Normale Programmsteuerung: Eingabe mit main() oder init() gestartet und beendet ein Algorithmus A Ausgabe Ereignisgesteuerte Programmsteuerung: Initialisieren (z. B. Oberfläche aufbauen) (z.b. Quicksort, Maus im Labyrinth) Programmausführung: viele kleine Algorithmen werden aktiviert Button drücken Maus bewegen Enter-Taste betätigen A0 A1 A2 A3 A4 5 main() oder init() Ai kleine Algorithmen 6 Ereignisgesteuertes Programm: Ereignisschleife Zur Anforderungsdefinition Man entwickle ein Applet, in dem Augenpaare dem Cursor (der von der Maus bewegt wird) folgen. Button gedrückt? A1 Zu klärende Probleme: JVM steuert die Ereignisschleife: beobachtet, ob Ereignis auftritt Maus bewegt? Enter-Taste betätigt? A2 A3 Anzahl Augenpaare * ) Platzierung der Augen * ) Abmessungen für Pupille und Augapfel * ) In welchen zeitlichen Abständen soll die Blickrichtung verändert werden? (laufend/kontinuierlich: in kleinster möglicher Zeiteinheit) A4 * ) Feste Werte nach Programmstart, aber durch Konstanten im Programm leicht modifizierbar 7 8

Software-Architektur: Grundprinzip Software Architektur: UML Programme mit graphischer Oberfläche Komponenten für Nutzeroberfläche (Applet Klasse) strikte Trennung Komponenten für den inhaltlichen Teil (Augenpaar zeichnen) Eyes Architekturfehler: Vermischung beider Komponenten Augenpaar zeichnen Nutzeroberfläche Eyes - left, right : Point - leftpupil, rightpupil : Point - EYE_RADIUS, PUPIL_RADIUS: int Eyes (p: Point) stare (cursor: Point) gerichtet! init ( ) paint (Graphics g) mousemoved (MouseEvent e) mousedragged (MouseEvent e) Prinzip: Nutzeroberfläche kennt Anwendung - nicht umgekehrt 9 10 Zustand Verhalten Welche Zustandsänderung durch stare? Klasse 'E y e s' Zum Zeichnen eines Augenpaares Rechtes / linkes Auge: jeweils Mittelpunkt von Augapfel und Eyes Pupille sowie Radius - left, right : Point - leftpupil, rightpupil : Point - EYE_RADIUS, PUPIL_RADIUS: int Eyes (p: Point) stare (cursor: Point) Erzeuge Augenpaar mit Position p (Anfangszustand) Zeichne Augenpaar in Richtung 'cursor' (stare = (an)starren) Volle Form: stare(g: Graphics, cursor:point) 11 Klasse ' Grundlagen: - Ereignisbehandlung (Klasse ) - Applets (Klasse Applet) Aufruf aller Methoden durch Interpreter - nicht durch das Programm! Initialisierung (beim Programmstart) Aufruf bei Mausbewegung Aufruf bei Mausbewegung mit gedrückter Maus-Taste (drag) init ( ) Anfangszustand paint (Graphics g) mousemoved (MouseEvent e) mousedragged (MouseEvent e)* ) * ) nicht benötigt (technisches Detail) Direkt nach init() aufgerufen: beide Augenpaare malen lassen. 12

Ereignisgesteuertes Programm: Ereignisschleife public class Eyes { private Point left, right, leftpupil, rightpupil; private final int EYE_RADIUS = 30,PUPIL_RADIUS = 10; JVM steuert die Ereignisschleife Button gedrückt? Maus bewegt? Enter-Taste betätigt? mousemoved (MouseEvent e) import java.awt.*; import java.applet.*; import java.awt.event.*; public class extends Applet implements { Point cursor; Eyes e1, e2; public void init () { // Register the Listener. add(this); setsize(500,400); setbackground(color.light_gray); e1 = new Eyes(new Point (63,30)); // center of one eye e2 = new Eyes(new Point (437,30)); // center of the other cursor = new Point(250, 2000); // initial cursor public void paint(graphics g) { e1.stare(g, cursor); e2.stare(g, cursor); public void mousemoved (MouseEvent e) { public void mousedragged (MouseEvent e) { public Eyes(Point c) { left = new Point(c.x-EYE_RADIUS-3, c.y); right = new Point(c.x+EYE_RADIUS+3, c.y); private void fillcircle (Graphics g, Point center, int radius) { g.filloval(center.x-radius, center.y-radius, 2*radius, 2*radius); public void stare (Graphics g, Point cursor) { // Draw the white eyes g.setcolor(color.white); fillcircle(g, left, EYE_RADIUS); fillcircle(g, right, EYE_RADIUS); // Draw the pupils g.setcolor(color.black); leftpupil = compute (cursor, left); fillcircle(g, leftpupil, PUPIL_RADIUS); rightpupil = compute (cursor, right); fillcircle(g, rightpupil, PUPIL_RADIUS); private Point compute (Point cursor, Point eye) { double d = Math.sqrt((cursor.x-eye.x)*(cursor.x-eye.x) + (cursor.y-eye.y)*(cursor.y-eye.y)); int r = EYE_RADIUS - PUPIL_RADIUS; return new Point (eye.x + (int)((cursor.x-eye.x)*r/d), eye.y + (int)((cursor.y-eye.y)*r/d)); 13 14 Ereignisbehandlung (Event Handling) Besondere externe Vorkommnisse außerhalb des Programms: Signale der Umgebung an Programm Tastatur betätigt (z. B. Enter-Taste) Maus bewegt / Taste betätigt graphisches Nutzerinterface bedient (z.b. Button gedrückt) Vererbungshierarchie der Ereignisklassen (Auszug aus dem Java-API) EventObject AWTEvent ComponentEvent ActionEvent... führen zur Bildung eines Ereignis-Objekts. Objekt einer Event-Klasse (vgl. Ausnahme-Objekte erzeugt bei Laufzeitfehlern) KeyEvent InputEvent... MouseEvent Art: MouseEvent getpoint ( ) : Point... vgl. Ausnahmebehandlung (exceptions) Quelle: Maus Quelle: z.b. Enter Taste (Temperatur Applet) 15 16

Analogie: Ausnahmen - Ereignisse (Events) API-Klasse MouseEvent' Zur Laufzeit: besondere Situation An event which indicates that a mouse action occurred in a component Signal der Umgebung (periphere Geräte: Æ Tastatur / Maus) Laufzeitfehler erzeugt static int MOUSE_CLICKED Ausnahmeobjekt The "mouse clicked" event. Event-Objekt getmessage()... static int MOUSE_MOVED The "mouse moved" event. getpoint()... Art: NumberFormat Details: a1 StackTrace: Point getpoint() Art: MouseEvent b e h a n d e l t durch Returns the x,y position (curser) of the event relative to the source component. Objekt einer Unterklasse der Interface-Klasse 'EventListener' try-catch (Teil des Java - API) 17 18 API-Klasse (Interface) ' (Interface terface e-)komponenten e -)K )Komponenten zur Behandlung Be eh handlung von v Ereignissen: EventListener erer r-hierarchie The listener interface for receiving mouse motion events on a component. (For clicks and other mouse events, use MouseListener.) EventListener ActionListener KeyListener WindowListener Listener: beobachten Ereignisse und reagieren void mousedragged(mouseevent e) Invoked when a mouse button is pressed on a component and then dragged. Ereignis übergeben... void mousemoved(mouseevent e) behandelt: MouseMotionEvents durch festgelegte Methodenaufrufe. Invoked when the mouse cursor has been moved onto a component but no buttons have been pushed. behandelt: ActionEvents (vgl. Temperatur Applet) 19 20

Auswertung von MouseEvents durch class extends Applet implements { public void mousemoved (MouseEvent e){... Aufrufreihenfolge bei Maus-Bewegung Objekt e vom Typ MouseEvent gebildet; e enthält Informationen über Position des Cursors. Aufruf mousemoved(e) neue Position der Maus abgefragt: e.getpoint repaint(): ruft paint() erneut auf Augen jetzt neu gemalt 5. Technik und Ablauf der Ereignisbehandlung 1. Hardware schickt Signal an Betriebssystem 2. Java-VM-Maschine empfängt Signal vom Betriebssytem 3. Java-VM-Maschine erzeugt Ereignis-Objekt e 4. Java-VM-Maschine sendet Botschaft an Objekt der Ereignisbehandlung (d.h. durch Aufruf einer Methode): z.b. mousemoved(e) 5. Ereignisbehandlungsmethode wertet Ereignis-Objekt aus und reagiert, z.b. e.getpoint(); 1. 21 22 SW-Architektur: erweiterte Sicht (API) Component paint( ) repaint() add( ) setsize( ) setbackground( ) + > 100 weitere <<interface>> mousemoved( ) mousedragged( ) add(this): Das Applet wird als Objekt registriert, das bei Mausbewegungen informiert werden soll, d. h. dann reagieren kann. Mehrfachvererbung: ein Applet, das auf Events reagieren kann init() paint() mousemoved( ) mousedragged( ) Container paint(graphics g) + 50 weitere Panel addnotify() Applet init() + 21 weitere In definierte und benutzte Methoden aufgeführt import java.awt.*; import java.applet.*; import java.awt.event.*; public class extends Applet implements { Point cursor; Eyes e1, e2; public void init () { // Register the Listener. add(this); setsize(500,400); setbackground(color.light_gray); e1 = new Eyes(new Point (63,30)); // center of one eye e2 = new Eyes(new Point (437,30)); // center of the other cursor = new Point(250, 2000); // initial cursor public void paint(graphics g) { e1.stare(g, cursor); e2.stare(g, cursor); public void mousemoved (MouseEvent e) { public void mousedragged (MouseEvent e) { public class Eyes { private Point left, right, leftpupil, rightpupil; private final int EYE_RADIUS = 30,PUPIL_RADIUS = 10; public Eyes(Point c) { left = new Point(c.x-EYE_RADIUS-3, c.y); right = new Point(c.x+EYE_RADIUS+3, c.y); private void fillcircle (Graphics g, Point center, int radius) { g.filloval(center.x-radius, center.y-radius, 2*radius, 2*radius); public void stare (Graphics g, Point cursor) { // Draw the white eyes g.setcolor(color.white); fillcircle(g, left, EYE_RADIUS); fillcircle(g, right, EYE_RADIUS); // Draw the pupils g.setcolor(color.black); leftpupil = compute (cursor, left); fillcircle(g, leftpupil, PUPIL_RADIUS); rightpupil = compute (cursor, right); fillcircle(g, rightpupil, PUPIL_RADIUS); private Point compute (Point cursor, Point eye) { double d = Math.sqrt((cursor.x-eye.x)*(cursor.x-eye.x) + (cursor.y-eye.y)*(cursor.y-eye.y)); int r = EYE_RADIUS - PUPIL_RADIUS; return new Point (eye.x + (int)((cursor.x-eye.x)*r/d), eye.y + (int)((cursor.y-eye.y)*r/d)); 23 24

Klasse 'Eyes': das Problem? (für das Zeichnen des Auges) Klasse 'Eyes': das Problem? (für das Zeichnen des Auges) Augapfel mit fester Lage Augapfel mit fester Lage Satz des Pythagoras Ähnliche Dreiecke das Problem: geg.: Augapfel + Cursorposition ges.: Wo liegt die Pupille? Mittelpunkt Cursor Cursor 25 26 Klasse 'Eyes': das Problem? public class Eyes { private Point left, right, leftpupil, rightpupil; private final int EYE_RADIUS = 30,PUPIL_RADIUS = 10; E 2 2 d = (C.x -E.x) +(C.y-E.y) P P.x = E.x + (C.x - E.x) * r / d P.y = E.y + (C.y - E.y) * r / d r = Differenz der Radien r E: Mittelpunkt des Auges (Eye) C: Cursor-Punkt P: Mittelpunkt der Pupille (zu berechnen) d C 27 import java.awt.*; import java.applet.*; import java.awt.event.*; public class extends Applet implements { Point cursor; Eyes e1, e2; public void init () { // Register the Listener. add(this); setsize(500,400); setbackground(color.light_gray); e1 = new Eyes(new Point (63,30)); // center of one eye e2 = new Eyes(new Point (437,30)); // center of the other cursor = new Point(250, 2000); // initial cursor public void paint(graphics g) { e1.stare(g, cursor); e2.stare(g, cursor); public void mousemoved (MouseEvent e) { public void mousedragged (MouseEvent e) { public Eyes(Point c) { left = new Point(c.x-EYE_RADIUS-3, c.y); right = new Point(c.x+EYE_RADIUS+3, c.y); private void fillcircle (Graphics g, Point center, int radius) { g.filloval(center.x-radius, center.y-radius, 2*radius, 2*radius); public void stare (Graphics g, Point cursor) { // Draw the white eyes g.setcolor(color.white); fillcircle(g, left, EYE_RADIUS); fillcircle(g, right, EYE_RADIUS); // Draw the pupils g.setcolor(color.black); leftpupil = compute (cursor, left); fillcircle(g, leftpupil, PUPIL_RADIUS); rightpupil = compute (cursor, right); fillcircle(g, rightpupil, PUPIL_RADIUS); private Point compute (Point cursor, Point eye) { double d = Math.sqrt((cursor.x-eye.x)*(cursor.x-eye.x) + (cursor.y-eye.y)*(cursor.y-eye.y)); int r = EYE_RADIUS - PUPIL_RADIUS; return new Point (eye.x + (int)((cursor.x-eye.x)*r/d), eye.y + (int)((cursor.y-eye.y)*r/d)); 28

stare und compute Malt Augenpaar neu: Alte Position der Pupille: schwarz weiß Pupille blickt in Richtung cursor (schwarz) public void stare (Graphics g, Point cursor) Umsetzung der geometrischen Grundlagen: Berechnet Punkt P (Mittelpunkt der Pupille) private Point compute (Point cursor, Point eye) fillcircle : Kreis mit 'radius' um 'center'-punkt private void fillcircle (Graphics g, Point center, int radius) { malt Kreis in Quadrat (Oval in Rechteck) linker oberer Eckpunkt g.filloval(center.x-radius, center.y-radius, 2*radius, 2* radius); radius center y Länge und Breite des Rechtecks x 29 30 API-Klasse Graphics' Dynamische Sicht auf '' The Graphics class is the abstract base class for all graphics contexts that allow an application to draw onto components void drawrect(...) Draws the outline of the specified rectangle. abstract void filloval(int x, int y, int width, int heigth) Fills an oval bounded by the specific rectangle with the current color bei Start Eyes init () paint (g) mousemoved (e) bei Ereignis Java-Interpreter JVM Betriebssystem Graphics-Objekt: generiert für jedes Applet generiert bei Ereignis Applet g: Graphics e: MouseEvent 31 32

Klasse : Aufruf der Methoden public class extends Applet implements { Point cursor; Eyes e1, e2; Applet: initialisiert und registriert als public void init () {... direkt nach init() aufgerufen public void paint(graphics g) { e1.stare(g, cursor); e2.stare(g, cursor); automatischer Aufruf bei Maus-Bewegung public void mousemoved (MouseEvent e) { liefert physische Mausposition public void mousedragged (MouseEvent e) {... Mögliche Aufgaben zur Vertiefung 0. Programm anwenden und vollständig verstehen (Java-API) 1. Platzierung der Augen verändern 2. Andere Abmessungen: Größe von Pupille und Augapfel 3. Statt zwei Augenpaaren: vier 4. Dynamische Erzeugung von neuen Augenpaaren (Maustasten) 5. Erscheinungsbild neu: Augenlid 6. Auf Maustastendruck: Augenlider schließen sich benötigt: MouseListener Zu jedem Applet generiert JVM ein Graphics-Objekt g zum Malen im Applet Alle Methoden: durch JVM-Maschine aufgerufen 33 34 35