Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Programmierpraktikum Java SS 2005 Mag.Thomas Hilpold.

Ähnliche Präsentationen


Präsentation zum Thema: "Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Programmierpraktikum Java SS 2005 Mag.Thomas Hilpold."—  Präsentation transkript:

1 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Programmierpraktikum Java SS 2005 Mag.Thomas Hilpold Institut für Wirtschaftsinformatik Software Engineering JKU Linz Termin 8/9 (Ereignisse, AWT)

2 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 2 Programmieren mit Ereignissen Ereignisse werden ausgelöst und an Interessenten weitergeleitet. Z.B. ActionEvent Mehrere Interessenten können sich für einen Ereignistyp bei einem Objekt das Ereignisse versendet anmelden z.B. Button Es gibt Objekte, die Ereignisse versenden und Objekte die Ereignisse empfangen. Ein wichtiges Beispiel zur ereignisorientierten Programmierung ist die Programmierung von grafischen Benutzerschnittstellen Üblicherweise bestimmt man als Programmierer nicht mehr den gesamten Kontrollfluß, sondern muß dynamisch auf verschiedene Ereignisse reagieren. Ereignisorientierte Programmierung Allgemeines

3 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 3 Ereignisorientierte Programmierung Grundidee (Beispiel) aButton aListener aSecondListener anActionEvent actionCommand=„readDate“ actionPerformed(anActionEvent) aThirdListener Ein Button-Objekt kann Action-Events erzeugen. Die Verteilung an Interessenten erfolgt durch Aufruf jeweils der gleichen Methode bei den Interessenten (Listeners) und Übergabe einer Referenz auf das Ereignisobjekt. Das Ereignisobjekt kann verschiedene Informationen enthalten.

4 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 4 Ereignisorientierte Programmierung Klassen und Schnittstellen (Beispiel) Button addActionListener(ActionListener l) removeActionListener(ActionListener l) SomeClassA SomeClassB ActionEvent String actionCommand; getActionCommand():String SomeClassC > ActionListener actionPerformed(ActionEvent e) In unserem Beispiel unterstützt ein Button die Registrierung von Interessenten für ActionEvents (Methoden add/remove...). Diese müssen das Interface ActionListener implementieren (weitere Vereinbarungen sind nicht nötig, Klasse unerheblich). Der Button ist dafür verantwortlich ActionEvent-Objekte zu erzeugen (Ereignis tritt ein) und diese an alle zuvor (mittels addActionListener(l)) registrierten Listener zu verteilen.

5 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 5 Ereignisorientierte Programmierung Ablauf (Beispiel) 1.Listeners werden am Button registriert (addXXXListener). 2.Ereignisse können nun eintreten. Der Button wird ein ActionEvent-Objekt erzeugen und ev. zusätzliche Informationen dem Ereignisobjekt übergeben (beides kann typischerweise in einer Methode fireXXXEvent erfolgen). 3.Bei jedem Listener wird actionPerformed(e) aufgerufen und dabei eine Referenz auf das Ereignisobjekt übergeben. 4.Jeder Listener kann nun für sich entscheiden, was er aufgrund des aufgetretenen Ereignisses unternimmt.

6 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 6 Ereignisorientierte Programmierung Zusammenfassung Ereignisquellen können Ereignisse erzeugen und an angemeldete Ereignisempfänger weiterleiten. Ereignisempfänger registrieren sich bei Ereignisquellen und empfangen in der Folge Ereignisse. Ereignisquellen unterstützen die Registrierung von Emfängern über zwei Methoden: addXXXListener(XXXListener l), removeXXXListener(XXXListener l) Ereignisempfänger implementieren die XXXListener-Schnittstelle. Diese enthält eine oder mehrere Methoden, die typischerweise als einzigen Parameter das Ereignisobjekt enthalten. Ereignisse entstehen in einer Ereignisquelle und können an einen oder mehrere registrierte Empfänger weitergeleitet werden. Objekte können auch gleichzeitig Quelle und Empfänger von Ereignissen sein.

7 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 7 Ereignisorientierte Programmierung Zusammenfassung (2) Ereignisse stellen ein bedeutendes, sehr allgemeines Konzept in modernen Softwaresystemen dar Ereignisorientierte Programmierung findet man in vielen APIs und läßt sich vielseitig verwenden grafische Benutzerschnittstellen (MouseEvent, WindowEvent) allg. Zustandsänderungen (SpaceEvent, ValueChangeEvent) Komponentenmodelle (Eigenschaften und Ereignisse) Es entstehen Systeme mit einer Vielzahl von Ereignisquellen, Ereignistypen und Ereignisempfängern. Der Kontrollfluß in solchen Systemen ergibt sich aus dem Entstehen von Ereignissen und deren Behandlung.

