Objektorientierte Programmierung Exkurs: Graphische Benutzeroberflächen FH Braunschweig/Wolfenbüttel Sommersemester 2009 1 / 22
Gliederung I Wiederholung Klassen, Objektorientierung (Kapitel 10,11) Exkurs: Javadocs Exkurs: JUnit Exkurs: Datenströme Java Dynamische Datenstrukturen (Kapitel 12 kurz, Vertiefung in Algorithmik) Vererbung (Kapitel 13) Pakete (Kapitel 18) Ausnahmebehandlung (Kapitel 19) Exkurs: Graphische Benutzeroberflächen (21.3) 2 / 22
Gliederung II Enumerationstypen (Kapitel 14) Generizität (Kapitel 15) Exkurs: Collection Typen (21.1) Threads (Kapitel 20) (wird ggf. vorgezogen) Schrittweise Verfeinerung (Kapitel 17) 3 / 22
Einleitung Graphische Benutzeroberflächen unter Java werden auf Basis der folgenden Klassen gebildet java.awt AWT (abstract window toolkit) enthält die Grundklassen und die javax.swing Swing enthält Fenster und Elemente für Benutzeroberflächen (GUI-Komponenten) Ziel: Grundelemente von AWT und Swing anschauen Realisierung eines Beispiels (Calculator) 4 / 22
GUI-Elemente Eine Swing GUI besteht aus den folgenden Komonenten: frames Fenstern, in denen panels eine oder mehrere Zeichenflächen dargestellt werden, die aus GUI-Komponenten wie Textfelder, Buttons, Checkboxen oder Radiobuttons Ziel ist es, eine kurze Einführung in erste zu geben. Weitere Informationen z.b. unter Java Swing Tutorial 5 / 22
Klassen für GUI-Elemente javax.swing.jframe Objekt, die das Fenster zur Verfügung stellt. javax.swing.jpanel Objekt, das mehrere GUI-Komponenten zusammenfasst javax.swing.jtextfield Textfeld javax.swing.jlabel fester Text (nicht editierbar) javax.swing.jbutton Button javax.swing.jcheckbox Checkbox javax.swing.jradiobutton Radiobutton... 6 / 22
GUI-Komponenten zu einem Panel gruppieren Wenn mehrere GUI-Komponenten zu einem Panel gruppiert werden sollen, muss man entscheiden wie. Dazu wählt man einen Layout-Manager, der die Gruppierung von GUI-Komponenten vornimmt Wir lernen hier zwei Layout-Manager kennen: FlowLayout, GridLayout. FlowLayout: Anordnung der Elemente hintereinander GridLayout(n,m): Anordnung der Elemente in einer n m-matrix BorderLayout, GridBagLayout,... siehe Java-API 7 / 22
Beispiele: Panel mit FlowLayout Wie sieht das erzeugte Panel aus? JPanel panel = new JPanel (new FlowLayout ( ) ) ; / / uses FlowLayout panel. add (new JButton ( "A" ) ) ; / / add buttons panel. add (new JButton ( "B" ) ) ; panel. add (new JButton ( "C" ) ) ; 8 / 22
Beispiele: Panel mit GridLayout Wie sieht das erzeugte Panel aus? JPanel panel = new JPanel (new GridLayout ( 2, 2 ) ) ; / / uses GridLay panel. add (new J T e x t F i e l d ( ) ) ; / / adds t e x t f panel. add (new J T e x t F i e l d ( ) ) ; panel. add (new JButton ( "A" ) ) ; / / add buttons panel. add (new JButton ( "B" ) ) ; 9 / 22
Panel in Frame einbinden Panel (JPanel) kann man in ein Fenster (JFrame) einhängen oder zusammen mit weiteren Komponenten und Panels in ein übergeordnetes Panel einfügen JFrame window = new JFrame ( ) ; / / creates a window window. setdefaultcloseoperation ( WindowConstants. EXIT_ON_CLOSE ) ; window. setcontentpane ( panel ) ; / / adds the panel to the window window. pack ( ) ; / / c a l c u l a t e s the p o s i t i o n of GUI window. s e t V i s i b l e ( true ) ; 10 / 22
Ereignisse Wenn der Benutzer mit der GUI interagiert, so lösen die GUI-Komponenten Ereignisse aus. Interagieren meint: Button drücken, Text eingeben, Checkbox auswählen,... Informationen über Ereignisse werden in Ereignisobjekten verwaltet. Für jede Ereignis-Art gibt es in Java ein Listener-Interface, das Methoden zur Behandlung des Ereignisses definiert. 11 / 22
Beispiele für Ereignisse und Listener ActionEvent (ActionListener) - Drücken eines Buttons WindowEvent (WindowListener) - z.b. Schliessen des Fensters DocumentEvent (DocumentListener) - Ändern in einem Textfeld, wie JTextField Java Swing Tutorial - Listener API Table 12 / 22
Interface ActionListener Methoden, die im Interface ActionListener deklariert werden: void actionperformed ( ActionEvent e ) Wird ausgeführt, wenn ein Ereignis auftritt. Eine minimale Implementierung ist: import javax. swing. ; import java. awt. ; import java. awt. event. ; class EventExample implements A c t i o n L i s t e n e r { public void actionperformed ( ActionEvent e ) { System. out. p r i n t l n ( " ActionEvent occurred " ) ; } } 13 / 22
GUI-Komponente registrieren Objekte der Klasse EventExample können nun auf ActionEvents reagieren. Nun muss man sie bei der Ereignisquelle, also der GUI-Komponente registrieren. D.h. wir registrieren den Listener bei einem Objekt myobj vom Typ JButton. button. addactionlistener ( myobj ) ; 14 / 22
Einfache GUI mit JButton und ActionListener class EventExample implements A c t i o n L i s t e n e r { J T e x t F i e l d t e x t = new J T e x t F i e l d ( ) ; JButton button = new JButton ( " Button " ) ; public EventExample ( ) { / / r e g i s t e r t h i s class as a L i s t e n e r f o r ActionEvents button. addactionlistener ( this ) ; / / create panel JPanel panel = new JPanel (new GridLayout ( 2, 1 ) ) ; panel. add ( t e x t ) ; panel. add ( button ) ; window. setdefaultcloseoperation ( WindowConstants. EXIT_ON_CLO / / create window, r e g i s t e r panel i n window JFrame window = new JFrame ( " A c t i o n L i s t e n e r " ) ; / / creates a window. setcontentpane ( panel ) ; / / adds the panel to the windo window. pack ( ) ; / / c a l c u l a t e s the p o s i t i o n of window. s e t V i s i b l e ( true ) ; }... } 15 / 22
Einfache GUI mit JButton und ActionListener public void actionperformed ( ActionEvent e ) { S t r i n g ausgabe = t e x t. gettext ( ) ; / / read of J T e x t F i e l d System. out. p r i n t l n ( " ActionEvent occurred, c u r r e n t Text i n J T e t e x t. settext ( " " ) ; / / w r i t e of J T e x t F i e l d } 16 / 22
Einfacher Eingabe von zwei Operanden in Textfelder Eingabe von ganzen Zahlen Operationen +, Operationen werden durch Buttons abgebildet Ergebnis wird in das erste Textfeld geschrieben Das zweite Textfeld wird gelöscht Frage: Welche GUI-Komponente brauchen wir, wie organisieren wir sie in Form von JPanels? 17 / 22
Deklaration GUI-Komponenten import javax. swing. ; import java. awt. ; import java. awt. event. ; public class C a l c u l a t o r implements A c t i o n L i s t e n e r { J T e x t F i e l d opd1 = new J T e x t F i e l d ( ) ; / / f i r s t operand J T e x t F i e l d opd2 = new J T e x t F i e l d ( ) ; / / second operand JButton plus = new JButton ( " + " ) ; / / + button JButton minus = new JButton ( " " ) ; / / button 18 / 22
Konstruktor baut panel zusammen, registriert Listener public C a l c u l a t o r ( ) { / / r e g i s t e r the c a l c u l a t o r as a l i s t e n e r f o r ActionEvents plus. addactionlistener ( this ) ; minus. addactionlistener ( this ) ; / / create the button panel JPanel buttons = new JPanel (new FlowLayout ( ) ) ; buttons. add ( plus ) ; buttons. add ( minus ) ; / / create a panel holding the two t e x t f i e l d s and the buttons JPanel panel = new JPanel (new GridLayout ( 3, 1 ) ) ; / / 3 l i n e s, 1 panel. add ( opd1 ) ; panel. add ( opd2 ) ; panel. add ( buttons ) ;... 19 / 22
Konstruktor fügt panel in window ein... / / create the main window JFrame frame = new JFrame ( " C a l c u l a t o r " ) ; frame. setdefaultcloseoperation ( WindowConstants. EXIT_ON_CLOSE ) frame. setcontentpane ( panel ) ; frame. pack ( ) ; frame. s e t V i s i b l e ( true ) ; } 20 / 22
Implementierung der Methode actionperformed / / r e a c t s to c l i c k s on the + or button public void actionperformed ( ActionEvent e ) { t r y { i n t val1 = I n t e g e r. p a r s e I n t ( opd1. gettext ( ) ) ; / / get value of i n t val2 = I n t e g e r. p a r s e I n t ( opd2. gettext ( ) ) ; / / get value of i n t res ; i f ( e. getsource ( ) == plus ) { / / + button c l i c res = val1 + val2 ; } else i f ( e. getsource ( ) == minus ) { / / button c l i c res = val1 val2 ; } else { res = 0; } opd1. settext ( S t r i n g. valueof ( res ) ) ; / / w r i t e r e s u l t opd2. settext ( " " ) ; / / c l e a r second } catch ( NumberFormatException ex ) { opd1. settext ( " B i t t e Zahl eingeben " ) ; } 21 / 22
Implementierung main -Methode public s t a t i c void main ( S t r i n g [ ] args ) { new C a l c u l a t o r ( ) ; } 22 / 22