Softwaretechnik

Werbung
Softwaretechnik
Programmieren von GUIs mit Swing
Fachhochschule Wiesbaden, FB Informatik
Studiengang Medieninformatik
Vorlesung im WS 2002/2003
1
Literatur
„
H.M. Deitel, P.J. Deitel
Java – How to Program, Introducing Object-Oriented Design with the UML
and Design Patterns
Prentice Hall, 2002, ISBN 0-13-0345151-7, 4. Auflage
Kapitel 12 und 13 dieses allgemeinen Java-Buches liefern eine gute, knappe
Einführung in die Swing-Programmierung ohne auf AWT aufzubauen. Buch ist etwas
bunt, aber dennoch empfehlenswert.
Großteil dieser Einführung basiert auf diesen Kapiteln
„
John Zukowski
Definitive Guide to Swing for Java 2, Second Edition
Apress, 2000, ISBN 1-893115-78-X
Sehr gelobtes, umfassendes Buch über Swing-Programmierung.
„
„
„
Andere Swing-Bücher
Swing-Kapitel in anderen Java-Büchern
The JFC Swing Tutorial im Java Tutorial
© Prof. Dr. Björn Dreher
Softwaretechnik (Medieninformatik)
2
1
Softwaretechnik (Medieninformatik): GUIs mit Swing
Überblick
1
2
3
4
5
Einführung
Einfache Swing Komponenten
Ereignisbehandlung und Adapterklassen
Layout Manager
Komplexere Swing Komponenten
© Prof. Dr. Björn Dreher
Softwaretechnik (Medieninformatik)
3
Softwaretechnik (Medieninformatik): GUIs mit Swing
Überblick: 1. Einführung
1.1
Was ist Swing?
1.2
1.3
Ein erstes Swing-Programm
Ereignis Behandlung
© Prof. Dr. Björn Dreher
Softwaretechnik (Medieninformatik)
4
2
1. Einführung
1.1 Was ist Swing?
„
Erstellen von graphischen Benutzerschnittstellen
‰
‰
Graphical User Interface: GUI
Völlig andere Programmstruktur
„
Nicht einfach ein Hauptprogramm, das Methoden verschiedener
Objekte der Reihe nach aufruft
„
Auch nicht nur ein Menüsystem
„
Programm wird durch Benutzerinteraktion gesteuert
‰
‰
‰
„
Art und Reihenfolge nicht im Detail planbar
Ereignisgesteuerte Anwendung
Tastatureingabe, Mausklick, ...
Realisiert durch sog. Model-View-Controller Anwendungsarchitektur
© Prof. Dr. Björn Dreher
Softwaretechnik (Medieninformatik)
5
1. Einführung
1.1 Was ist Swing?
„
Model-View-Controller (MVC) Anwendungsarchitektur
‰
‰
Realisierbar durch Observer Design-Pattern
Beobachter beobachtet eine Sache
„
Registriert sich bei der Sache
„
Wird von Änderungen informiert
„
Verschieden Visualisierungen derselben Sache sind möglich
‰
„
Verschiedene Views desselben Modells
Soweit auch als Document-View Architektur bekannt
‰
© Prof. Dr. Björn Dreher
Microsoft Foundation Classes (MFC)
Softwaretechnik (Medieninformatik)
6
3
1. Einführung
1.1 Was ist Swing?
„
MVC Rollen
‰
‰
‰
Model:
„
Repräsentiert internen Zustand eines Objektes
„
Speichert diesen
„
Stellt Methoden zum Ändern und Abfragen zur Verfügung
View:
„
Stellt Zustand des Modells dar
„
Benutzt dazu die Methoden des Modells
Controller:
„
Reagiert auf Interaktion mit der graphischen Oberfläche
„
Aktualisiert den Zustand des Modells
„
Sorgt dafür, dass View aktualisiert wird
„
Ruft ggf. anderen View auf
© Prof. Dr. Björn Dreher
7
Softwaretechnik (Medieninformatik)
1. Einführung
1.1 Was ist Swing?
„
MVC Architektur
Benutzereingaben
Bildschirmausgabe
Änderung der Darstellung
Controller
View
Änderungen in der
Benutzerschnittstelle
Veränderung von
Daten
© Prof. Dr. Björn Dreher
Model
Zugriff auf Daten
zur
Visualisiereung
Softwaretechnik (Medieninformatik)
8
4
1. Einführung
1.1 Was ist Swing?
„
MVC Realität
‰
‰
‰
‰
View und Controller sind meistens eng miteinander verbunden
Trennung würde Entwurf von visuellen Komponenten komplizieren
Hätte höheren Kommunikationsaufwand zwischen View und Controller
zur Folge
Daher in der Praxis:
„
Model und View sind eine Komponente, d.h. eine Klasse
„
Basisklasse JComponent, delegiert an ComponentUI
„
Swing-Komponente kann aber (im Innern) noch weitere
Bestandteile besitzen
‰
Ihr eigenes Modell
© Prof. Dr. Björn Dreher
Softwaretechnik (Medieninformatik)
9
1. Einführung
1.1 Was ist Swing?
„
Komponenten Beispiele
‰
‰
‰
‰
‰
JLabel
„
Konstanter Text oder Graphik, nicht editierbar
JTextField
„
Texteingabefeld; kann auch Text nur darstellen
JButton
„
Knopf zum Anklicken: Löst ein bestimmtes Ereignis (event) aus
JCheckBox
„
Kann selektiert oder nicht selektiert sein
JComboBox
„
Drop-down Liste von Einträgen, von denen einer oder mehrere
ausgewählt werden können. Doppelklick erzeugt ein Action
Ereignis (action event)
© Prof. Dr. Björn Dreher
Softwaretechnik (Medieninformatik)
10
5
1. Einführung
1.1 Was ist Swing?
„
Komponenten Beispiele (fortgesetzt)
‰
‰
JList
„
Normale Liste von Einträgen, von denen einer oder mehrere
ausgewählt werden können. Doppelklick erzeugt ein Action
Ereignis (action event)
JPanel
„
Ein Container, der Swing-Komponenten aufnehmen kann
© Prof. Dr. Björn Dreher
Softwaretechnik (Medieninformatik)
11
1. Einführung
1.1 Was ist Swing?
„
Packages
‰
‰
‰
Haupt Swing-Package
„
javax.swing
„
Sog. lightweight components
„
Vollständig in Java geschrieben
Frühere Generation von GUI-Komponenten: Abstract Windowing
Toolkit (AWT)
„
java.awt
„
Enge Kopplung an graphische Oberfläche der BetriebssystemPlattform
„
Darstellung abhängig von dieser
„
Sog. heavyweight components
„
Delegieren an zugehörige Komponente des Packages
java.awt.peer, um mit Betriebssystem-Plattform zu wechselwirken
Swing Komponenten erben trotzdem oft von AWT Komponenten
© Prof. Dr. Björn Dreher
Softwaretechnik (Medieninformatik)
12
6
1. Einführung
1.1 Was ist Swing?
„
Vererbungshierarchie
Gemeinsame Methoden für alle
GUI Komponenten, z.B. paint(),
repaint(), update()
java.lang.Object
java.awt.Component
Funktionalität für Collection von
zusammengehörigen
Komponenten, z.B. JPanel.
Methoden add() und setLayout()
java.awt.Container
javax.swing.JComponent
© Prof. Dr. Björn Dreher
Basisklasse fast aller Swing
Komponenten
Softwaretechnik (Medieninformatik)
13
Softwaretechnik (Medieninformatik): GUIs mit Swing
Überblick: 1. Einführung
1.1
Was ist Swing?
1.2
Ein erstes Swing-Programm
1.3
Ereignis Behandlung
© Prof. Dr. Björn Dreher
Softwaretechnik (Medieninformatik)
14
7
1. Einführung
1.2 Ein erstes Swing Programm
„
Swing Komponente JLabel
// Java core packages
import java.awt.*;
import java.awt.event.*;
// Java extension packages
import javax.swing.*;
public class LabelTest extends JFrame {
private JLabel label1, label2, label3;
Behälter für visuelle
// set up GUI in constructor
Komponenten des
public LabelTest()
Frames
{
super( "Testing JLabel" ); // call JFrame constructor
// get content pane and set its layout
Container container = getContentPane();
container.setLayout( new FlowLayout() );
...
© Prof. Dr. Björn Dreher
Softwaretechnik (Medieninformatik)
15
1. Einführung
1.2 Ein erstes Swing Programm
„
Swing Komponente JLabel (fortgesetzt)
...
// JLabel constructor with a string argument
label1 = new JLabel( "Label with text" );
setToolTipText()
label1.setToolTipText( "This is label1" );
geerbt von
container.add( label1 );
JComponent
// JLabel constructor with string, Icon and
// alignment arguments
Icon bug = new ImageIcon( "bug1.gif" );
// oder .png oder .jpg
label2 = new JLabel( "Label with text and icon",
bug, SwingConstants.LEFT );
label2.setToolTipText( "This is label2" );
container.add( label2 );
...
Füge zum
Behälter hinzu
© Prof. Dr. Björn Dreher
Softwaretechnik (Medieninformatik)
16
8
1. Einführung
1.2 Ein erstes Swing Programm
„
Swing Komponente JLabel (fortgesetzt)
...
// JLabel constructor no arguments
label3 = new JLabel();
// change JLabel's properties
label3.setText("Label with icon and text at bottom");
label3.setIcon( bug );
label3.setHorizontalTextPosition(SwingConstants.CENTER);
label3.setVerticalTextPosition(SwingConstants.BOTTOM);
label3.setToolTipText("This is label3");
container.add( label3 );
setSize( 275, 170 );
setVisible( true );
}
...
© Prof. Dr. Björn Dreher
Setze
Eigenschaften des
JFrames
17
Softwaretechnik (Medieninformatik)
1. Einführung
1.2 Ein erstes Swing Programm
„
Swing Komponente JLabel (fortgesetzt)
...
// execute application
public static void main( String args[] )
{
LabelTest application = new LabelTest();
application.setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE );
}
}
// end class LabelTest
Was passiert beim
Schließen des
JFrames?
© Prof. Dr. Björn Dreher
Softwaretechnik (Medieninformatik)
18
9
Softwaretechnik (Medieninformatik): GUIs mit Swing
Überblick: 1. Einführung
1.1
Was ist Swing?
1.2
1.3
Ein erstes Swing-Programm
Ereignis Behandlung
© Prof. Dr. Björn Dreher
Softwaretechnik (Medieninformatik)
19
1. Einführung
1.3 Ereignis Behandlung
„
GUIs sind Ereignis getrieben (event driven)
‰
‰
‰
‰
Wenn Benutzer mit dem GUI wechselwirkt, werden Ereignisse erzeugt
„
Texteingabe, Mausklick, ...
Das Ereignis wird dem Programm zugestellt
Vererbungshierarchie von Events im Package java.awt.event
Swing-spezifische Events in javax.swing.event
© Prof. Dr. Björn Dreher
Softwaretechnik (Medieninformatik)
20
10
1. Einführung
1.3 Ereignis Behandlung
„
Vererbungshierarchie von AWT-Events
java.lang.Object
java.util.EventObject
Alle diese Events definiert im
Package java.awt.event
java.awt.AWTEvent
ActionEvent
ComponentEvent
ContainerEvent
InputEvent
KeyEvent
© Prof. Dr. Björn Dreher
ItemEvent
FocusEvent
AdjustmentEvent
PaintEvent
WindowEvent
MouseEvent
Softwaretechnik (Medieninformatik)
21
1. Einführung
1.3 Ereignis Behandlung
„
Drei Beteiligte:
‰
‰
Event Quelle
„
GUI Komponente, mit der der Benutzer wechselwirkt
„
Hat Liste der registrierten Event Listener, um diese von Ereignis zu
informieren
„
Event Listener können sich bei ihr registrieren
Event Objekt
„
Kapselt Informationen über das Ereignis
‰
‰
u.a. Referenz auf die Event Quelle
Event Listener
„
Erhält das Event Objekt von Event Quelle zugestellt
„
Reagiert auf das Ereignis
© Prof. Dr. Björn Dreher
Softwaretechnik (Medieninformatik)
22
11
1. Einführung
1.3 Ereignis Behandlung
„
Aufgaben des Programmierers:
‰
‰
‰
Für die GUI Komponente muss ein event listener registriert werden
Eine event handling method muss implementiert werden
„
Auch event handler genannt
Ein event listener ist ein Objekt einer Klasse, die eine oder mehrere
Methoden enthält, die event-listener Interfaces aus den Packages
„
java.awt.event oder
„
javax.swing.event
implementieren
„
Viele der Interfaces sind für Swing- und AWT-Komponenten
anwendbar
© Prof. Dr. Björn Dreher
23
Softwaretechnik (Medieninformatik)
1. Einführung
1.3 Ereignis Behandlung
„
Vererbungshierarchie von AWT-Listener Interfaces
Alle diese Interfaces definiert im
Package java.awt.event
java.util.EventListener
ActionListener
ContainerListener
ComponentListener
KeyListener
ItemListener
FocusListener
MouseListener
© Prof. Dr. Björn Dreher
AdjustmentListener
TextListener
WindowListener
MouseMotionListener
Softwaretechnik (Medieninformatik)
24
12
1. Einführung
1.3 Ereignis Behandlung
„
Event Listener Objekt
‰
‰
‰
‰
‰
Hört auf bestimmte Typen von Events, die von Event Quelle erzeugt
wurden
Event Handler ist eine Methode, die auf das Ereignis hin aufgerufen
wird
Event Listener Interface spezifiziert eine oder mehrere Event-Handling
Methoden
„
Müssen in der Event Listener Klasse implementiert werden
Delegation Event Model
„
Verarbeitung des Ereignisses an ein bestimmtes Objekt (den
Listener) delegiert
Enter Taste in JTextField gedrückt
„
Methode actionPerformed des registrierten Listeners wird
aufgerufen
© Prof. Dr. Björn Dreher
25
Softwaretechnik (Medieninformatik)
1. Einführung
1.3 Ereignis Behandlung
„
Klassendiagramm
JTextField
# listenerList: EventListenerList
+ addActionListener(l: ActionListener)
+ removeActionListener(l: ActionListener)
# fireActionPerformed()
+ getState()
listeners
ActionListener
0..*
actionPerformed(e: ActionEvent)
for all l in listenerList {
l.actionPerformed(
e: ActionEvent)
}
TextFieldHandler
handlerState
handlerState =
e.getSource().getState()
© Prof. Dr. Björn Dreher
Softwaretechnik (Medieninformatik)
actionPerformed(e: ActionEvent)
26
13
1. Einführung
1.3 Ereignis Behandlung
„
Quellcode
// Java core packages
import java.awt.*;
import java.awt.event.*;
// Java extension packages
import javax.swing.*;
Referenzen zu 3 TextFeldern und einem
Password-Feld
public class TextFieldTest extends JFrame {
private JTextField textField1, textField2, textField3;
private JPasswordField passwordField;
// set up GUI in Constructor
public TextFieldTest() {
super( "Testing JTextField and JPasswordField" );
Container container = getContentPane();
container.setLayout( new FlowLayout() );
...
© Prof. Dr. Björn Dreher
Layout für
ConentPane
27
Softwaretechnik (Medieninformatik)
1. Einführung
1.3 Ereignis Behandlung
„
Quellcode (fortgesetzt)
...
// construct textfield with default sizing
textField1 = new JTextField( 10 );
container.add( textField1 );
10 Zeichen breit
// construct textfield with default text
textField2 = new JTextField( "Enter text here" );
container.add( textField2 );
// construct textfield with default text and
// 20 visible elements and no event handler for editing
textField3 = new JTextField( "Uneditable text field",
20 );
textField3.setEditable( false );
Inhalt nicht
container.add( textField3 );
editierbar
// construct passwordfield with default text
passwordField = new JPasswordField( "Hidden text" );
container.add( passwordField );
© Prof. Dr. Björn Dreher
Softwaretechnik (Medieninformatik)
28
14
1. Einführung
1.3 Ereignis Behandlung
„
Quellcode (fortgesetzt)
Ein ActionListener
...
// register event handlers
TextFieldHandler handler = new TextFieldHandler();
textField1.addActionListener( handler );
textField2.addActionListener( handler );
textField3.addActionListener( handler );
passwordField.addActionListener( handler );
setSize( 325, 100 );
setVisible( true );
}
...
Registriere
ActionListener
© Prof. Dr. Björn Dreher
Softwaretechnik (Medieninformatik)
29
1. Einführung
1.3 Ereignis Behandlung
„
Quellcode (fortgesetzt)
...
// execute application
public static void main( String args[] )
{
TextFieldTest application = new TextFieldTest();
application.setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE );
}
...
© Prof. Dr. Björn Dreher
Softwaretechnik (Medieninformatik)
30
15
1. Einführung
1.3 Ereignis Behandlung
„
Quellcode (fortgesetzt)
Ein ActionListener
...
// private inner class for event handling
private class TextFieldHandler implements ActionListener {
// process text field events
public void actionPerformed( ActionEvent event ) {
String string = "";
Event Handler
// user pressed Enter in JTextField textField1
if ( event.getSource() == textField1 )
string = "textField1: " + event.getActionCommand();
// user pressed Enter in JTextField textField2
else if ( event.getSource() == textField2 )
string = "textField2: " + event.getActionCommand();
...
Liefert Text in dem Feld
© Prof. Dr. Björn Dreher
31
Softwaretechnik (Medieninformatik)
1. Einführung
1.3 Ereignis Behandlung
„
Quellcode (fortgesetzt)
...
// user pressed Enter in JTextField textField3
else if ( event.getSource() == textField3 )
string = "textField3: " + event.getActionCommand();
// user pressed Enter in JTextField passwordField
else if ( event.getSource() == passwordField ) {
JPasswordField pwd =
( JPasswordField ) event.getSource();
string = "passwordField: " +
new String( pwd.getPassword() );
}
Liefert Passwort
JOptionPane.showMessageDialog( null, string );
}
}
}
Pop-Up Fenster
// end private inner class TextFieldHandler
// end class TextFieldTest
© Prof. Dr. Björn Dreher
Softwaretechnik (Medieninformatik)
32
16
1. Einführung
1.3 Ereignis Behandlung
„
Das Frame
© Prof. Dr. Björn Dreher
Softwaretechnik (Medieninformatik)
33
17
Herunterladen