Liste Programmieren Java Überblick 1 Was ist Java? 2 Klassen und Objekte 3 Vererbung 4 Schnittstellen 5 Innere Klassen 6 Exceptions 7 Funktionsbibliothek 8 Datenstrukturen und Algorithmen 9 Ein-/Ausgabe 10 Threads 11 GUI-Programmierung mit SWING Prof. Dr. Björn Dreher Liste Programmieren - Java 441 Liste Programmieren Java Überblick: 11. GUI-Programmierung mit SWING 11.1 Einführung 11.2 Einfache Swing Komponenten 11.3 Ereignisbehandlung und Adapterklassen 11.4 Zeichnen 11.5 Dialoge 11.6 Layout Manager 11.7 Komplexere Swing Komponenten Prof. Dr. Björn Dreher Liste Programmieren - Java 442
11. GUI-Programmierung mit SWING Überblick: 11.1. Einführung 11.1.2 Ein erstes Swing-Programm Prof. Dr. Björn Dreher Liste Programmieren - Java 443 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
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 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
MVC Architektur Benutzereingaben Bildschirmausgabe Änderung der Darstellung Controller View Änderungen in der Benutzerschnittstelle Veränderung von Daten Model Zugriff auf Daten zur Visualisiereung Prof. Dr. Björn Dreher Liste Programmieren - Java 447 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 Liste Programmieren - Java 448
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 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
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 Betriebssystem- Plattform 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 Vererbungshierarchie java.lang.object Gemeinsame Methoden für alle GUI Komponenten, z.b. paint(), repaint(), update() java.awt.component java.awt.container Funktionalität für Collection von zusammengehörigen Komponenten, z.b. JPanel. Methoden add() und setlayout() javax.swing.jcomponent Basisklasse fast aller Swing Komponenten Prof. Dr. Björn Dreher Liste Programmieren - Java 452
11. GUI-Programmierung mit SWING Überblick: 11.1. Einführung 11.1.2 Ein erstes Swing-Programm Prof. Dr. Björn Dreher Liste Programmieren - Java 453 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() ); Behälter für visuelle Komponenten des Frames Prof. Dr. Björn Dreher Liste Programmieren - Java 454
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 ); // 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 ); settooltiptext() geerbt von JComponent Füge zum Behälter hinzu Prof. Dr. Björn Dreher Liste Programmieren - Java 455 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
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.2 Ein erstes Swing-Programm Prof. Dr. Björn Dreher Liste Programmieren - Java 458
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 Liste Programmieren - Java 459 Vererbungshierarchie von AWT-Events java.lang.object java.util.eventobject java.awt.awtevent Alle diese Events definiert im Package java.awt.event ActionEvent ComponentEvent ItemEvent AdjustmentEvent ContainerEvent InputEvent FocusEvent PaintEvent WindowEvent KeyEvent MouseEvent Prof. Dr. Björn Dreher Liste Programmieren - Java 460
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 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
Vererbungshierarchie von AWT-Listener Interfaces java.util.eventlistener Alle diese Interfaces definiert im Package java.awt.event ActionListener ComponentListener ItemListener AdjustmentListener ContainerListener KeyListener FocusListener TextListener WindowListener MouseListener MouseMotionListener Prof. Dr. Björn Dreher Liste Programmieren - Java 463 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
Klassendiagramm JTextField # listenerlist: EventListenerList + addactionlistener(l: ActionListener) + removeactionlistener(l: ActionListener) # fireactionperformed() + getstate() listeners 0..* for all l in listenerlist { l.actionperformed( e: ActionEvent) } ActionListener actionperformed(e: ActionEvent) handlerstate TextFieldHandler handlerstate = e.getsource().getstate() actionperformed(e: ActionEvent) Prof. Dr. Björn Dreher Liste Programmieren - Java 465 Quellcode // Java core packages import java.awt.*; import java.awt.event.*; // Java extension packages import javax.swing.*; Referenzen zu 3 Text- Feldern 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
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 ); container.add( textfield3 ); // construct passwordfield with default text passwordfield = new JPasswordField( "Hidden text" ); container.add( passwordfield ); Inhalt nicht editierbar Prof. Dr. Björn Dreher Liste Programmieren - Java 467 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
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 Liste Programmieren - Java 469 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
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 } // end class TextFieldTest Pop-Up Fenster Prof. Dr. Björn Dreher Liste Programmieren - Java 471 Das Frame Prof. Dr. Björn Dreher Liste Programmieren - Java 472