8 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 8 Grafische Benutzerschnittstellen Allgemeines engl. graphical user interface (GUI) eine Vielzahl heutiger Anwendungen verwendet grafische Benutzerschnittstellen zur Kommunikation mit dem Benutzer (im Gegensatz zu text-orientierten Benutzerschnittstellen) grafische Benutzerschnittstellen bestehen aus einer Menge an grafischen Benutzerschnittstellenkomponenten, die hierarchisch angeordnet sind. In Java sind grafische Benutzerschnittstellenkomponenten meist Ereignisquellen Die Ausführung von Programmen mit grafischer Benutzerschnittstelle ist meist durch das Entstehen und die Behandlung von Ereignissen maßgeblich gekennzeichnet Wesentliche Teile der Java-Klassenbibliothek dienen seit deren Bestehen der Erstellung grafischer Benutzerschnittstellen

9 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 9 Grafische Benutzerschnittstellen Unterstützung in der Klassenbibliothek engl. graphical user interface (GUI) Java kennt zwei wesentliche Bibliotheken zur Erstellung von grafischen Benutzerschnittstellen: AWT (Abstract window toolkit) (seit Version 1.0, Änderung 1.1) SWING (seit Version 1.2 Teil der Klassenbibliothek) Beide unterscheiden sich signifikant. AWT enthält Abhängigkeiten zur Plattform und somit Beschränkungen in Funktionalität und Flexibilität AWT-Anwendungen haben auf unterschiedlichen Plattformen genau deren Look-and-Feel AWT eignet sich gut zur Erstellung von einfachen Anwendungen und sog. Applets, also Anwendungen, die in Web-Browsern ausführbar sind.

10 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 10 Abstract Window Toolkit Übersicht Bibliothek von Benutzerschnittstellenkomponenten Button, List (!), Label, Menubar, ScrollPane, Canvas, Choice,... Spezielle Benutzerschnittstellenkomponenten, die Behälter für andere sind (Container) Layout-Manager-Klassen zum automatischen Anordnen von Komponenten Ereignisklassen MouseEvent, ActionEvent, ItemEvent,... Klassen zum Zeichnen von freier Grafik

11 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 11 Abstract Window Toolkit Grundlegende Architektur von GUIs List Button MenuBar hierarchische Anordnung es gibt Components und Container Components liegen in Containers Ein Container kann einen Layoutmanager zugeordnet haben, der die Anordnung (x,y,w,h) der Components bestimmt Bei Components und Containers kann man sich für verschiedene Ereignisse als Listener anmelden (zB. MouseListener, ActionListener,... ) Frame Panel (with Layoutmanager) Panel (with Layoutmanager)

12 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 12 Benutzerschnittstellenkomponenten Wesentliche Basisklassen In der Oberklasse Component sind gemeinsame Eigenschaften für alle GUI-Komponenten festgelegt. grafische Repräsentation Position (x,y), Breite und Höhe Kann verschiedene Events erzeugen (Mouse, Key,...) Die Klasse Container ist direkt von Component abgeleitet kann weitere Components enthalten ein LayoutManager kann gesetzt werden zusätzliches Event (ContainerEvent) Alle verfügbaren Komponenten befinden sich in java.awt

13 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 13 Benutzerschnittstellenkomponenten Hierarchie Oberklasse aller GUI- Komponenten

14 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 14 Benutzerschnittstellenkomponenten Übersicht (ohne Container) 8.TextArea 4.Choice7.TextField 5.List 6.ScrollBar 1.Label 2.Button 3.Checkbox

15 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 15 Benutzerschnittstellenkomponenten 1. java.awt.Label Einfache GUI-Komponente um einzeiligen Text darzustellen. Konstruktoren und Methoden Ereignisse Label() Label(String text) Label(String text, int alignment) getAlignment():int getText():String setAlignment(int a) setText(String text) Konstruktor mit Text Ausrichtung (RIGHT, CENTER, LEFT) Gibt Ausrichtung zurück Gibt Text zurück Setzt neue Ausrichtung Setzt neuen Text keine spezifischen Ereignisse außer diejenigen, die von Component geerbt wurden.

16 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 16 Benutzerschnittstellenkomponenten 2. java.awt.Button Eine Schaltfläche, die gedrückt werden kann. Konstruktoren und Methoden Ereignisse Button() Button(String label) setLabel(String) getLabel():String setActionCommand(String ac) getActionCommand():String Konstruktor mit Text Setzt den am Button erscheinenden Text. Gibt den am Button sichtbaren Text zurück. Setzt Text, der dann mit dem ActionEvent mitgeschickt wird addActionListener(ActionListener l) removeActionListener(ActionListener l) //+ inherited from Component Registriert einen ActionListener Entfernt einen registrierten Listener

17 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 17 Benutzerschnittstellenkomponenten 3. java.awt.Checkbox Checkbox zum anklicken. Checkboxes können Mitglied in einer CheckboxGroup sein und lassen sich dann nur exklusiv anklicken. in einer Checkboxgroup ist also maximal eine Checkbox angeklickt. Konstruktoren und Methoden Ereignisse Checkbox() Checkbox(String label) Checkbox(String label, boolean state) Checkbox(String label, boolean state, CheckboxGroup group) getLabel():String getCheckBoxGroup(): CheckboxGroup setState(boolean state) getState():boolean Konstruktor mit Text Setzt text und Zustand (checked ?) zusätzlich mit Angabe einer Group (exklusiv) setzt den Zustand (Darstellung ändert sich) gibt den gegenwärtigen Zustand zurück addItemListener(ItemListener l) removeItemListener(ItemListener l) //+ inherited from Component Registriert einen ItemListener Entfernt einen registrierten Listener ItemEvents werden ausgelöst, wenn sich der state verändert.

