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