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