18 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 18 Benutzerschnittstellenkomponenten 3b. java.awt.CheckboxGroup CheckBoxGroup ist von Object abgeleitet, also keine klassische Benutzerschnittstellenkomponente. Sie ermöglichet aber in Zusammenhang mit der Klasse CheckBox exklusive Auswahl (Radiobuttons). Es kann jeweils nur eine Checkbox angewählt werden. Beispiel Methoden CheckBox a,b,c; CheckboxGroup cbg = new CheckBoxGroup(); a = new Checkbox("Checkbox A", cbg, false); b = new Checkbox("Checkbox B", cbg, false); c = new Checkbox("Checkbox C", cbg, true); // add them to a container getSelectedCheckBox(): CheckBox // returns the checkbox in the group, whose state is // true (may be null, if all are off) setSelectedCheckBox(CheckBox box) // turns the state of the given Box into true, all // others will be set to false.

19 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 19 Benutzerschnittstellenkomponenten 4. java.awt.Choice Konstruktoren und Methoden Ereignisse Choice() add(String item) addItem(String item) CheckboxGroup getItemCount():int getItem(int index):String getSelectedIndex():int getSelectedItem():String insert(String item, int index) select(int index) selectItem(String item) removeAll() remove(int index)... fügt Item hinzu s.o. Anzahl der Items Gibt das Item an der Stelle index zurück Gibt den Index des gerade ausgewählten Items zurück Gibt das ausgewählte Item zurück Fügt ein Item an eine best. Stelle ein Setzt die Auswahl s.o. Entfernt alle Items addItemListener(ItemListener l) removeItemListener(ItemListener l) //+ inherited from Component Registriert einen ItemListener Entfernt einen registrierten Listener ItemEvents werden ausgelöst, wenn sich die Auswahl verändert. Drop-Down Auswahlfeld (Pop-up Menu) zur Auswahl eines "Items". Items sind Strings.

20 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 20 Benutzerschnittstellenkomponenten 5. java.awt.List Liste zur Auswahl eines oder mehrerer Items. (Kann angegeben werden) Konstruktoren und Methoden Ereignisse List() List(int rows) List(int rows, boolean multipleMode) add(String item) remove(int pos) getItem(int i):String isMultipleMode():boolean getSelectedItem():String getSelectedItems():String[] Konstruktor mit Anzahl der sichtbaren (!) Items Ein- oder Mehrfachauswahl (->Tasten Strg, Shift) fügt Item hinzu entfernt eines. Mehrfachauswahl? Ausgewähltes bei Einfachauswahl...bei Mehrfachauswahl addItemListener(ItemListener l) removeItemListener(ItemListener l) addActionListener(ActionListener l) removeActionListener(ActionListener l) //+ inherited from Component Registriert einen ItemListener Entfernt einen registrierten Listener Registriert einen ActoinListener ItemEvents werden ausgelöst, wenn sich die Auswahl ändert. ActionEvents werden ausgelöst, wenn der Benutzer einen Doppelklick auf ein Item ausführt.

21 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 21 Benutzerschnittstellenkomponenten 6. java.awt.Scrollbar Kann zur Auswahl von Zahlenwerten verwendet werden. Horizontal und vertikal möglich. Konstruktoren und Methoden Ereignisse ScrollBar() ScrollBar(int orientation) setMinimum(int i) setMaximum(int i) setValue(int i) setBlockIncrement(int increment) setUnitIncrement(int increment)... //diverse getter Eine vertikale Scrollbar Vertikal oder horizontal (Konstanten !) Minimum (default = 0) Maximum (default = 100) Setzt den Wert. (Darstellung !) (def = 0) Setzt, wieviel sich der Wert verändern soll, wenn der Benutzer in die Fläche klickt oder Pg up/dn drückt. (10) Setzt, wieviel sich der Wert verändern soll, wenn der Benutzer Line up/dn betätigt oder auf die Pfeile klickt. ( default = 1) addAdjustmentListener(AdjustmentListener l) removeAdjustmentListener(AdjustmentListener l) //+ inherited from Component Registriert einen AdjustmentListener Entfernt einen registrierten Listener AdjustmentEvents werden ausgelöst, wenn sich der value verändert.

22 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 22 Benutzerschnittstellenkomponenten 7. TextComponent AdjustmentEvents werden ausgelöst, wenn sich der value verändert. java.awt.Component java.awt.TextComponent TextFieldTextArea hier sind gemeinsame Eigenschaften und Methoden, Ereignisse festgelegt

