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

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

Abstrakte Klassen und Schnittstellen. Abstrakte Klassen und Schnittstellen. Abstrakte Klassen und Schnittstellen. Vererbung von abstrakten Methoden

GUI Programmierung mit JAVA Swing

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

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

Objektorientierte Software-Entwicklung

NTB Druckdatum:

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

Java I Vorlesung 11 Graphische Oberflächen mit Swing

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

Objektorientierte Programmierung

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

Benutzeroberflächen. Java Teil 4

7. Architektur interaktiver Systeme

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

Einführung in Swing. Graphical User Interface

GUIs in Java und ihre Programmierung

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

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

AK-Automatisierungs und Kommunikationstechnik TI Technische Informatik. NWT Netzwerktechnik

Grundlagen der Programmierung APPLETS

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

Einbindung der Tastatur

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

04 - Actions. Actions

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

GUI-Programmierung in Java

Objektorientierte und Funktionale Programmierung SS 2014

Tutorial04: Swing: Erstellen eines JFrames mit einem JSplitPane

2A Basistechniken: Weitere Aufgaben

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

Programmieren 2 Selbststudium Semesterwoche 4

Zentrale Objekte zur Programmierung graphischer Benutzeroberflächen (GUI)

Softwarepraktikum: Enigma

JAVA Oberflächen mit Swing

Observer-Pattern (Java vs..net vs. Qt) Seminar Software-Entwurf Tim Rademacher

Ereignisbehandlung 21

6. Objektorientiertes Design

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

Webentwicklung mit Vaadin 7. Theoretische und praktische Einführung in Vaadin 7. Christian Dresen, Michael Gerdes, Sergej Schumilo

Vorlesung 13. Sitzung Grundlegende Programmiertechniken

Grafische Benutzeroberflächen mit Swing

Kapitel 14. Systemarchitektur

Ansonsten VIEL SPAß! Nicholas Ohs (GK 11 IF 2)

Objektorientierte Softwareentwicklung

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

Grafikprogrammierung mit Java Teil 1/2

Swing Lernen am Code Teil 1

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

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

Swing oder AWT? Was ist das: Swing bzw. AWT. Haupterkennungsmerkmal von Swing Source-Code:

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

DHBW Karlsruhe, Vorlesung Programmieren, Events Musterlösung

Graphische Benutzungsoberflächen

GRAFISCHE BENUTZERSCHNITTSTELLEN

Objekt-Orientierte Programmierung

Ein Manager mit CardLayout layout/cards.java

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 14/15. Kapitel 11. Fehler und Ausnahmen 1

von Anja Austermann Drag and Drop

Teil 1: Grundeigenschaften von Rechnern und Software

Kap. 35 Swing: Grundlagen Kap Swing: Hauptfenster

Institut für Informatik

Teil 1: Grundeigenschaften von Rechnern und Software

Codestil. Erläuterung und Definition eines einheitlichen Codestils. Anfänger-Praktikum SS 2004 Gruppe 2 Tutor Aaron Ruß Autor: Tomas Cernaj

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

Rückblick. Geltungsbereich von lokalen Variablen? Wo leben lokale Variablen? Geltungsbereich von Instanzvariablen? Wo leben Instanzvariablen?

Einstieg in die Informatik mit Java

Observer-Beispiel. Observer-Beispiel

Programmieren in Java

Klausur vom 14. Juni Informatik 4

Kapitel 6. Vererbung

Udo Matthias Munz. Datenbanken und SQL. mit. Einführung. Informationstechnik

Enumerations und innere Klassen

Java Lab 2006/12/13 Client

Hintergrund und Motivation

11. GUI-Programmierung mit SWING Überblick

GUI-Programmierung in Java

