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.swingPaket 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 StringBeschriftung • 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 Element von Swing 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 Element von Swing 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 Element von Swing 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 Element von Swing 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 Element von Swing 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 Element von Swing 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 Element von Swing 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 Element von Swing Listener für GUI-Komponenten (1) Listener-Interface Ereignis Definition (alle public void) ActionListener Aktion actionPerformed(ActionEvent e) ItemListener Liste gewählt itemStateChanged(ItemEvent e) FocusListener Fokuserhalt Fokusverlust focusGained(FocusEvent e) 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 Element von Swing 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 Element von Swing 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 Element von Swing 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 Element von Swing 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 Element von Swing 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 Element von Swing Listener für GUI-Komponenten (7) © 2000, IAS 23 Element von Swing 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