23 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 23 Benutzerschnittstellenkomponenten 7. java.awt.TextComponent TextComponent ist die Oberklasse von allen Komponenten die das Editieren und Auswählen von Text unterstützen. Sollte nicht instanziert werden. Methoden Ereignisse setText(String text) setEditable(boolean editable) setCaretPosition(int i) select(int start, int end) selectAll() getText() getSelectedText():String isEditable() //diverse weitere getter Setzt den Text Setzt, ob der Text vom Benutzer editiert werden kann Setzt die Postition des Cursors Markiert einen Teil des Textes als ausgewählten Text. Markiert den gesamten Text. gibt die momentane Auswahl zurück addTextListener(TextListener l) removeTextListener(TextListener l) //+ inherited from Component Registriert einen TextListener Entfernt einen registrierten Listener TextEvents werden ausgelöst, wenn sich der Text verändert.

24 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 24 Benutzerschnittstellenkomponenten 7a. java.awt.TextField Unterklasse von Textkomponent (Ist ein TextComponent). Unterstützt also das Editieren und die Auswahl von Text. Ein Textfield bearbeitet immer genau eine Zeile! Es wird meist zur Eingabe von Zahlen, Datum, einer Zeile verwendet. Konstruktoren und Methoden Ereignisse TextField() TextField(int columns) //geerbte von TextComponent setEchoChar(char echo) Anzahl der Spalten ->sind auch die wichtigsten Man kann ein Zeichen setzen, das anstelle der Eingabe des Benutzers angezeigt wird (Password). //+ geerbte von TextComponent (TextEvent) addActionListener(ActionListener l) removeActionListener(ActionListener l) Registriert einen TextListener Entfernt einen registrierten Listener ActionEvents werden ausgelöst, sobald der Benutzer die "Return"- Taste betätigt.

25 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 25 Benutzerschnittstellenkomponenten 7b. java.awt.TextArea Unterklasse von Textkomponent (Ist ein TextComponent). Unterstützt also das Editieren und die Auswahl von Text. Ein Textfield kann mehrere Zeilen anzeigen und deren Bearbeitung zulassen. Konstruktoren und Methoden Ereignisse TextArea() TextArea(int rows, columns) TextArea(int r, c, String text) TextArea(int r,c, String t, int Scrollbarvis) TextArea(String text) //+ geerbte von TextComponent append(String text) getScrollbarVisibility():int replaceRange(String str, int start, int end) insert(String str, int pos) setColumns(int col) setRows(int rows) Immer mit zwei Scrollbars Anzahl der Spalten Sichtbarkeit der Scrollbars läßt sich bestimmen Immer mit 2 Scrollbars. fügt Text am Ende hinzu Welche Scrollbars sind gerade sichtbar. (Konstanten) Ersetzt einen Bereich durch den angegebenen String. Fügt eine Zeichenkette ein. Setzt die Anzahl der Spalten Setzt die Anzahl der Zeilen //+ geerbte von TextComponent (TextEvent) keine weiteren

26 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 26 Benutzerschnittstellenkomponenten Übersicht (ohne Container) 8.TextArea 4.Choice7.TextField 5.List 6.ScrollBar 1.Label 2.Button 3.Checkbox

27 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 27 java.awt.Component Allgemeines Component ist die abstrakte Oberklasse aller Benutzerschnittstellenkomponenten inkl. der Behälter (Container) (Außnahme: Menüs). Ein Component hat eine grafische Repräsentation und kann mit dem Benutzer interagieren. Die Oberklasse von Component ist Object. wichtige Methoden setBounds(int x, y, w, h) setLocation(int x, int y) setSize(int w, int h) setForeground(Color fg) setBackground(Color bg) setFont(Font f) setEnabled(boolean enabled) setVisible(boolean) getParent(): Container ????????? Position und Größe der Komponente setzen (Benötigt z.b. LayoutManager) Komponente zu neuem Ort bewegen Neue Größe Vordergrundfarbe (zB für Text) Hintergrundfarbe Setzt eine Schriftart, die für Text verwendet werden soll Legt fest, ob die Komponente mit dem Benutzer intergieren soll. Soll die Komponente am Bildschirm sichtbar sein? Jede Komponente kann den Container in dem Sie sich befindet zurückgeben (oder null)

28 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 28 java.awt.Component Ereignisse, für man sich bei allen Components anmelden kann addComponentListener(ComponentListener l) addFocusListener(FocusListener l) addHierarchyListener(HierarchyListener l) addKeyLIstener(KeyListener l) addMouseListener(MouseListener l) addMouseMotionListener(MouseMotionListener) // + diverse remove-Methoden Component was hidden, moved, resized, shown Texteingabe geht an diese Komponente Die Hierarchy hat sich verändert (z.B. neue Komponente) Tastendruck wurde an die Komponente geschickt. Maus-klicks Bewegung der Maus (viele Events, mit Position x,y) Diese Art von Ereignissen benötigt man eher selten. Häufiger werden diejenigen Ereignisse benötigt, die spezifische Benutzerschnittstellenkomponenten erzeugen. (Zb. wird man bei einem Textfield nur selten jeden Tastendruck abarbeiten wollen, sondern darauf warten, bis der Benutzer "Return drückt" (ActionEvent)).

