javax.swing.* java.awt.*

Werbung
31.03.2004
YOU ARE HERE
•
•
•
•
•
•
•
•
Einführung
Objektorientierte Modellierung
Java-Sprachkonstrukte
Java-Klassenbibliothek
Zeichenketten
Dateien und Streams
Datenstrukturen
Networking
Grafische Benutzungsoberflächen
•
•
•
•
•
•
javax.swing.*
javax.swing.*
java.awt.*
java.awt.*
Komponenten und Container
Layout-Management
Pluggable Look & Feel
MVC-Paradigma
Event Handling
Menüs
• Extensible Markup Language
Java-Praxiskurs
1
Graphische Benutzungsoberflächen
2
GUI-Bibliotheken in Java: JFC
• Ziel: Erstellen eines Graphical User Interfaces (GUI)
z.B. für einen Bankautomaten
• Java Foundation Classes (JFC)
Menüs
• Swing Komponentenbibliothek
(oftmals ungenauerweise synonym zu JFC verwendet)
• Unterstützung für frei wählbares Look&Feel
• API für Dialoghilfen (Accessibility)
• API für Einbinden von 2D-Grafik, Text, Bildern
• Unterstützung für Drag&Drop
Eingabebereiche
für Text
Schaltknöpfe
Container für mehrere
zusammengehörende
Komponenten
Java-Praxiskurs
Behandlung von
Benutzereingaben
(Mausklicks,...)
Anzeigefelder (Label)
Java-Praxiskurs
3
GUI-Bibliotheken in Java: Swing, AWT
Java-Praxiskurs
4
Unterschied AWT - Swing
• Erweiterbare Komponenten für Java-Benutzerschnittstellen
• sichtbare („J“-Klassen) und unsichtbare Klassen
• JButton, JTextField
Event-Klassen
vs.
• AWT - Klassen (Abstract Window Toolkit)
Modell-Klassen,
• Plattformabhängige Darstellung (Peer Klassen)
(„schwergewichtig“)
• Plattformabhängige Behandlung von Benutzereingaben
• rechteckige Zeichenfläche, nicht überlappend
• AWT umfasst Schnittmenge aller Plattformen
• Swing (javax.swing.*)
• ist seit JDK 1.2 enthalten
• Swing - Klassen
• AWT (bereits im JDK 1.0 definiert, also antik)
•
•
•
•
• wird weiterhin unterstützt
• Button und JButton
• wird vor allem für anspruchslose Anwendungen eingesetzt
Java-Praxiskurs
5
Lehrstuhl für Angewandte Telematik/e-Business
Plattformunabhängige Darstellung
in Java geschrieben („leichtgewichtig“), bauen auf AWT auf
nicht nur rechteckige Formen
Swing umfasst Konjunktion der Plattformen
Java-Praxiskurs
6
1
31.03.2004
Entwicklungsziele
Aufbau der Swing API
• viele öffentliche Pakete:
•
•
•
•
•
•
•
• Implementierung in Java
(„lightweight components“)
Ausführung ist plattformunabhängig
• frei wählbaren Look&Feels
Darstellung ist plattformunabhängig
•
•
•
•
• Modell-basierte Programmierung
MVC
• Komponenten als JavaBeans verpackt
• Kompatibilität zu AWT
nein!
•
Java-Praxiskurs
7
Vererbungshierarchie AWT-Swing
•
•
•
•
•
•
•
•
•
java.awt.Component
java.awt.Container
java.awt.Window
java.awt.Frame
JFrame
java.awt.Dialog
JDialog
java.awt.Panel
java.awt.Window
Java-Praxiskurs
Einführung
Objektorientierte Modellierung
Java-Sprachkonstrukte
Java-Klassenbibliothek
Zeichenketten
Dateien und Streams
Datenstrukturen
Networking
Grafische Benutzungsoberflächen
java.applet.Applet
JWindow
JApplet
8
YOU ARE HERE
java.lang.Object
java.awt
javax.swing
GUI-Komponenten
javax.swing.event
Ereignisbehandlung von Swing
javax.swing.border
Rahmen für GUI-Komponenten
javax.swing.table
Tabellendaten anzeigen
javax.swing.tree
Hierachische Daten anzeigen
javax.swing.text
Textdaten anzeigen, editieren
javax.swing.text.html,
javax.swing.text.html.parser ... In HTML
javax.swing.colorchooser
Farbe auswählen-Dialog
javax.swing.filechooser
Datei auswählen-Dialog
javax.swing.undo
„Rückgängig“ bei GUI-Komp.
javax.swing.plaf,
javax.swing.plaf.basic,
Frei wählbares Look&Feel
javax.swing.plaf.metal,
javax.swing.plaf.multi
javax.accessibility
Dialoghilfen für Ein-/Ausgabe
•
•
•
•
•
JComponent
javax.swing
Komponenten und Container
Layout-Management
Pluggable Look & Feel
MVC-Paradigma
Event Handling
Menüs
• Extensible Markup Language
Java-Praxiskurs
9
Java-Praxiskurs
Fenster-Objekt: JFrame
GUI-Komponenten
• Bildschirm-Fenster mit Rahmen, Titel,
Buttons und Menüzeile
• kann minimiert, verschoben, geschlossen
und vergrößert werden
• In der Zeichenfläche können Komponenten gezeichnet
werden.
•
• Die wichtigsten Komponenten:
• JButton
Erzeugen
JFrame f = new JFrame();
• Knopf, beim Drücken wird eine Aktion ausgeführt
JButton b = new JButton();
b.setText("Drück' mich!");
• JFrame hat einen Container "ContentPane".
• enthält alle Komponenten, die auf der
Zeichenfläche gezeichnet werden:
Container c = f.getContentPane();
• JCheckBox
• Boolesche Anzeige: "wahr"/"falsch"
• JRadioButton
• Hinzufügen von Komponenten zu einem JFrame
f.getContentPane().add(...);
Java-Praxiskurs
10
• exklusive Wahl aus Alternativen
11
Lehrstuhl für Angewandte Telematik/e-Business
Java-Praxiskurs
12
2
31.03.2004
GUI-Komponenten
GUI-Komponenten
• JComboBox
• Einstellung eines Wertes (oben) mit vorgegebenen
Alternativen
• JTextField
• Eingeben eines einzeiligen Textes
JTextField t = new JTextField();
String eingabetext = t.getText();
• JList
• damit kann man ein oder mehrere Elemente aus
einer Liste auswählen lassen
String[] data =
{"January", "February", ...};
JList dataList = new JList(data);
• Holen der markierten Zellen
Object[] objekte = dataList.getSelectedValues();
• JTextArea
• Eingeben eines längereren Textes
• JLabel
• einzeiliger Text
JLabel l = new JLabel();
l.setText("Eine Menge Buchstaben...");
• auch für Icon-Anzeige verwendbar
ImageIcon ii = new ImageIcon();
l.setIcon(ii);
Java-Praxiskurs
• JTree
• Darstellung von Hierarchien als Baum
• Die Baum-Äste können an einem Knoten
auf- und zugeklappt werden
13
GUI-Komponenten
Java-Praxiskurs
14
GUI-Komponenten
• JTable
• JSlider
• Darstellen zweidimensionaler Daten in Tabellenform
• Die dargestellten Daten werden im
TableModel gespeichert und verwaltet
• Schieberegler für Werteingabe
aus Zahlenbereich
• Man kann einzeln, zeilen- oder
spaltenweise Elemente selektieren
• Erzeugen einer 4x3 Tabelle
JTable tabelle = new JTable(4,3);
• Datei-Dialog „Öffne“/Speichere“
FileDialog(vaterFenster, "Titel", LOAD);
• Holen des zugeordneten TableModel
TableModel modell = tabelle.getModel();
• Ereignisse
z.B. TableColumnModelEvent mit Methoden
columnAdded(), columnMoved();
Java-Praxiskurs
15
Java-Praxiskurs
16
GUI-Komponenten - Beispiel
Komponenten-Hierarchien
import javax.swing.*;
public class EinfachesGUI extends JFrame {
• Grundlegende Idee: Komponenten enthalten wiederum
Komponenten
public EinfachesGUI() {
getContentPane().setLayout(null);
setSize(300,300);
JLabel l = new JLabel();
l.setText("Label-Fläche");
l.setBounds(0, 0, 200, 50);
getContentPane().add(l);
JButton b = new JButton();
b.setText("Button-Fläche");
b.setBounds(0, 100, 200, 50);
getContentPane().add(b);
}
• übersichtlich
• leicht austauschbar
• Komponente ist verantwortlich für ihre "Kinder"
(z.B. Anordnung und Größe aller Kinder bestimmen)
• Beispiel: Komponenten-Baum für die EinfachesGUI (vereinfacht)
EinfacheGUI
ContentPane
public static void main (String args[]){
EinfachesGUI oberflaeche = new EinfachesGUI();
oberflaeche.setVisible(true);
}
l (JLabel)
}
Java-Praxiskurs
17
Lehrstuhl für Angewandte Telematik/e-Business
Java-Praxiskurs
...
b (JButton)
18
3
31.03.2004
JPanels bei der Bankautomaten-GUI
Strukturieren von Fenstern
• Ziel: Fenster aus kleineren Gruppen zusammensetzen
• Übersichtliche Gestaltung
• Wiederverwendung: Code wird nicht mehrmals geschrieben
• Lösung: Container (für Komponenten)
• Beispiel eines Containers: JPanel
• Container mit Zeichenfläche
• fasst Komponenten zusammen zu einer Einheit
• ordnet diese in seinem Zeichenbereich an
Java-Praxiskurs
19
Beispiel: JPanel für PIN-Eingabe
Java-Praxiskurs
20
Beispiel: JPanel für PIN-Eingabe
import javax.swing.*;
import java.awt.*;
public static void main (String[] args) {
JFrame f = new JFrame();
f.setBounds(0, 0, 300, 70);
public class PINPanel extends JPanel {
PINPanel p = new PINPanel();
public PINPanel() {
setLayout(null);
f.getContentPane().add(p);
f.setVisible(true);
JLabel pinLabel = new JLabel();
pinLabel.setText("PIN");
pinLabel.setBounds(10,5,50,20);
add(pinLabel);
}
}
Das JFrame:
JPasswordField pinField = new JPasswordField();
pinField.setBounds(100, 5, 150, 20);
add(pinField);
}
Java-Praxiskurs
21
Java-Praxiskurs
22
Weitere Container
Container: Dialogfenster
Es gibt weitere Container in Swing:
• Toplevel-Container:
• Aufteilung des Dialogfensters
• JFrame
• JApplet
• JDialog
Fenster mit Rahmen, Titelzeile mit Buttons
Fenster für Darstellung im Web-Browser
kurzzeitig erscheinendes Fenster, um Mitteilungen
an den Benutzer und Reaktionen des Benutzers
abzufragen
• Icon
• Text-Botschaft
• Knopf-Leiste
• abhängig
• gehört zu einem Toplevel-Container,
• der nach Dialogende aktiviert wird
• Allgemeine Container (Auswahl)
• Arten von Dialogen:
JScrollPane
Java-Praxiskurs
JSplitPane
•
•
•
•
JTabbedPane
23
Lehrstuhl für Angewandte Telematik/e-Business
Bestätigungs-Dialoge
Eingabe-Dialoge
Nachricht-Dialoge
Auswahl-Dialoge
Java-Praxiskurs
Frage mit Ja/Nein/Abbruch
Text, Eingabefeld und "Ok"
Text und "Ok"
Text mit frei beschrifteten Knöpfen
24
4
31.03.2004
Container: Dialogfenster
Vererbung bei Containern
• Vordefinierte Fenster werden durch JOptionPane zur
Verfügung gestellt
• Ziel:
Alle Container sollen dieselben grundlegende
Fähigkeiten für Container-Verwaltung besitzen
• Lösung:
Benutze Vererbung!
// das Fenster, das am Dialogende aktiviert wird
JFrame f = new JFrame();
JOptionPane.showConfirmDialog( f,
"Möchten Sie wirklich alle Daten löschen?",
"Warnung",
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.WARNING_MESSAGE);
• Alle Container erben von einer Klasse java.awt.Container:
• Hinzufügen und Entfernen von Komponenten
• Anordnen der Komponenten auf der Zeichenfläche
(Layout-Management)
Java-Praxiskurs
25
Vererbungshierarchie Container
Java-Praxiskurs
Vererbung bei Komponenten
• Ziel:
java.lang.Object
java.awt
26
java.awt.Component
gleiche Fähigkeiten für alle Swing-Komponenten
bereitstellen, dabei Code wiederverwenden
• Lösung: Benutze Vererbung!
java.awt.Container
• Alle Swing-Komponenten erben von einer Klasse JComponent:
java.awt.Window
java.awt.Panel
java.awt.Frame
java.awt.Dialog
java.awt.Window
JFrame
JDialog
JWindow
• Behandlung von Tastatureingaben
• Rahmen
• Accessibility, Lokalisation (Datum, Währung,...), Tooltips
java.applet.Applet
JApplet
JComponent
• Analog können neue, eigene Klassen von beliebigen SwingKomponenten erben und diese ebenfalls um neue Fähigkeiten
erweitern
javax.swing
Java-Praxiskurs
27
javax.swing.JComponent
• leichtgewichtig
• vererbt an alle Komponenten:
• (z.B. frei wählbares Look&Feel)
• Ziel:
java.lang.Object
java.awt.Component
java.awt.Container
• Lösung:
Neue Klassen von bestehenden
Swing-Komponenten ableiten und
neue Fähigkeiten hinzufügen:
z.B. neuer Schaltknopf
Benutze Vererbung!
javax.swing.JComponent
public class MeinEigenerButton
extends JButton{
...
}
• ist ein Container und kann
damit andere Komponenten enthalten.
java.lang.Object
java.awt.Component
java.awt.Container
javax.swing.JComponent
javax.swing.AbstractButton
javax.swing.JButton
MeinEigenerButton
MeinEigenerButton b = new MeinEigenerButton();
• in der Enthaltensein-Hierarchie stets
unterhalb eines Toplevel-Container
(benutzt dessen Zeichenfläche)
Java-Praxiskurs
28
Erweitern von Swing-Komponenten
• Mutter (fast) aller GUI-Klassen
• Ausnahme: Toplevel-Container
Java-Praxiskurs
29
Lehrstuhl für Angewandte Telematik/e-Business
Java-Praxiskurs
30
5
31.03.2004
YOU ARE HERE
Layout-Management
•
•
•
•
•
•
•
•
•
• Ziel:
Einführung
Objektorientierte Modellierung
Java-Sprachkonstrukte
Java-Klassenbibliothek
Zeichenketten
Dateien und Streams
Datenstrukturen
Networking
Grafische Benutzungsoberflächen
• Idee 1: Angabe von festen Layout-Koordinaten für jeden
Bestandteil
• Nachteil: unflexibel, aufwändig, nicht nachträglich änderbar
• Idee 2: Komponente „layoutet“ sich selbst.
• Es gibt mehrere Layout-Strategien, die Komponenten selbstständig
in einer Zeichenfläche anordnen:
• FlowLayout, GridLayout, BoxLayout,
CardLayout, BorderLayout,
GridBagLayout
• Layout-Strategie auswählen:
eineKomponente.setLayout(new FlowLayout());
• Komponenten und Container
Layout-Management
• Pluggable Look & Feel
• MVC-Paradigma
• Event Handling
• Menüs
• Extensible Markup Language
Java-Praxiskurs
Anordnen von Komponenten in einer anderen
Komponente (Größe, Position festlegen)
31
Java-Praxiskurs
FlowLayout und GridLayout
Beispiel: FlowLayout
• FlowLayout (Fluss)
import java.awt.*;
import javax.swing.*;
public class FlowWindow extends JFrame {
public FlowWindow() {
JButton b1= new JButton ("Button 1");
JButton b2= new JButton ("Button 2");
...
setLayout(new FlowLayout());
add(b1);
add(b2);
...
}
...
• Komponenten von links nach rechts
• Zeilenumbruch am Zeilenende
• Default für JPanel
• GridLayout (Gitter)
• Alle Komponenten bekommen
gleiche Größe
• Platzierung durch Angeben von
Zeile und Spalte
32
public static void main(String args[]) {
FlowWindow w = new FlowWindow();
w.setSize(300,300);
w.setVisible(true);
}
}
Java-Praxiskurs
33
Java-Praxiskurs
BoxLayout und CardLayout
BorderLayout und GridBagLayout
• BoxLayout (Kiste)
• BorderLayout (zuerst die Grenzen)
• Hängt Komponenten in 1 Spalte
untereinander
• zuerst 4 Komponenten innen an die
Kanten fügen, zuletzt die verbliebene
Zentralfläche mit 1 Komponente
ausfüllen
• Orte: Nord, Süd, Ost, West, Zentrum
• CardLayout (Spielkarte)
• GridBagLayout
• Komponenten liegen
als „Spielkartenstapel“
• Nur die oberste „Karte“ sichtbar
• Zugriff auf oberste, unterste,
folgende, vorherige Karte
Java-Praxiskurs
34
• in Gitter anordnen, aber Größe
für jede Komponente frei wählbar
• Plazierung durch Angeben
der Zeile und Spalte
• mehrere Gitterplätze belegbar
35
Lehrstuhl für Angewandte Telematik/e-Business
Java-Praxiskurs
36
6
31.03.2004
Auswahl eines Layout-Managers
Weitere Layout-Möglichkeiten
• Viel Platz für jede einzelne Komponente
• keinen Layout-Manager benutzen
• BorderLayout, GridBagLayout
eineKomponente.setLayout(null);
• im Zentrum liegt größte Komponente
absolute Positionierung durch Angabe der PositionsKoordinaten (x/y) sowie Breite und Höhe für jede
einzelne Komponente
• Wenige Komponenten aufgereiht
• FlowLayout, BoxLayout
JRadioButton rb = new JRadioButton();
rb.setText("zahle aus");
rb.setBounds(5,26,113,26);
// (x,y, breite, höhe)
• Wenige Komponenten gleicher Größe
• GridLayout
• Viele Komponenten mit komplexem Layout
•
• GridBagLayout
Java-Praxiskurs
37
YOU ARE HERE
•
•
•
•
•
•
•
•
•
eigenen Layout-Manager schreiben (☺)
Java-Praxiskurs
38
Die verfügbaren Look&Feels
Einführung
Objektorientierte Modellierung
Java-Sprachkonstrukte
Java-Klassenbibliothek
Zeichenketten
Dateien und Streams
Datenstrukturen
Networking
Grafische Benutzungsoberflächen
• Java (Metal)
• Windows
• Komponenten und Container
• Layout-Management
Pluggable Look & Feel
• MVC-Paradigma
• Event Handling
• Menüs
• CDE, OSF/Motif
(Common Desktop Environment)
• Extensible Markup Language
Java-Praxiskurs
39
Java-Praxiskurs
40
Look & Feel Detail
Look & Feel Detail
• Jede Klasse „J...“ hat in javax.swing.plaf eine
Klasse „...UI“ (Delegate)
•
• z.B. die Klasse „JButton“ durch „ButtonUI“.
• Ausnahme: Toplevel-Container (JFrame etc.) haben stets WindowsLook&Feel, weil sie schwergewichtig sind
• Delegate kennt für alle Look&Feels, in denen die Klasse
gezeichnet werden kann, die konkreten API‘s
Setzen über UIManager.setLookAndFeel(...)
•
•
•
"com.sun.java.swing.plaf.motif.MotifLookAndFeel"
• Motif-Look & Feel
"com.sun.java.swing.plaf.windows.WindowsLookAndFeel"
• Windows-Look & Feel
"javax.swing.plaf.metal.MetalLookAndFeel"
•
• In jedem API ist eine Klasse bereitgestellt, mit der sich die sichtbare
Klasse zeichnen kann.
z.B. „MetalButton“, „WindowsButton“, etc.
•
•
• Zeichnen
Java-Look & Feel
UIManager.getSystemLookAndFeelClassName()
• System-Look & Feel (z.B. Windows)
UIManager.getCrossPlatformLookAndFeelClassName()
•
Cross-Platform-Look & Feel (i.A. Metal)
• Für ein Objekt holt man beim UI-Manager den Delegate. Von diesem
Delegate kann für das aktuell verwendete Look&Feel zu der Klasse
verzweigt werden, die für das Zeichnen in diesem Look&Feel sorgt.
Java-Praxiskurs
41
Lehrstuhl für Angewandte Telematik/e-Business
Java-Praxiskurs
42
7
31.03.2004
Look & Feel Detail
• Ganz nobel wird‘s jetzt:
• Mittels setDefaultLookAndFeelDecorated(...) können
zusätzliche Dekorationen erzeugt werden.
• Muss für die zu dekorierenden Klassen aufgerufen werden, also
• JFrame.setDefaultLookAndFeelDecorated(true);
• JDialog.setDefaultLookAndFeelDecorated(true);
Java-Praxiskurs
43
Lehrstuhl für Angewandte Telematik/e-Business
8
Herunterladen