public class Beispiel1 extends Frame {

2. Programmierung von Benutzungsschnittstellen

Java Projekt: Tic Tac Toe + GUI

Software Engineering Entwurfsmuster (update: 11.6.)

Kapitel 6. Vererbung

Drucken soll nur das Panel, nicht der ganze Rahmen gedruckt werden.

Grundlagen der Informatik für Ingenieure I

3-schichtige Informationssystem-Architektur

Kapitel 6. Vererbung

Java Beans.

Klassen in Java. Klassen

Beispiellösung der Klausur zu Objektorientierte Programmierung mit Java 09. Juli 2004 (SS 2004)

Programmieren I. Dokumentation mit Javadoc Heusch 10.4 Ratz Institut für Angewandte Informatik

3 Objektorientierte Konzepte in Java

3 Objektorientierte Konzepte in Java

Nachholklausur (6 ECTS) Einführung in die Informatik: Programmierung und Software-Entwicklung. Nachname... Vorname... Matrikelnummer... Studienfach...

Probeklausur: Programmierung WS04/05

Theorie zu Übung 8 Implementierung in Java

Einstieg in die Informatik mit Java

11. GUI-Programmierung mit SWING Überblick

Testen von grafischen Benutzeroberflächen

Javakurs für Fortgeschrittene

Transkript:

Programmieren II Events (Ereignisse) Heusch 16.6 (2. Bd) Ratz 15 KIT Die Forschungsuniversität in der Helmholtz-Gemeinschaft www.kit.edu

Events in Java Graphische Anwendungen werden über Events gesteuert. Ein Event kann von einem Benutzer ausgelöst werden indem er die Maus bewegt, einen Button anklickt oder eine Taste drückt. In Java gibt es zwei unterschiedliche Event-Modelle: Event-Modell 1.0 und 1.1. Wir verwenden nur das Event-Modell 1.1. 2 W. Geiger, W. Süß, T. Schlachter, C. Schmitt

Das Java Event-Modell 1.1 (1) 3 Dieses Event-Modell basiert auf dem Konzept der Event- Listener. Ein Event-Listener (Ereignisempfänger) ist ein Objekt, das auf Events reagieren möchte. Eine Event-Quelle ( event source ) ist ein Objekt, das Events generiert. Eine Event-Quelle enthält intern Listen von (Event-)Listenern, die über auftretende Events informiert werden möchten, stellt Methoden bereit, mit denen sich Listener in diese Listen eintragen und wieder aus ihnen entfernen können. Es gibt verschiedene Typen von Events. Für unterschiedliche Event-Typen gibt es in einer Event- Quelle jeweils eine eigene Listener-Liste. W. Geiger, W. Süß, T. Schlachter, C. Schmitt

Das Java Event-Modell 1.1 (2) Die verschiedenen Event-Typen werden jeweils durch eine eigene Klassen repräsentiert. Alle Event-Klassen sind Unterklassen von java.util.eventobject java.util.eventobject +--java.awt.awtevent +--java.awt.event.actionevent (z.b. für gedrückte Buttons) +--java.awt.event.adjustmentevent +--java.awt.event.componentevent.. +--java.awt.event.focusevent. +--java.awt.event.windowevent. +--java.awt.event.inputevent.. +--java.awt.event.mouseevent. +--java.awt.event.keyevent +-- 4 W. Geiger, W. Süß, T. Schlachter, C. Schmitt

Das Java Event-Modell 1.1 (3) Wird ein Event ausgelöst, benachrichtigt die Event-Quelle alle in der entsprechenden Liste eingetragenen Listener- Objekte, dass das Event aufgetreten ist. Die Benachrichtigung erfolgt in der Weise, dass sie eine bestimmte Methode der Listener-Objekte aufruft und ein Event-Objekt übergibt. Damit eine Quelle diese Methode der Listener aufrufen kann, müssen die Listener eines bestimmten Event-Typs diese Methode enthalten. Das wird dadurch sichergestellt, dass die Event-Listener eines bestimmten Event-Typs ein entsprechendes Interface implementieren müssen, z.b. das Interface ActionListener Dieses Interface hat als einzige Methode void actionperformed(actionevent e) 5 W. Geiger, W. Süß, T. Schlachter, C. Schmitt

Listener-Interfaces in java.awt.event ActionListener AdjustmentListener AWTEventListener ComponentListener ContainerListener FocusListener HierarchyBoundsListener HierarchyListener InputMethodListener ItemListener KeyListener MouseListener MouseMotionListener MouseWheelListener TextListener WindowFocusListener WindowListener WindowStateListener 6 W. Geiger, W. Süß, T. Schlachter, C. Schmitt

Java Events 1.1 und Design-Patterns (1) Die Java-Events entsprechen dem allgemeinen objektorientierten Entwurfsmuster (Design Pattern) Observer (Beobachter, s. Vorlesung Softwareengineering) Event-Quelle Event-Listener Quelle: http://www.it-academy.cc/images/paedubucher/1517/observer.png 7 W. Geiger, W. Süß, T. Schlachter, C. Schmitt

Java Events 1.1 und Design-Patterns (2) Zu einem Subjekt (subject) kann es mehrere Beobachter (observer) geben. Beispiel: Listener 1 Listener 2 Listener 3 Event-Quelle Quelle und weitere Infos: http://userpages.umbc.edu/~tarr/dp/lectures/observer.pdf 8 W. Geiger, W. Süß, T. Schlachter, C. Schmitt

Java Events 1.1 und Design-Patterns (3) Das Java 1.1-Eventmodell eignet sich auch gut für die Implementierung des Model-View-Controller -Patterns dank der Entkopplung von GUI und Eventhandling. Trennung von Model (Datenmodell) View (Darstellung, z.b. Swing-Komponente) Controller, Vermittler zwischen beiden (z.b. ActionListener) View Controller Model Event e Button (Event-Quelle) ActionListener KlasseX 9 W. Geiger, W. Süß, T. Schlachter, C. Schmitt

Vorteile des 1.1-Modells Hohe Flexibilität Durch die Registrierung von Event-Listenern bei Event-Quellen kann man die Event-Benachrichtigungsströme frei steuern, je nachdem, wie man sie braucht. Eine Trennung der GUI vom restlichen Programmcode wird ermöglicht. Man kann noch zur Laufzeit Listener hinzufügen oder entfernen. Geringer Overhead Ein Objekt wird ausschließlich über die Event-Typen benachrichtigt, die es verarbeiten (bzw. weiterleiten) will. Einfache Identifizierung eines Event Der Typ eines Events ist anhand seiner Klasse erkennbar. Unterschiedliche Event-Arten eines Typs werden durch eigene Listener-Methode behandelt, so dass eine entspr. Prüfung entfallen kann. 10 W. Geiger, W. Süß, T. Schlachter, C. Schmitt

Beispiel import java.awt.toolkit; import java.awt.event.*; import javax.swing.*; public class Beep extends JFrame implements ActionListener { JButton button = new JButton("Click me!"); public Beep() { this.add(this.button); this.button.addactionlistener(this); this.setdefaultcloseoperation(jframe.exit_on_close); this.setsize(200, 150); this.setvisible(true); public void actionperformed(actionevent e) { Toolkit.getDefaultToolkit().beep(); public static void main(string[] args) { new Beep(); 11 W. Geiger, W. Süß, T. Schlachter, C. Schmitt

Weiteres Beispiel (1) import java.awt.flowlayout; import java.awt.event.*; import javax.swing.*; public static class ButtonEventDemo implements ActionListener { JFrame f = new JFrame("Event Frame"); JTextField text = new JTextField("enter text..."); JButton button1 = new JButton("Button 1"); JButton button2 = new JButton("Button 2"); public ButtonEventDemo() { this.f.setdefaultcloseoperation(jframe.exit_on_close); this.f.setlayout(new FlowLayout()); this.f.add(this.text); this.text.addactionlistener(this); this.f.add(this.button1); this.button1.addactionlistener(this); this.f.add(this.button2); this.button2.addactionlistener(this); this.f.setsize(400, 100); this.f.setvisible(true); public static void main(string[] args) { new ButtonEventDemo(); public void actionperformed(actionevent e) { if (e.getsource() == this.text) System.out.println("Text changed"); //s. a. nächste Fol else System.out.println(((JButton) e.getsource()).gettext() + " pressed."); vorführen 12 W. Geiger, W. Süß, T. Schlachter, C. Schmitt

Weiteres Beispiel (2) Oder ganz generisch : public void actionperformed(actionevent e) { if (e.getsource() == component1) { // Aktion 1 if (e.getsource() == component2) { // Aktion 2 if (e.getsource() == component3) { // Aktion 3 // Bis alle Event-Quellen abgearbeitet sind... Mit getsource() erhält man die Objektreferenz auf die GUI-Komponente, für die das Event ausgelöst wurde; z.b. auf den Button, der gerade angeklickt wurde. Der Rückgabewert ist vom Typ Object. 13 W. Geiger, W. Süß, T. Schlachter, C. Schmitt

Events mit anonymen inneren Klassen behandeln import java.awt.event.*; import java.awt.*; import javax.swing.*; public class EventsWithAnonymousClass extends JFrame { 14 JTextField text = new JTextField("Whatever"); JButton button = new JButton("Button"); EventsWithAnonymousClass() { this.setlayout(new FlowLayout()); this.setdefaultcloseoperation(jframe.exit_on_close); this.add(this.text); this.add(this.button); this.button.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { button.settext(text.gettext()); ); this.setsize(400, 300); this.setvisible(true); public static void main(string[] args) { new EventsWithAnonymousClasses(); W. Geiger, W. Süß, T. Schlachter, C. Schmitt Screenshots: siehe nächste Folie Die anonyme innere Klasse kann auf alle Attribute (und Methoden) der äußeren Klasse zugreifen - allerdings nicht auf lokale Variablen des Konstruktors, es sei denn, dass diese Variablen als final deklariert sind!

Screenshot zum vorherigen Beispiel Fenster nach dem Starten der Applikation Fenster nach dem Klicken des Buttons 15 W. Geiger, W. Süß, T. Schlachter, C. Schmitt

Verschiedene Arten des Event-Handlings (1) import java.awt.toolkit; import java.awt.event.*; import javax.swing.*; public class Beep1 extends JFrame implements ActionListener { JButton button = new JButton("Click me!"); public Beep1() { this.add(this.button); this.button.addactionlistener(this); this.setdefaultcloseoperation( JFrame.EXIT_ON_CLOSE); this.setsize(200, 150); this.setvisible(true); public void actionperformed(actionevent e){ Toolkit.getDefaultToolkit().beep(); import java.awt.toolkit; import java.awt.event.*; import javax.swing.*; public class Beep2 extends JFrame { JButton button = new JButton("Click me!"); public Beep2() { this.add(this.button); this.button.addactionlistener( new ActionListener() { public void actionperformed(actionevent e){ Toolkit.getDefaultToolkit().beep(); ); this.setdefaultcloseoperation( JFrame.EXIT_ON_CLOSE); this.setsize(200, 150); this.setvisible(true); Hier: Die Methode des Listener-Interfaces ist in der Klasse selbst implementiert. Hier: In anonymer innerer Klasse 16 W. Geiger, W. Süß, T. Schlachter, C. Schmitt

Verschiedene Arten des Event-Handlings (2) import java.awt.toolkit; import java.awt.event.*; import javax.swing.*; public class Beep3 extends JFrame { JButton button = new JButton("Click me!"); public Beep3() { this.add(this.button); this.button.addactionlistener( new ActionClass()); this.setdefaultcloseoperation( JFrame.EXIT_ON_CLOSE); this.setsize(200, 150); this.setvisible(true); class ActionClass implements ActionListener { public void actionperformed(actionevent e){ Toolkit.getDefaultToolkit().beep(); Hier: In separater Klasse import java.awt.toolkit; import java.awt.event.*; import javax.swing.*; public class Beep4 extends JFrame { ActionClass ac; JButton button = new JButton("Click me!"); public Beep4() { this.add(this.button); this.ac = new ActionClass(); this.button.addactionlistener(this.ac); this.setdefaultcloseoperation( JFrame.EXIT_ON_CLOSE); this.setsize(200, 150); this.setvisible(true); class ActionClass implements ActionListener { public void actionperformed(actionevent e) { Toolkit.getDefaultToolkit().beep(); Hier: Mit Referenzvariable zum Listener-Objekt der separ. Klasse, das dann mehrfach nutzbar ist 17 W. Geiger, W. Süß, T. Schlachter, C. Schmitt

Listener in Top-Level-Klasse vs. in anonymer Listener-Klasse Eigenschaften und Vor-/Nachteile Interface Listener in Top-Level- Klasse implementieren Unterscheidung nach auslösender Komponente erforderlich Alles in einer Methode Ein Listener lässt sich an mehrere Komponenten hängen Anonyme innere Listener-Klasse verwenden Keine Unterscheidung nach der auslösenden Komponente nötig Eine Methode je auslösender Komponente geht schneller bei kleinen GUIs mit wenigen Events wird bei größeren GUIs schnell unübersichtlich etwas mehr Aufwand bei kleinen GUIs übersichtlicher bei großen GUIs, da Events sich auf das Programm aufteilen lassen 18 W. Geiger, W. Süß, T. Schlachter, C. Schmitt

Doku und Tutorial Javadoc: http://docs.oracle.com/javase/7/docs/api/index.html?overview-summary.html Event-Tutorial: Lesson: Writing Event Listeners http://docs.oracle.com/javase/tutorial/uiswing/events/index.html 19 W. Geiger, W. Süß, T. Schlachter, C. Schmitt