29 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 29 Benutzerschnittstellenkomponenten Rückblick (1) Oberklasse aller GUI- Komponenten

30 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 30 Benutzerschnittstellenkomponenten Grundlegende Architektur von GUIs List Button MenuBar hierarchische Anordnung es gibt Components und Container Components liegen in Containers Ein Container kann einen Layoutmanager zugeordnet haben, der die Anordnung (x,y,w,h) der Components bestimmt Bei Components und Containers kann man sich für verschiedene Ereignisse als Listener anmelden (zB. MouseListener, ActionListener,... ) Frame Panel (with Layoutmanager) Panel (with Layoutmanager)

31 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 31 Behälter für GUI-Komponenten Allgemeines Container benötigt man, um Benutzerschnittstellenkomponenten anzuordnen. Container sind selbst wieder Benutzerschnittstellenkomponenten und können daher wieder in anderen Containern enthalten sein (vgl. Datei/Verzeichnis). Benutzerschnittstellenkomponenten werden in solchen Containern angeordnet. Ihre Koordinaten beziehen sich jeweils auf den Container, in dem sie sich befinden. yB xB yC2 xC2 Container1 Container2

32 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 32 Behälter für GUI-Komponenten LayoutManager Jedem Container kann ein Layoutmanager zugeordnet werden. Dieser bestimmt dann Position und/oder Größe der im Container befindlichen Komponenten. Wenn sich die Größe des Containers ändert entscheidet dieser, ob und wie die Komponenten neu angeordnet werden. Benutzer ändert Größe. Ein LayoutManager könnte bestimmen, daß auch die Buttons größer werden müssen. Man kann (und es ist häufig auch zweckmäßig) auf Layout Manager verzichten und einfach feste Positionen (mit setBounds(x,y,w,h)) angeben. Diese würden bei einer Größenänderung des Containers allerdings nicht angepaßt.

33 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 33 Behälter für GUI-Komponenten Die gemeinsame Oberklasse java.awt.Container Container ist von Component abgeleitet. Ein Container hat ebenso Größe, Position und kann eine Vielzahl von Ereignissen erzeugen. Container enthalten Components, die wiederum Container sein können. So wird die die hierarchische Architektur von GUI-Anwendungen ermöglicht. Konstruktor und wichtige Methoden Container() add(Component c) remove(Component c) removeAll() getComponentCount():int setLayout(LayoutManager l) validate() validateTree() Wird hier nicht benötigt. Component hinzufügen Component entfernen Alle entfernen Anzahl der Components LayoutManager setzten (ev: null -> kein LM) Der Layoutmanager soll alle Components neu layoutieren wie oben, mit rekursivem Abstieg. Zusätzliche Ereignisse addContainerListener(ContainerListener l)Für Ereignisse beim Hinzufügen oder Entfernen von Components anmelden remove...

34 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 34 Behälter für GUI-Komponenten Hierarchie der Container-Klassen Container (Oberklasse, wird nur zu besonderen Zwecken direkt instanziert, definiert gemeinsame Funktionalität des Enthaltens weiterer Components) Panel (extends Container) (Einfacher Container, kein Anwendungsfenster, keine (!) über Container hinausgehende Funktionalität, wird zur Bildung der Hierarchie häufig verwendet) Window (...) (Basisfenster einer Anwendung ohne Titelleiste, ohne Rahmen, wie es z.B. bei Starten von JBuilder angezeigt wird; Windows enthalten keine Windows!) Frame (voll-funktionales Fenster einer Anwendung, besonders wichtig) Dialog (voll-funktionaler Dialog, meist abhängig von einem Fenster zB. Datei öffnen-Dialog)

35 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 35 Behälter für GUI-Komponenten java.awt.Window Definiert das grundlegende Verhalten von sog. Top-Level-Windows. Die jeweils den obersten Knoten einer Komponentenhierarchie bilden. Objekte der Klasse Window haben keinen Rahmen, keine Titelleiste und keine Menuleiste. (Solche Windows werden häufig beim Starten von Programmen angezeigt.) Konstruktor und wichtige Methoden Window(Windows parent) //Methoden von Container + show() isShowing() pack() dispose() hide() toBack() toFront() Wird hier nicht benötigt. Fenster sichtbar machen. (Erzeugte Fenster sind inital unsichbar) Prüft, ob das Fenster gerade sichtbar ist. Die Größe des Fensters wird so verändert, daß die enthaltene GUI- Hierarchie optimal reinpaßt. Fenster mit allen Ressourcen freigeben. Fenster unsichbar machen. Fenster in den Hintergrund legen. Fenster nach vorne. Ereignisse addWindowEventListener(WEL l) removeWindowsEventListener(l) Anmeldung für Ereignisse bei open, close, resize des Window

