Author
others
View
0
Download
0
Embed Size (px)
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 1����������������������������
��������������������������� Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 1
Graphische Oberflächen – Teil 2
AWT und Swing
Grundlegender Aufbau von GUIs
Graphikausgabe
Layoutmanagement
Ereignismodell
Menus und Actions
GUI Elemente
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 2����������������������������
���������������������������
Inhalt
� AWT und Swing
• Unterschied
• Einbettung von Swing in AWT
� Grundlegender Aufbau von Swing GUIs
• Frames, Windows, Dialogs
• Panels
� Graphikausgabe
• Positionierung
• paintComponent und AWT-Thread
• Graphics und Ausgabeoperationen
� Aufbau und Positionierung
• Component-Hierarchy
• LayoutManagement
• Spezielle Anordnungen: JTabbedPane, JSplitPane, JScrollPane, JInternalFrame, …
� Ereignismodell
• Grundlegendes
• semantische und systemnahe Ereignisse
• Patterns für die Ereignisbehandlung
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 3����������������������������
���������������������������
Inhalt (Fortsetzung)
� Menus und Actions
� GUI Elemente
• MVC-Paradigma
- Abstrakte Modelle
- Ereignisse
• Überblick über GUI Elemente
- JLabel
- JButton
- JSpinner
- JTextField
- JFormattedTextField
- …
� Dialoge (Teil 2)
• Modale und Nicht-modale Dialoge
• Spezielle Dialoge: JFileDialog, JOptionsPane, …
� Spezielle GUI-Elemente (Teil 2)
• JList
• JTable
• JTree
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 4����������������������������
���������������������������
Graphische Oberflächen
AWT und Swing
Grundlegender Aufbau von Swing GUIs
Graphikausgabe
Layoutmanagement
Ereignismodell
Menus und Actions
GUI Elemente
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 5����������������������������
���������������������������
Ereignisse
� Komponenten lösen Ereignisse aus
• z.B. Klick auf Button, Auswahl eines Listenelements, Eingabe von Text
� Ereignisbehandler reagieren auf Ereignis
• Implementation der entsprechenden Schnittstelle
• Registration bei Komponente
� Ereignisobjekt liefert Zusatzinformationen
• z.B. Quelle, Modifikationstasten, …
������������������������ �������������������� �
�������������������������� ��������
����������������� ���������������������������� ������
� ������������������������ �������������������������������� ������������ ������������������������ ����������� ����������������� ������������������������ ���
������������������������� �������������������� ��������� ������������������������ � !���� �"���##������������������������ #�$�����������"���#�����"���#���
�
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 6����������������������������
���������������������������
Hierarchie der Ereignisklassen
� Low-Level-Ereignisse: elementaren Nachrichten
� semantische Ereignisse: höherwertige Ereignisse
Low-Level-Ereignisse
semantische Ereignisse
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 7����������������������������
���������������������������
Hierarchie der EventListener-Interfaces
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 8����������������������������
���������������������������
Adapterklassen
� Implementieren Interface mit leeren Methoden
� Bequeme Art, nur bestimmte Ereignisse zu behandeln
WindowAdapter
ContainerAdapter
ContainerAdapter
KeyAdapter
MouseAdapter
FocusAdapter
MouseMotionAdapter
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 9����������������������������
���������������������������
Maus und Tastatur
� Ereignisse von Maus und Tastatur
• z.B. Reaktion auf Mausbewegung oder Tastatureingabe
• Tastenereignisse empfängt nur Komponente mit Fokus
������������������������ �������������������������������� $����������� ����������������� ���������%���$�������� ������������������� ������������$�������� ������������������� �����������$�������� ������������������� �������������$�������� ������������������� �����&��������$�������� ���
�
������������������������ �������������������������������� $����$����������� ����������������� �����'��##���$�������� ������������������� �����$�����$�������� ���
�
������������������������ �������������������������������� (�)������� ����������������� %�)��������(�)���� ������������������� %�)&��������(�)���� ������������������� %�)!)����(�)���� ���
�
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 10����������������������������
���������������������������
Focus-Ereignisse
ComponentMögliche Ereignisquellen
addFocusListenerRegistrierungsmethode
FocusListenerListener-Interface
FocusEventEreignisklasse
Klasse, Interface oder Methode Eigenschaft
Eine Komponente verliert den Focus. focusLost
Eine Komponente erhält den Focus. focusGained
Bedeutung Ereignismethode
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 11����������������������������
���������������������������
Key-Ereignisse
ComponentMögliche Ereignisquellen
addKeyListenerRegistrierungsmethode
KeyListenerListener-Interface
KeyEventEreignisklasse
Klasse, Interface oder Methode Eigenschaft
Eine Taste wurde gedrückt und wieder losgelassen. keyTyped
Eine Taste wurde losgelassen. keyReleased
Eine Taste wurde gedrückt. keyPressed
Bedeutung Ereignismethode
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 12����������������������������
���������������������������
Component-Ereignisse
ComponentMögliche Ereignisquellen
addComponentListenerRegistrierungsmethode
ComponentListenerListener-Interface
ComponentEventEreignisklasse
Klasse, Interface oder Methode Eigenschaft
Eine Komponente wurde sichtbar. componentShown
Die Größe einer Komponente hat sich geändert. componentResized
Eine Komponente wurde verschoben. componentMoved
Eine Komponente wurde unsichtbar. componentHidden
Bedeutung Ereignismethode
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 13����������������������������
���������������������������
Container-Ereignisse
ContainerMögliche Ereignisquellen
addContainerListenerRegistrierungsmethode
ContainerListenerListener-Interface
ContainerEventEreignisklasse
Klasse, Interface oder Methode Eigenschaft
Eine Komponente wurde entfernt. componentRemoved
Eine Komponente wurde hinzugefügt. componentAdded
Bedeutung Ereignismethode
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 14����������������������������
���������������������������
Window-Ereignisse
Dialog, FrameMögliche Ereignisquellen
addWindowListenerRegistrierungsmethode
WindowListenerListener-Interface
WindowEventEreignisklasse
Klasse, Interface oder Methode Eigenschaft
Das Fenster wurde geöffnet. windowOpened
Das Fenster wurde auf Symbolgröße verkleinert. windowIconified
Das Fenster wurde wiederhergestellt. windowDeiconified
Das Fenster wurde deaktiviert. windowDeactivated
Das Fenster wird geschlossen. windowClosing
Das Fenster wurde geschlossen. windowClosed
Das Fenster wurde aktiviert. windowActivated
Bedeutung Ereignismethode
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 15����������������������������
���������������������������
Action-Ereignisse
Button, List, MenuItem, TextFieldMögliche Ereignisquellen
addActionListenerRegistrierungsmethode
ActionListenerListener-Interface
ActionEventEreignisklasse
Klasse, Interface oder Methode Eigenschaft
Eine Aktion wurde ausgelöst. actionPerformed
Bedeutung Ereignismethode
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 16����������������������������
���������������������������
Adjustment-Ereignisse
ScrollbarMögliche Ereignisquellen
addAdjustmentListenerRegistrierungsmethode
AdjustmentListenerListener-Interface
AdjustmentEventEreignisklasse
Klasse, Interface oder Methode Eigenschaft
Der Wert wurde verändert. adjustmentValueChanged
Bedeutung Ereignismethode
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 17����������������������������
���������������������������
Item-Ereignisse
Checkbox, Choice, List, CheckboxMenuItemMögliche Ereignisquellen
addItemListenerRegistrierungsmethode
ItemListenerListener-Interface
ItemEventEreignisklasse
Klasse, Interface oder Methode Eigenschaft
Der Zustand hat sich verändert. itemStateChanged
Bedeutung Ereignismethode
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 18����������������������������
���������������������������
Text-Ereignisse
TextField, TextAreaMögliche Ereignisquellen
addTextListenerRegistrierungsmethode
TextListenerListener-Interface
TextEventEreignisklasse
Klasse, Interface oder Methode Eigenschaft
Der Text wurde verändert. textValueChanged
Bedeutung Ereignismethode
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 19����������������������������
���������������������������
Entwurfsmuster für Handler-Code
� Ein wesentliches Entwurfskriterium ist, wie die Einbindung von Handler in die Applikation erfolgt
� Dazu gibt es unterschiedliche Ansätze, die wir in Form von Entwurfsmuster besprechen wollen:
• Variante 1: Implementierung eines EventListener-Interfaces
• Variante 2: Lokale oder anonyme Klassen
• Variante 3: Anonyme Klasse plus Handlermethode (siehe JavaBeans-Beispielcode)
• Variante 4: Trennung von GUI- und Anwendungscode
• Variante 5: wie Variante 4 plus Datenmodell mit Change-Events
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 20����������������������������
���������������������������
Grundlegende Überlegungen
� Ereignisse sollen etwas bewirken
• Ausführung von Code der Applikation
• Änderungen in den GUI-Elementen
� Gestaltung von Handler-Code ist durch zwei Herausforderungen getrieben
• Zugriff auf Applikation und/oder GUI ermöglichen
• gewisse Übersichtlichkeit und geeignete Strukturierung erreichen
GUI
Applikation
Handler
auslösen
einwirken
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 21����������������������������
���������������������������
Grundlegende Architektur
� In einer interaktiven Architektur braucht man einen Container, der die GUI-Elemente aufnimmt und anordnet
� Dies ist oft das Top-Level-Fenster, d.h. eine applikationsspezifische Ableitung von *+���� oder *'����#
� Diese Klasse
• kennt den Aufbau des GUI
• hat Verbindung zum Datenmodell/Applikationslogik
� Ist ������������ zu implementieren wird dies normalerweise in einer Ableitung von *����� implementiert
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 22����������������������������
���������������������������
Beispiel „ Punkte bei Mouse-Clicks“
� Applikation, in der jeder Mouse-Click als ein Punkt ausgegeben wird
� ����+����
• definiert Hauptfenster
• hält eine Liste von Points (= Applikationsdaten)
• implementiert ����
� ���������
• bekommt auch Verweis auf Liste von Points
• definiert ������������-Methode in der die Liste von Points gezeichnet werden
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 23����������������������������
���������������������������
Beispiel „ Punkte bei Mouse-Clicks“ : ����+��������+��������+��������+����
������������������������ �������������������� ����+���������������������������� *+�����
������������������������ ���
������
������������������������ ����+��������
�������
,��,��,��,��������-������
��!����.�����.��
,��,��,��,�����������������/��/��/��/ ����������,��,��,��,�����������
���%���
�
���
������������������������ ���������������� ���������������� �����"���#��#�01��
���
�����-��/��/��/��/ ����)������
������������ ��������� �-2��3-24��55�������������/��/��/��/ ������6247�624���
����+���������-��/��/��/��/ ����+������������
�������,�/���
�
�
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 24����������������������������
���������������������������
Beispiel „ Punkte bei Mouse-Clicks“ : ������������������������������������
������������������������ �������������������� ��������������������������������� *������
���
������
������������������������ �������������
�������
,��,��,��,��������-������
�
���������������������������� ���������������� �������������8���,���#��
���9����������9�����-���������9��������
/,���/,���/,���/,��� ������9������,��:������
����
�-�����������9������������
#����/;�������7��)7272��
�
�
���
�
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 25����������������������������
���������������������������
� GUI-Komponente implementiert Listener und meldet sich bei Komponente an
� Vorteile:
• einfach
� Nachteil:
• wenn viele unterschiedliche Listener implementiert werden müssen, unhandlich
Variante 1: Implementierung EventListener-Interfaces
������������������������ �������������������� ����+���������������������������� *+���������������������������������������� $������������
������������������������ ����+��������
����������#����������������$������������,��,��,��,����
�
������������������������ ���������������� ���������%���$��������
���������������/��/��/��/ �������#�
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 26����������������������������
���������������������������
Variante 2: Anonyme Klassen
� Es werden anonyme innere Klassen erzeugt, die Listener implementieren (oder Adapter erweitern)
� Diese greifen als innere Klassen auf die Objektvariablen zu
� Vorteile:
• erlaubt die Implementierung von beliebigen Listenern
� Nachteil:
• kann auch unübersichtlich werden, weil alles in eine Klasse gepackt ist
������������������������ �������������������� ����+����>������������������������ *+����������������������������� ����+����>����
����
���#����������������$��������������/��/��/��/ $�������������
������������������������ ���������������� ���������%���$��������
���������������/��/��/��/ �������#�
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 27����������������������������
���������������������������
Variante 3: Anonyme Klasse plus Handlermethode
� Wie bei Variante 2 anonyme innere Klassen
� Diese rufen aber Handler-Methoden der umgebenden Klasse auf
� entspricht Verfahren, wie viele GUI-Editoren Code erzeugen
� Vorteile:
• etwas übersichtlicher
#����������������$��������������/��/��/��/ $������������������������������������� ���������������� ���������%���$��������
���
���������%?����������
�
����
������������������������ ���������������� ���������%?�������$��������
���������������/��/��/��/ �������#�
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 28����������������������������
���������������������������
Variante 4: Trennung von GUI- und Anwendungscode
� Eigene Klassen, die die Listener implementieren
� Vorteile:
• Trennung von GUI-Aufbau und Ereignsbehandlung
� Nachteile:
• In dieser Version keine strikte Trennung, weil Aufruf von ������ notwendig
������������������������ �������������������� $��������%?������������������������������������������ $������������������������������������ ���
������������������������������ $��������%?����������
�������
,��,��,��,��������-�������
������������������������ ���������������� ���������%���$��������
���������������/��/��/��/ �������#�
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 29����������������������������
���������������������������
Variante 5: Variante 4 + Datenmodell mit Change-Events
� Eigenes Datenobjekt �������, welche die Änderungen signalisiert
� ���������@ meldet sich als Listener an und ruft bei Änderungen �������� auf
������������������������ �������������������� $��������%?������������������������������������������ $���������������
������������������������ ���������������� ���������%���$��������
���
������������/��/��/��/ �������#�
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 30����������������������������
���������������������������
Variante 5: Variante 3 + Datenmodell mit Change-Events (Forts.)
� Vorteil:
• Klare Trennung GUI – Applikation
������������������������ �������������������� �������
����
�����-��/��/��/��/ ����)������������)�,��#�"�����
��,"��
-��/��/��/��/ ������)�,��#�"������,��,��,��,����
������������������������ ���������������� ��������
������������������,"�������������)�,��#��.�����.7����������������7�������
�
������������������������ ���9��������9���������������������������� ���������9��������
�
������������������������ ���������������� ���������)�,��#���������������)�,��#�������������,"������������)�,��#������������
�
������������������������ ���������������� ������������)�,��#���������������)�,��#�������������,"���������������)�,��#������������
��
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 31����������������������������
���������������������������
Graphische Oberflächen
AWT und Swing
Grundlegender Aufbau von Swing GUIs
Graphikausgabe
Layoutmanagement
Ereignismodell
Menus und Actions
GUI Elemente
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 32����������������������������
���������������������������
Menüs mit Swing
JMenuBarJMenu
JMenuItem
JRadioButtonMenuItem
JCheckBoxMenuItem JMenu
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 33����������������������������
���������������������������
Menüs und Untermenüs
� Menüleiste
• Instanz von JMenuBar
• Setzen mittels ��*$����� des *+����
� Menü
• Instanz von JMenu (erweitert JMenuItem)
• Hinzufügen zu Menüleiste oder Menü mit Methode ���
• Einfügen einer Trennlinie mit ���"�������
� Menüeintrag
• Instanz von JMenuItem
• Hinzufügen zu Menü mittels ���
• Kann Symbol und Tastenkürzel besitzen
• Verfügbare Varianten:
A *�,��%��$���9��
A *&�����
��$���9��
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 34����������������������������
���������������������������
Eigenschaften eines Menüeintrages
� Mnemonik
• Unterstrichener Buchstabe für Tastaturnavigation im Menü
• Setzen mit ��$�������
• Konstanten von (�)���� für Tasten verwenden
� Tastenkombination
• Erscheint rechts neben Menütext
B (�)"��%��#�(�)"��%����
%�)����7��
����������
• Modifizierer: (�)�������!C$�"(7(�)������!&�C$�"(7(�)�����"?9+!C$�"(
• Setzen mittels ������������
� Symbol
• Laden von Datei mittels 9��#�9���-Konstruktor
• Setzen mit ��9���
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 35����������������������������
���������������������������
Beispiel: Menüs
DD����������
�������������-��/*$����������*$��������������
DD�������������-��/*$����.�$���.���������$��������(�)�����E(C��������������������
DD������������9��#�9�������-��/���#�9����.���#��D�������#��.������9��-��/*$���9���.�,��
�������.7����������9�����$��������(�)�����E(C������9����������������(�)"��%��#�(�)"��%��
(�)�����E(C7(�)������!&�C$�"(�������9�������������������,�����������������9����
DD�������������������"����������
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 36����������������������������
���������������������������
Actions
� �����
• Von ������������ abgeleitet
A ������������������������
��
• Property: enabled
- Abfragen und setzen ob diese Action aktiv sein soll
- Interessierte werden über ein ������)�,��#����� benachrichtigt
• Mittels getValue(String key) und putValue(String key, Object value) können Eigenschaften der Aktion verwaltet werden.
- NAME: Name der Aktion
- MNEMONIC_KEY: Setzen der Mnemonik
- SHORT_DESCRIPTION: Benutzt für Tooltip etc.
- LONG_DESCRIPTION: Zum Beispiel für kontextsensitive Hilfe
- ACCELERATOR_KEY: Tastenkombination
- SMALL_ICON: Ablegen eines ImageIcons.
- ...
� Hilfsklasse um nicht alles implementieren zu müssen: AbstractAction
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 37����������������������������
���������������������������
Beispiel: Actions 1/3
������������������������ �������������������� ?��������������������������������������������� ���������
������������������������ ?����������8����� #�������������-��/��/��/��/ ?��,$������������-������������������,�������� -��/��/��/��/ ���%��������
,��,��,��,���#����� -#������
�
������������������������ ;�F��
#�E�����"���#%�)���������������������� �������#��%�)���
������������������������ ���������������� ��E�����"���#%7;�F��
�������������%7����
������������������������ ���������������� �������������������������������������� ����������� ��G-������������������������������������� ���E��-���������������-������������)�,��#��������/��/��/��/ ����������E���7
��/��/��/��/ ������������������
�
���
��������������8������������)?�������
�
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 38����������������������������
���������������������������
Beispiel: Actions 2/3
������������������������ �������������������� ?��������������������������������������������� ������
������������������������ ���������������������������� �������������������������������� ���������
������������������������ ���������������� ���������)�,��#���������������)�,��#����������������,����������������
�
������������������������ ���������������� ������������)�,��#���������������)�,��#�����������
�����,��������������������
������������������������ ���������������� ������������������������
����������� �#�����G-������������������#��������)?��������
�
������������������������ ���������������� ����������)�,��#������;�F��
���E��7;�F��
��/E����
����
�
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 39����������������������������
���������������������������
Beispiel: Actions 3/3
������������������������ �������������������� �����'��������������������������� *+���������������������������������������� 8����� ���������������������������� ���������������� ������DD����������,��
-��/��/��/��/ ?����������,��,��,��,����,�����E�����������:�$�7.?����.��,�����E�����������$:�$;:9�C(�=7
��/��/��/��/ 9��#���(�)�����E(C?���,�����E�����������������&�!;&C(�=7
(�)"��%��#�(�)"��%��(�)�����E(C?7
(�)������!&�C$�"(���
,�����E�����������"$���C9�;:7��/��/��/��/ 9��#�9����."�����#��.���
,�����E�����������"?;&!C'�"�&9�!9;:7.�����?�����.�����*$���9��,����$9-��/��/��/��/ *$���9���.?����.����)$��������,����$9��,����$9���������,�������
�
������������������������ ���������������� ��)?����������
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 40����������������������������
���������������������������
Zusammenfassung
� Applets
• Kleine Programme innerhalb von Webseiten
• Eingeschränkte Berechtigungen
� Anwendungen
• Hauptfenster und Dialogfenster
• Pluggable Look and Feel unter Swing
� Layout-Manager
• Kontrollieren Position und Größe der Komponenten
� Ereignisse
• Klick auf Schaltfläche, Texteingabe, Auswahl eines Listenelements, …
• Ereignisbehandler werden bei Komponente registriert
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 41����������������������������
���������������������������
Literatur
� The JavaTM Tutor, Creating a GUI with JFC/Swing (The Swing Tutorial), http://java.sun.com/docs/books/tutorial/uiswing/
� Horstmann, Cornell, Core Java 2, Band 1 - Grundlagen, Markt und Technik, 2002:
Kapitel 7 - 11
� Krüger, Handbuch der Java-Programmierung, 3. Auflage, Addison-Wesley, 2003,
http://www.javabuch.de, Kapitel 23, 24, 28, 29, 30, 35, 36
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 42����������������������������
���������������������������
Programmbeispiele
� Programmbeispiele zu den Entwurfsmuster für Handler-Code:
� Download von Homepage der LVA
� Handbuch der Java-Programmierung: �����#>H42�F���, �����#>H4>�F���, �����#>H4I�F���, �����#>H4J�F���, �����#>[email protected]�F���, �����#>H4K�F���