Liste Programmieren – Java Überblick 1 2 3 4 5 6 7 8 9 10 11
Was ist Java? Klassen und Objekte Vererbung Schnittstellen Innere Klassen Exceptions Funktionsbibliothek Datenstrukturen und Algorithmen Ein-/Ausgabe Threads GUI-Programmierung mit SWING
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
441
Liste Programmieren – Java Überblick: 11. GUI-Programmierung mit SWING 11.1 11.2 11.3 11.4 11.5 11.6 11.7
Einführung Einfache Swing Komponenten Ereignisbehandlung und Adapterklassen Zeichnen Dialoge Layout Manager Komplexere Swing Komponenten
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
442
1
11. GUI-Programmierung mit SWING Überblick: 11.1. Einführung 11.1.1 Was ist Swing? 11.1.2 11.1.3
Ein erstes Swing-Programm Ereignis Behandlung
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
443
11. SWING: 11.1. Einführung 11.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
Liste Programmieren - Java
444
2
11. SWING: 11.1. Einführung 11.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
Microsoft Foundation Classes (MFC)
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
445
11. SWING: 11.1. Einführung 11.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
Liste Programmieren - Java
446
3
11. SWING: 11.1. Einführung 11.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
Liste Programmieren - Java
447
11. SWING: 11.1. Einführung 11.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
© Prof. Dr. Björn Dreher
Ihr eigenes Modell
Liste Programmieren - Java
448
4
11. SWING: 11.1. Einführung 11.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
Liste Programmieren - Java
449
11. SWING: 11.1. Einführung 11.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
Liste Programmieren - Java
450
5
11. SWING: 11.1. Einführung 11.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
Liste Programmieren - Java
451
11. SWING: 11.1. Einführung 11.1.1 Was ist Swing?
Vererbungshierarchie java.lang.Object
java.awt.Component
Gemeinsame Methoden für alle GUI Komponenten, z.B. paint(), repaint(), update()
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
Liste Programmieren - Java
452
6
11. GUI-Programmierung mit SWING Überblick: 11.1. Einführung 11.1.1
Was ist Swing?
11.1.2 Ein erstes Swing-Programm 11.1.3
Ereignis Behandlung
© Prof. Dr. Björn Dreher
453
Liste Programmieren - Java
11. SWING: 11.1. Einführung 11.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; // set up GUI in constructor public LabelTest() { 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
Liste Programmieren - Java
Behälter für visuelle Komponenten des Frames
454
7
11. SWING: 11.1. Einführung 11.1.2 Ein erstes Swing Programm
Swing Komponente JLabel (fortgesetzt) ... // JLabel constructor with a string argument label1 = new JLabel( "Label with text" ); label1.setToolTipText( "This is label1" ); container.add( label1 );
setToolTipText() geerbt von 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
455
Liste Programmieren - Java
11. SWING: 11.1. Einführung 11.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 );
Relativ zum Image
} ...
Setze Eigenschaften des JFrames © Prof. Dr. Björn Dreher
Liste Programmieren - Java
456
8
11. SWING: 11.1. Einführung 11.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
Liste Programmieren - Java
457
11. GUI-Programmierung mit SWING Überblick: 11.1. Einführung 11.1.1
Was ist Swing?
11.1.2 Ein erstes Swing-Programm 11.1.3 Ereignis Behandlung
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
458
9
11. SWING: 11.1. Einführung 11.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
459
Liste Programmieren - Java
11. SWING: 11.1. Einführung 11.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
Liste Programmieren - Java
460
10
11. SWING: 11.1. Einführung 11.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
Liste Programmieren - Java
461
11. SWING: 11.1. Einführung 11.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
Liste Programmieren - Java
462
11
11. SWING: 11.1. Einführung 11.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
AdjustmentListener
TextListener
MouseListener
© Prof. Dr. Björn Dreher
WindowListener
MouseMotionListener
Liste Programmieren - Java
463
11. SWING: 11.1. Einführung 11.1.3 Ereignis Behandlung
Event Listener Objekt
Hört auf bestimmte Typen von Events, die von Event Quelle erzeugt wurden Æ Strenge Typisierung 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 (Observer Pattern) Enter Taste in JTextField gedrückt Methode actionPerformed des registrierten Listeners wird aufgerufen
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
464
12
11. SWING: 11.1. Einführung 11.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
actionPerformed(e: ActionEvent)
Liste Programmieren - Java
465
11. SWING: 11.1. Einführung 11.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() ); ...
Layout für ContentPane © Prof. Dr. Björn Dreher
Liste Programmieren - Java
466
13
11. SWING: 11.1. Einführung 11.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
11. SWING: 11.1. Einführung 11.1.3 Ereignis Behandlung
467
Liste Programmieren - Java
Quellcode (fortgesetzt)
Ein ActionListener: s. unten
... // 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
Liste Programmieren - Java
468
14
11. SWING: 11.1. Einführung 11.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
469
Liste Programmieren - Java
11. SWING: 11.1. Einführung 11.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
Liste Programmieren - Java
470
15
11. SWING: 11.1. Einführung 11.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 ); } } }
// end private inner class TextFieldHandler
Pop-Up Fenster
// end class TextFieldTest
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
471
11. SWING: 11.1. Einführung 11.1.3 Ereignis Behandlung
Das Frame
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
472
16