36 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 36 Behälter für GUI-Komponenten java.awt.Frame Ist ein Top-Level-Window mit Rahmen und Titel. Kann eine Menüleiste haben. Konstruktor und wichtige Methoden Frame() Frame(String title) //Methoden von Window + setResizeable(boolean res) setTitle(String title) setMenuBar(MenuBar mb) setIconImage(Image img) setState(int state) //diverse getter... mit Titel Setzt, ob der Benutzer die Größe des Frames ändern kann. Setzt den Titel. Setzt eine Menüleiste Setzt ein Bild für ikonifizierte Darstellung. Setzt, ob der Frame normal oder ikonifiziert dargestellt wird. (Konstanten Frame.ICONIFIED oder Frame.NORMAL) Keine zusätzlichen Ereignisse

37 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 37 Behälter für GUI-Komponenten java.awt.Dialog Ist ein Top-Level-Window mit Rahmen und Titel. Ikonifizieren und Wiederherstellen nicht möglich. Dialog kann modal sein (sperrt andere Windows der Anwendung). Ein Dialog wird häufig kurzfristig geöffnet, um Eingaben vom Benutzer einzulesen und anschließend wieder geschlossen. Konstruktor und wichtige Methoden Dialog(Frame owner, boolean modal) Dialog(Dialog ownder, boolean modal) //Methoden von Window + setTitle(String title) setResizable(boolean isRes) show() dispose() Zur Konstruktion wird ein Frame oder Dialog benötigt. Modal gibt an, ob man während der Dialog geöffnet ist, die Interaktion mit anderen Windows unterbinden will. Setzt den Titel. Setzt, ob der Benutzer die Größe des Frames ändern kann. Macht den Dialog sichtbar. Schließt den Dialog und gibt alle Ressourcen frei. Keine zusätzlichen Ereignisse

38 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 38 Benutzerschnittstellenkomponenten Grundlegende Architektur von GUIs List Button MenuBar Bisher: Benutzerschnittstellenkomponenten, Container Ein Container kann einen Layoutmanager zugeordnet haben, der die Anordnung (x,y,w,h) der Components bestimmt Bei Components und Containers kann man sich für verschiedene Ereignisse als Listener anmelden (zB. MouseListener, ActionListener,... ) Frame Panel (with Layoutmanager) Panel (with Layoutmanager)

39 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 39 Layout Management Grundidee Die Anordnung von Components in einem Container soll durch sog. LayoutManager-Objekte automatisch erfolgen. Diese reagieren auch auf Größenänderungen des Containers. Für jeden Container wird ein eigener LayoutManager gesetzt. Alternative: Manuelle Angabe von Position und Größe jeder Komponente relativ zum Container. (auch genannt: null-Layout) Grundprinzip aContainer.setLayout(new XXXLayout()); aContainer.add(component1); aContainer.add(component2); aContainer.add(otherContainer); //Layoutmanager bestimmt Positionen der Components im Container Alle Container haben auch ein Default-Layout.

40 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 40 Layout Management Klassen FlowLayout Ordnet die Komponenten wie Wörter auf einer Seite an. (Zentriert, rechts- oder linksbündig) BorderLayout Unterstützt genau 5 Komponenten. Eine an jeder Seite und eine im Zentrum GridLayout Teilt den Container in Zeilen und Spalten. Alle Zellen sind gleich groß. GridBagLayout Sehr flexibel und kompliziert. Für jede Komponente können Einschränkungen definiert werden. CardLayout Zeigt jeweils nur eine Komponente, die den Container ausfüllt. Die anderen liegen quasi unsichtbar dahinter und man blättert bei Bedarf weiter (zB. Tabs)

41 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 41 Layout Management FlowLayout f = new FlowLayout(); f.setAlignment(FlowLayout.CENTER, 20, 20) // Zentriert; horizontaler // und vertikaler Abstand = 20 container.setLayout(f); container.add(component1); container.add(component2); container.add(containerX);

42 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 42 Layout Management BorderLayout container.setLayout(new BorderLayout()); container.add(component1, BorderLayout.NORTH); container.add(component2, BorderLayout.CENTER); container.add(containerX, BorderLayout.WEST);...

43 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 43 Layout Management GridLayout g = new GridLayout(rows, cols);//Zeilen und Spalten container.setLayout(g); container.add(component1);// Auffüllen von links oben zeilenweise // nach rechts unten container.add(component2); container.add(containerX);

44 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 44 Layout Management Weitere GridbagLayout CardLayout

45 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 45 Layout Management null-Layout Beim Arbeiten ohne LayoutManager muß man selbst für die Anordnung der Komponenten sorgen. Bei Größenänderungen erfolgt keine automatische Anpassung, wie bei Verwendung von Layout-Managern. Dennoch wird dies häufig verwendet. container.setLayout(null); // explizit nötig, um default-layout zu umgehen component1.setBounds(10,10,100,100); // x, y, Breite, Höhe component2.setBounds(10,150,100,100); // x, y, Breite, Höhe container.add(component1); container.add(component2); Anwendung

46 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 46 Zusammenfassung Bisher: Components 8 AWT-Componenten Containers Panel, Frame, Dialog LayoutManagers für Container FlowLayout, BorderLayout, GridLayout (Grundlagen: Ereignisse) Damit haben wir die grundsätzlichen Voraussetzungen zum Aufbau von Benutzerschnittstellen.

