Swing

Werbung
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
Herunterladen