Universität Stuttgart Institut für Automatisierungs- und Softwaretechnik Prof. Dr.-Ing. Dr. h. c. P. Göhner Einführung in Java, Teil 6 Angepasst auf Swing von Daniel Huson Vorlesung Informatik I, 6.12.2005 2000, IAS 1
Überblick Teil 5: JApplet-Grundlagen Teil 6: Elemente der Swing Bibliothek 2000, IAS 2
Elemente von Swing Swing-Übersicht Swing bietetet eine Vielzahl von Komponenten für graphische Benutzeroberflächen Swing-Komponenten können in Containern verschachtelt werden wichtige Swing-Komponenten Container ermöglichen Verschachtelungen, sie können konkrete Komponenten oder andere Container enthalten. Häufigster Vertreter: JPanel (JApplet ist von JPanel abgeleitet) Canvas ist ein Zeichenbereich zur Erstellung von Graphiken GUI-Komponenten, wie z.b. Labels, Schaltflächen, Listenfelder, Textfelder, Kontrollfelder, u.s.w. Fensterkomponenten, wie z.b. Fenster, Rahmen, Menüleisten, Dialogfelder alle Elemente sind als Klassenhierarchie im javax.swing- Paket organisiert 2000, IAS 3
Elemente von Swing Swing- JLabel (1) JLabel: nicht-editierbare Zeichenkette, die zur Beschriftung anderer Komponenten dient Vorteile von JLabels (gegenüber drawstring()): keine paint()-anweisungen notwendig automatische Layout-Anpassungen JLabel-Konstruktoren: JLabel() erzeugt leeres, links ausgerichtetes Label JLabel( String ) erzeugt Label mit Zeichenkette JLabel( String, int ) ermöglicht Ausrichtung mit Hilfe von Label-Klassenvariablen JLabel.RIGHT, JLabel.LEFT, JLabel.CENTER die Schrift des JLabels kann mit setfont() beliebig geändert werden 2000, IAS 4
Elemente von Swing Swing- JLabel (2) Beispiel import javax.swing.*; import java.awt.*; public class JLabelTest extends javax.swing.japplet { public void init() { setfont( new Font( Helvetica, Font.BOLD, 16)); getcontentpane().setlayout( new GridLayout( 3, 1 )); getcontentpane().add( new JLabel( linksgerichtet,jlabel.left)); getcontentpane(). add( new JLabel( zentriert,jlabel.center)); getcontentpane(). add( new JLabel( rechtsgerichtet, JLabel.RIGHT)); Label-Methoden: gettext() gibt die Zeichenkette des Labels aus settext(string) ändert den Label-Text getalignment() gibt die Ausrichtung des Label als Integer zurück: 0 (links), 1 (zentriert) oder 2 (rechts) setalignment(int) ändert die Label-Ausrichtung 2000, IAS 5
Elemente von Swing Swing - Schaltflächen Schaltfläche (Button): kann mit der Maus angeklickt werden und Aktionen auslösen Konstruktoren: JButton() erzeugt Schaltfläche ohne Beschriftung JButton( String ) erzeugt Schaltfläche mit String als Beschriftung Methoden: getlabel() gibt die Beschriftung der Schaltfläche zurück setlabel( String ) beschriftet die Schaltfläche mit String Beispiel import javax.swing.*; import java.awt.*; public class JButtonTest extends javax.swing.japplet { public void init() { getcontentpane().setlayout(new FlowLayout()); getcontentpane().add(new JButton( OK )); getcontentpane().add(new JButton( Cancel )); 2000, IAS 6
Elemente von Swing Swing - Kontrollfelder Kontrollfelder (Checkbox) stellen Optionen bereit, die gewählt oder nicht gewählt werden können. Die Optionen schließen sich nicht gegenseitig aus (Mehrfachauswahl möglich) Konstruktoren: JCheckBox() erzeugt unbeschriftetes, nicht gewähltes Kontrollfeld JCheckBox( String ) erzeugt Kontrollfeld mit String- Beschriftung JCheckBox( String, boolean ) erzeugt beschriftetes Kontrollfeld, welches ausgewählt (true) oder nicht ausgewählt (false) ist Methoden: getlabel() gibt Feldbeschriftung aus setlabel( String ) ändert Feldbeschriftung getstate() gibt true oder false (je nach Selektion) aus setstate(boolean) ändert Auswahlstatus des Kontrollfeldes 2000, IAS 7
Elemente von Swing Swing - Kontrollfelder import javax.swing.*; import java.awt.*; public class JCheckBoxTest extends javax.swing.japplet { public void init() { getcontentpane().setlayout(new FlowLayout(FlowLayout.LEFT)); getcontentpane().add(new JCheckBox("Rot", false)); getcontentpane().add(new JCheckBox("Grün", false)); getcontentpane().add(new JCheckBox("Blau", false)); 2000, IAS 8
Elemente von Swing Swing - Auswahlknöpfe Auswahlknöpfe sind ähnlich wie Kontrollfelder, es kann allerdings nur eine Option gewählt werden. Die einzelnen Optionen werden in einer ButtonGroup gruppiert: Beispiel mport javax.swing.*; import java.awt.*; public class JRadioButtonTest extends javax.swing.japplet { public void init() { getcontentpane().setlayout(new FlowLayout(FlowLayout.LEFT)); ButtonGroup group = new ButtonGroup(); JRadioButton button; button = new JRadioButton("Rot", true); getcontentpane().add(button); group.add(button); button = new JRadioButton("Grün", false); getcontentpane().add(button); group.add(button); button = new JRadioButton("Blau", false); getcontentpane().add(button); group.add(button); 2000, IAS 9
Swing - Textfelder (1) Textfelder (TextField) stellen editierbaren Bereich für die Eingabe einer Textzeile zur Verfügung Konstruktoren: JTextField() erzeugt leeres Textfeld JTextField( String ) erzeugt mit Zeichenkette initialisiertes Textfeld, Breite wird durch aktuellen Layout-Manager vorgegeben JTextField( String, int ) erzeugt initialisiertes Textfeld mit vorgegebener Breite (Zeichen) JTextField tf = new JTextField( Erstes Textfeld, 30); getcontentpane().add( tf ); zur Beschriftung des Textfeldes muss ein zusätzliches Label verwendet werden 2000, IAS 10
Swing - Textfelder (2) Methoden: gettext() gibt Text als Zeichenkette aus settext( String ) setzt Zeichenkette in das Feld getcolumns() gibt Breite des Textfeldes aus select( int, int ) wählt Text zwischen beiden Positionen aus selectall() wählt den gesamten Text aus iseditable() gibt aus, ob Text editierbar ist (true/false) seteditable( boolean ) ermöglicht (true) oder verbietet (false) editieren des Textes Beispiel... public void init() { getcontentpane().setlayout( new GridLayout( 1, 2, 5, 15 ) ); getcontentpane().add( new JLabel( Name: ) ); getcontentpane(). add( new JTextField( Ihren Namen bitte, 40) ); 2000, IAS 11
Layout-Manager jedes Applet (Panel) kann konkrete Komponenten oder weitere Panels enthalten ein Layout-Manager bestimmt, wie die Swing-Elemente in einem Panel dynamisch angeordnet werden jedes Panel kann einen eigenen Layout-Manager besitzten das AWT beinhaltet fünf verschiedene Layout-Manager: FlowLayout, GridLayout, BorderLayout, CardLayout und GridBagLayout ein Manager wird in einem Panel verwendet, indem a) eine Instanz einer Layout-Manager-Klasse gebildet wird und b) die setlayout()-methode für das umgebende Panel aufgerufen wird die Reihenfolgen, in der Swing-Elemente in das Layout eingefügt werden (add()-methode), ist entscheidend für ihre Positionierung 2000, IAS 12
FlowLayout das FlowLayout ordnet die Komponenten zeilenweise von links nach rechts an. Passt eine Komponente nicht in die Zeile, wird automatisch eine neue Zeile begonnen die zentrierte Zeilenausrichtung kann mit den Klassenvariablen FlowLayout.RIGHT und FlowLayout.LEFT verändert werden der horizontale und vertikale Abstand kann durch zwei Integer-Argumente angegeben werden Beispiel import java.awt.*; import javax.swing.*; public class FlowTest extends javax.swing.japplet { public void init() { getcontentpane().setlayout(new FlowLayout(FlowLayout.LEFT, 20, 20)); getcontentpane().add(new JButton("Eins")); getcontentpane().add(new JButton("Zwei")); getcontentpane().add(new JButton("Drei")); getcontentpane().add(new JButton("Vier")); 2000, IAS 13
GridLayout bei GridLayout wird das Panel in Zeilen und Spalten unterteilt. Die Komponenten werden von links nach rechts und von oben nach unten eingefügt auch hier können zusätzliche horizontale und vertikale Abstände zwischen den Komponenten angegeben werden Beispiel import java.awt.*; import javax.swing.*; public class GridTest extends javax.swing.japplet { public void init() { getcontentpane(). setlayout(new GridLayout(2, 2, 3, 10)); getcontentpane(). add(new JButton("Eins")); getcontentpane(). add(new JButton("Zwei")); getcontentpane(). add(new JButton("Drei")); getcontentpane(). add(new JButton("Vier")); 2000, IAS 14
BorderLayout beim BorderLayout werden Komponenten mit Hilfe von geographischen Angaben (North, East, South, West, Center) angeordnet Beispiel import java.awt.*; import javax.swing.*; public class BorderTest extends javax.swing.japplet { public void init() { getcontentpane(). setlayout(new BorderLayout(5, 10)); getcontentpane().add("north", new JButton("Eins")); getcontentpane().add("east", new JButton("Zwei")); getcontentpane().add("south", new JButton("Drei")); getcontentpane().add("west", new JButton("Vier")); 2000, IAS 15
Card- und GridBagLayout die Karten in einem CardLayout sind unterschiedliche Panels, die nacheinander eingefügt und angezeigt werden. Es kann jeweils nur eine Karte angezeigt werden, aber man kann zwischen den Karten wechseln das GridBagLayout ist der mächtigste, aber auch der komplizierteste Layout-Manager - er ermöglicht die Anordnung der Komponenten in einem rasterähnlichen Layout im GridBagLayout kann zusätzlich die Weite der einzelnen Zellen, sowie die Proportionen zwischen Zeilen und Spalten kontrolliert werden die Fähigkeiten des GridBag-Manager können meistens durch Verschachteln einfacherer Manager nachgebildet werden 2000, IAS 16
Listener für GUI-Komponenten (1) Listener-Interface Ereignis Definition (alle public void) ActionListener Aktion actionperformed(actionevent e) ItemListener Liste itemstatechanged(itemevent e) gewählt FocusListener Fokuserhalt focusgained(focusevent e) Fokusverlust focuslost(focusevent e) TextListener Text geändert textvaluechanged(textevent e) die meisten dieser Listener-Schnittstellen (bis auf FocusListener) besitzten keine Adapterklassen, d.h. die Schnittstellen müssen von Hand implementiert werden 2000, IAS 17
Listener für GUI-Komponenten (2) bei der Implementierung der Listener-Schnittstelle kann mit Hilfe der getsource()-methode eine Referenz auf die Komponente ermittelt werden, die das Ereignis erhalten hat public void actionperformed( ActionEvent e ){ Button ursprung = e.getsource(); if( ursprung.getlabel().equals( OK )) { // Behandlung von OK else if( ursprung.getlabel().equals( Cancel )) { // Behandlung von Cancel Listener werden durch spezielle Methoden mit den GUI-Elementen verbunden addactionlistener(); additemlistener(); addfocuslistener(); 2000, IAS 18
Listener für GUI-Komponenten (3) für die Registrierung des Listeners in der init()-methode muss bei jeder empfangenden Komponente einzeln registriert werden JButton OKButton = new JButton( OK ); // OKButtonAction implementiert ActionListener OKButtonAction ok = new OKButtonAction(); OKButton.addActionListener( ok ); Details können der API-Dokumentation des jeweiligen Oberflächenelements oder der Schnittstelle entnommen werden 2000, IAS 19
Listener für GUI-Komponenten (4) Beispiel import java.awt.*; Import javax.swing.*; import java.awt.event.*; public class MultiListener extends javax.swing.japplet implements ActionListener { JTextArea lefttextarea; JTextArea righttextarea; JButton button1, button2; public void init() { GridLayout gridbag = new GridLayout(3, 2, 5, 5); getcontentpane().setlayout(gridbag); JLabel l = new JLabel("Das Applet hoert:"); getcontentpane().add(l); JLabel r = new JLabel("Die externe Klasse hoert:"); getcontentpane().add(r); 2000, IAS 20
Listener für GUI-Komponenten (5) Beispiel (Forts.) lefttextarea = new JTextArea(5, 20); lefttextarea.seteditable(false); getcontentpane().add(lefttextarea); righttextarea = new JTextArea(5, 20); righttextarea.seteditable(false); getcontentpane().add(righttextarea); button1 = new JButton("Schaltflaeche 1"); getcontentpane().add(button1); button2 = new JButton("Schaltflaeche 2"); getcontentpane().add(button2); button1.addactionlistener(this); button2.addactionlistener(this); button2.addactionlistener(new MyTextListener(rightTextArea)); // Ende init()-methode 2000, IAS 21
Listener für GUI-Komponenten (6) Beispiel (Forts.) public void actionperformed(actionevent e) { lefttextarea.append(e.getactioncommand() + "\n"); // Ende MultiListener-Klasse class MyTextListener implements ActionListener { JTextArea mytextarea; public MyTextListener ta) { mytextarea = ta; public void actionperformed(actionevent e) { mytextarea.append(e.getactioncommand() + "\n"); 2000, IAS 22
Listener für GUI-Komponenten (7) 2000, IAS 23
Zusammenfassung Swing bietet graphische Oberflächenelemente: Labels Schaltflächen Kontrollfelder Optionsfelder Auswahlmenüs Textfelder mit den fünf Layout-Managern können Swing-Komponenten dynamisch angeordnet werden für die Komponenten-Ereignisse stehen spezielle Schnittstellen zur Verfügung eine Listener muss jeder einzelnen empfangenden Komponente registriert werden 2000, IAS 24
Was wurde nicht behandelt? Threads ( Miniprozesse ) z.b. Drucken im Hintergrund Java-Applikationen mit Swing Netzkommunikation, Client/Server-Applikationen 2000, IAS 25