47 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 47 Beispielanwendungen Grundsätzliche Vorgangsweise: 1.Komponenten erzeugen und Eigenschaften setzen 2.Komponenten zu Container hinzufügen 3.Anordnung der Komponenten im Container (LayoutManagement) 4.Behandlung der Ereignisse der Komponenten

48 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 48 Beispiel 1 - FlowLayout Ohne Ereignisse class MyFirstGUIApp extends Frame { FlowLayout myLayout = new FlowLayout(); Label label1 = new Label ("ein erstes Label"); Label label2 = new Label ("ein zweites Label"); Button button1 = new Button ("ein erster Button"); public MyFirstGUIApp() { setTitle("Eine erste GUI-Anwendung"); initGUI(); } private void initGUI() { myLayout.setAlignment(FlowLayout.CENTER); this.setLayout(myLayout); this.add(label1); this.add(label2); this.add(button1); } public static void main() { MyFirstGUIApp app = new MyFirstGUIApp(); app.show() } }

49 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 49 Beispiel 2 - GridLayout Ohne Ereignisse public class MyGUIApp2 extends Frame { //create layout with hgap and vgap GridLayout myLayout = new GridLayout(5, 5, 2, 2); Label[] labels; public MyGUIApp2() { setTitle("Eine zweite GUI-Anwendung"); labels = new Label[25]; for (int i = 1; i <= 25; i++) { labels[i-1] = new Label("Label" + i); labels[i-1].setBackground(new Color(255,200, i * 10)); } initGUI(); } private void initGUI() { this.setLayout(myLayout); for (int i = 0; i < labels.length; i++) { this.add(labels[i]); } public static void main(String[] args) { MyGUIApp2 myGUIApp = new MyGUIApp2(); myGUIApp.pack(); // size of frame will be usefully set myGUIApp.show(); // the frame will show up }

50 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 50 Beispiel 3 - NullLayout Ohne Ereignisse public class MyGUIApp3 extends Frame { Label forenameLabel = new Label("Vorname:", Label.RIGHT); Label surnameLabel = new Label("Nachname:", Label.RIGHT); TextField forenameField = new TextField(30); TextField surnameField = new TextField(50); public MyGUIApp3() { setTitle("Eine dritte GUI-Anwendung"); initGUI(); } private void initGUI() { this.setLayout(null); this.setSize(300,300); forenameLabel.setBounds(10,50,100,25); surnameLabel.setBounds(0,100,100,25); forenameField.setBounds(120, 50, 100, 25); surnameField.setBounds(110, 100, 200, 25); surnameField.setEnabled(false); this.add(surnameField); this.add(forenameLabel); this.add(forenameField); this.add(surnameLabel); } public static void main(String[] args) { MyGUIApp3 myGUIApp = new MyGUIApp3(); //myGUIApp.pack(); // size of frame will be usefully set myGUIApp.show(); // the frame will show up }

51 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 51 Beispiele Zusammenfassung: Wir leiten von Frame ab. import java.awt.* Beim Starten der Anwendung werden Initialisierungen durchgeführt, die Komponenten erzeugt, Eigenschaften der Komponenten gesetzt. Dem Container wird ein LayoutManager-Objekt zugeordnet. Die Components werden dem Container hinzugefügt. Abschließend wird frame.show() aufgerufen. Genau dann erscheint die Anwendung. Derjenige Thread, der die Initialisierungen durchgeführt hat ist beendet (Main Thread). Dennoch läuft die Anwendung (in einem anderen Thread (AWT-Event-Thread) weiter. Ereignisse treten innerhalb von AWT auch jetzt auf: resize, KeyEvents,... Unsere Klasse ist jedoch bei keiner Component als Listener für Ereignisse registriert.

52 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 52 AWT-Ereignisse Allgemeines: Benutzerschnittstellen können mehr oder weniger spezifische Ereignisse erzeugen Einerseits kann man sich bei jeder Komponente für eine Reihe von "Low- Level-Ereignissen anmelden (MouseEvent, KeyEvent,...), andererseits ist es eine Stärke der Komponenten aussagekräftigere Events zu erzeugen ( ActionEvent, ItemEvent) Wir werden also vorwiegend spezifische Ereignisse der Komponenten nutzen. Für welche Ereignisse man sich bei welcher Komponente registrieren kann, wurde bereits bei den einzelnen Komponenten behandelt (Button,...)

53 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 53 AWT-Ereignisse Ereignishierarchie: AWTEvent ActionEvent AdjustmentEvent ComponentEvent ContainerEvent FocusEvent InputEvent KeyEvent MouseEvent PaintEvent WindowEvent ItemEvent TextEvent "Low-Level-Events"

54 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 54 AWT-Ereignisse Nutzung von Ereignissen (Variante 1: Listener) 1.In eigenen Klassen implementiert man die entsprechenden XXX- Listener Interfaces (extends Frame implements ActionListener) 2.Anmeldung bei Komponenten für interessierende Events (list.addItemListener(this)) 3.Ausprogrammieren der Ereignisbehandlung in den Methoden des Listener-Interface. Dabei nutzt man nach Möglichkeit die Informationen, die das jeweilige Ereignis bietet. 4.Nach dem Starten des Programms werden die entprechenden Listener- Methoden mit Ereignissen als Parameter aufgerufen. Wichtig: Jedes Event-Objekt kann mit getSource():Object gefragt werden, in welcher Component es ursprünglich entstanden ist.

55 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 55 Beispiel E1 – Button & Label ActionEvent public class MyGUIAppE1 extends Frame implements ActionListener { Label valueLabel = new Label("Nachname:", Label.RIGHT); Button increaseButton = new Button("Wert erhöhen"); int value = 0; public MyGUIAppE1() { setTitle("Eine erste GUI-Anwendung mit Ereignissen"); initGUI(); } private void initGUI() { this.setLayout(new FlowLayout(FlowLayout.CENTER)); this.add(valueLabel); this.add(increaseButton); //add listeners increaseButton.addActionListener(this); } //interface ActionListener public void actionPerformed(ActionEvent e) { if (e.getSource()==increaseButton) { value++; valueLabel.setText("Der Wert beträgt jetzt: " + value); } else { System.err.println("Ereignis von unbekanntem Objekt empfangen"; } public static void main(String[] args) { MyGUIAppE1 myGUIApp = new MyGUIAppE1(); myGUIApp.pack(); // size of frame will be usefully set myGUIApp.show(); // the frame will show up System.err.println("show doesn´t block."); }

56 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 56 Beispiel E2 – Low-Level-Event MouseMotion public class MyGUIAppE2 extends Frame implements MouseMotionListener { Label positionLabel = new Label("Mausposition:", Label.RIGHT); public MyGUIAppE2() { setTitle("Eine zweite GUI-Anwendung mit Ereignissen"); initGUI(); } private void initGUI() { this.setLayout(new FlowLayout(FlowLayout.CENTER)); setSize(300,300); this.add(positionLabel); //add listeners this.addMouseMotionListener(this); } // interface MouseMotionListener public void mouseDragged(MouseEvent e){}; // not needed public void mouseMoved(MouseEvent e) { int x = e.getX(); int y = e.getY(); positionLabel.setText("Mausposition:" + x + ":" + y); } public static void main(String[] args) { MyGUIAppE2 myGUIApp = new MyGUIAppE2(); myGUIApp.show(); // the frame will show up System.err.println("show doesn´t block."); }

57 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 57 Beispiel E3 – Low-Level-Event WindowEvent import java.awt.*; import java.awt.event.*; public class MyGUIAppE3 extends Frame implements WindowListener { public MyGUIAppE3() { setTitle("Eine dritte GUI-Anwendung mit Ereignissen"); initGUI(); } private void initGUI() { this.setLayout(new FlowLayout(FlowLayout.CENTER)); setSize(300,300); //add listeners this.addWindowListener(this); } //interface WindowListener public void windowOpened(WindowEvent e){}; public void windowClosing(WindowEvent e){ this.dispose(); System.exit(0); }; public void windowClosed(WindowEvent e){}; public void windowIconified(WindowEvent e){}; public void windowDeiconified(WindowEvent e){}; public void windowActivated(WindowEvent e){}; public void windowDeactivated(WindowEvent e){}; public static void main(String[] args) { MyGUIAppE3 myGUIApp = new MyGUIAppE3(); myGUIApp.show(); // the frame will show up System.err.println("show doesn´t block."); }

58 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 58 AWT-Ereignisse Nutzung von Ereignissen (Variante 2: Adapters) Im vorigen Beispiel erkennt man, daß rel. viele Methoden implementiert werden müsse, obwohl man nur eine benötigt. Generell ist es häufig wünschenswert, daß ein eigenes Objekt die Ereignisbehandlung übernimmt Genau dazu dienen Adaptoren Man findet eine Reihe von Adapter-Klassen in java.awt.event; (zB. WindowAdapter) Dabei emfängt das Apapter-Objekt das Event. Adaptoren werden meist als Anonymous-class realisiert und können daher die Methoden der umgebenden Klasse aufrufen.

59 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 59 Beispiel E4 – Adaptoren WindowAdaptor import java.awt.*; import java.awt.event.*; public class MyGUIAppE4 extends Frame { WindowAdapter windowAdapter = new WindowAdapter() { public void windowClosing(WindowEvent e) { dispose(); System.exit(0); } }; public MyGUIAppE4() { setTitle("Eine vierte GUI-Anwendung mit Ereignissen"); initGUI(); } private void initGUI() { this.setLayout(new FlowLayout(FlowLayout.CENTER)); setSize(300,300); //add listeners this.addWindowListener(windowAdapter); } public static void main(String[] args) { MyGUIAppE4 myGUIApp = new MyGUIAppE4(); myGUIApp.show(); // the frame will show up System.err.println("show doesn´t block."); }


Herunterladen ppt "Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Programmierpraktikum Java SS 2005 Mag.Thomas Hilpold."

Ähnliche Präsentationen


Google-Anzeigen