GUI Programmierung in Java – Teil 2

Werbung
Java
Programmierung mit
Swing
> GUI Programmierung
in Java – Teil 2
Mark Egloff 2006
1
Java
Programmierung mit
Lernziel Heute Abend
>
Sie lernen eine 2. Library für die GUI Erstellung kennen
>
Sie kennen die Begriffe „JFC“, „SWING“ und „MVC“ und
können diese auch erklären
>
Sie erstellen eigene Oberflächen
Mark Egloff 2006
2
Java
Programmierung mit
Swing
> Let‘s Swing
Mark Egloff 2006
3
Java
Programmierung mit
Swing
Was ist „Swing“?
>
Swing steht zum einen für ein rhythmisch-dynamisches Phänomen und
eines der Grundelemente des Jazz. Durch die minimale Verschiebung der
Betonungen innerhalb des Taktes vom Puls (den vier Taktschlägen oder
Beats) weg entsteht ein "federnder", als "Swing-Feeling" bezeichneter
Rhythmuseindruck, der für die Musikrichtung des Jazz charakteristisch ist.
(siehe Swing (Rhythmus))
>
Bei Swing handelt es sich um eine Java API zum Programmieren von
grafischen Benutzeroberflächen. Seit Java-Version 1.2 (1998) ist es
Bestandteil der Java-Runtime. Swing gehört zu den „Java Foundation
Classes (JFC)“. Swing baut auf dem älteren AWT auf und ist mit den
anderen APIs verwoben.
Mark Egloff 2006
4
Java
Programmierung mit
Swing
Warum „Swing“ wenn es „AWT“ gibt?
>
Obwohl das „Abstract Window Toolkit“ das Problem einer einheitlichen
Benutzeroberfläche lösen sollte, ist dies bei Sun nicht ganz gelungen. Das
AWT war von Anfang an „zusammengepfuscht“.
>
Das AWT wurde damals in ca. 6 Wochen erstellt und dann als Folge
nachträglich umgebaut. Von AWT 1.0 auf AWT 1.1 fanden erhebliche
Einbüssungen in der Rückwärts-Kompatibilität statt.
>
SUN hatte das AWT einfach gehaltenund nur auf die wesentlichsten GUI
Elemente beschränkt. Dies gefiel den GUI Entwicklern gar nicht.
>
Darauf hin konzipierte Netscape kurzerhand die „Internet Foundation
Classes (IFC)“, die das AWT in wesentlichen Punkten ergänzten. Auch
Microsoft mischt in Form von Erweiterungen mit. Microsoft bot die
„Application Foundation Class (AFC)“ an.
Mark Egloff 2006
5
Java
Programmierung mit
Swing
Warum „Swing“ wenn es „AWT“ gibt?
>
Im April des Jahres 1997 haben sich Sun, Netscape und IBM auf eine GUIBibliothek geeinigt, die auf Netscapes IFC aufbaut und das AWT in der
Java-Version 1.2 erweitert. Der Name des Toolkits wude JFC (Java
Foundation Classes) genannt.
>
Als 1997 in San Francisco auf der JavaOne die neuen JFC-Komponenten
vorgestellt wurden, entschied sich Georges Saab, ein Mitglied des JFCTeams, für Musik parallel zur Präsentation, und zwar Swing-Musik, weil der
Entwickler glaubte, dass sie wieder in Mode käme. Dementsprechend
wurden die neuen grafischen Elemente in einem Paket namens Swing
abgelegt. Obwohl der Name offiziell dem Kürzel JFC weichen musste, war
er doch so populär, dass er bestehen blieb.
Mark Egloff 2006
6
Java
Programmierung mit
Swing
Java Foundation Classes
>
Die JFC besteht im Wesentlichen aus:
> Swing-GUI-Komponenten
> Pluggable Look&Feel
AWT
Java2D
> Accessibility
Drag&Drop
> Java 2D-API
Look & Feel
Swing
> Drag&Drop
Accessibility
JFC (ab Java 1.2)
>
Das AWT wird heute als Subgruppe von JFC angesehen.
Mark Egloff 2006
7
Java
Programmierung mit
Swing
Unterschiede „Swing“ zu „AWT“ ?
Das „Heavyweight“ Peer-Prinzip bei AWT
>
Die ursprüngliche AWT-Implementierung benötigt so genannte PeerKlassen, die als native Funktionen auf der speziellen Benutzeroberfläche
implementiert sind. Eine Schaltfläche unter AWT kennt dann einen Partner
auf der Betriebssystemseite, der die Visualisierung vornimmt.
Button
JVM
Betriebssystem
„Heavy“
Mark Egloff 2006
8
Java
Programmierung mit
Swing
Unterschiede „Swing“ zu „AWT“ ?
>
Die Lösung der AWT „Peer“ Variante hat seine Vor und Nachteile
+ Der Vorteil besteht darin, dass durch die nativen Peer-Klassen die
Oberfläche schnell wird und der Speicherverbrauch sich im Rahmen
hält.
-
Leider zeigen die Programme unter den verschiedenen
Betriebssystemen bisweilen merkwürdige Seiteneffekte. So kann ein
Textfeld unter Windows weniger als 64K Zeichen aufnehmen, bei
anderen Oberflächen ist dies egal.
-
Da das AWT auch nur Komponenten anbietet, die auf jeder Plattform
verfügbar sind, ist das Angebot an Widgets sehr beschränkt. Moderne
grafische Elemente, sei es auch nur ein Icon auf einer Schaltfläche,
sind vom AWT nicht vorgesehen.
Mark Egloff 2006
9
Java
Programmierung mit
Swing
Unterschiede „Swing“ zu „AWT“ ?
Das „Lightweight“ Peer-Prinzip bei Swing
>
Swing verwendet für seine GUI Elemente keine Peer Klasse. Swing benützt
lediglich ein Peer für das Grundfenster. Alle anderen Elemente werden
dann mittels Zeichenoperationen auf die Oberfläche „aufgemalt“.
JVM
Betriebssystem
JFrame
win
Mark Egloff 2006
JButton
MAC
10
Java
Programmierung mit
Swing
Unterschiede „Swing“ zu „AWT“ ?
Das „Lightweight“ Peer-Prinzip bei Swing
>
Auch diese Lösung hat natürlich seine Vor- und Nachteile:
+ Diese Lösung ist „vollständig“ in Java und somit
plattformunabhängiger
+ Eine Leichtgewicht-Komponente kann durchsichtig sein und muss
nicht mehr in einen rechteckigen Bereich passen. Da alle
Komponenten nun gemalt werden, lässt sich alles ohne Rücksicht auf
das unterliegende grafische System zeichnen
-
Leider aber auch langsamer. Alle Komponenten werden mit primitiven
Zeichenoperationen gemalt, so etwa eine Schaltfläche aus einem
Rechteck mit Schatten und einem Text in der Mitte.
Mark Egloff 2006
11
Java
Programmierung mit
Swing
Unterschiede „Swing“ zu „AWT“ ?
Das „Lightweight“ Peer-Prinzip bei Swing
>
Andere Unterscheide bzw. Gemeinsamkeiten bei Swing zu AWT sind
> Swing bietet eine sehr umfangreiche Auswahl an GUI Elementen an
welche es in AWT nicht gibt z.B. Trees, Tabellen, Bars, Regler etc.
Dazu kommen noch fertige Dialoge wie FileChooser, ColorChoser,
Message-Dialoge etc.
> Swing verwendet für die Eventbehandlung das genau gleiche Prinzip
und somit die genau gleichen Klassen wie das AWT
> Im Vergleich zu AWT hat man mit Swing folgende zusätzliche
Möglichkeiten, Tastenkombinationen zur Steuerung von
Komponenten, Drag & Drop, Setzen des Look and Feels, Tooltips,
automatisches Double Buffering, andere Layout-Manager/Panels
Mark Egloff 2006
12
Java
Programmierung mit
Swing
Unterschiede „Swing“ zu „AWT“ ?
Die „ungesunde“ Mischung – Swing & AWT gleichzeitig
>
Zwar können Swing und AWT gleichzeitig in einer Appliaktion genutzt
werden. Jedoch kann es zu so genannten „Clipping“ Problemen kommen
Heavyweight Komponenten sind direkt mit dem Betriebsystem
verknüpft und können nicht mit Swing kombiniert werden. Swing
Operationen bzw. Flächen werden von AWT Komponenten ignoriert

z.B. Clipping Probleme
Mark Egloff 2006
13
Java
Programmierung mit
Swing
Swing Set Demo
C:\jdk1.5.0_06\demo\jfc\SwingSet2\SwingSet2.html
Mark Egloff 2006
14
Java
Programmierung mit
Swing
Aufbau der „Swing“ Library
>
Die Swing-API besteht in Java aus ca.20 Packages. Alle Packages sind in
einer Hierarchie namens „javax.xxxx“ untergebracht.
>
Swing ist in Java 1.2 in folgende Pakete eingeteilt.
>
javax.accessibility enthält Klassen um Java-Anwendungen auch auf
anderen Geräten und anderen Ein- und Ausgabemedien verfügbar zu machen.
>
javax.swing ist eigentlich das wichtigste Paket und enthält alle Klassen, um
grafische Benutzerelemente zu erstellen.
>
javax.swing.border bietet Klassen an, mit denen spezielle Rahmen um
grafische Benutzerelemente gezeichnet werden können.
>
javax.swing.colorchooser wird benötigt, wenn Sie die Klasse
javax.swing.JColorChooser einsetzen wollen, um dem Anwender ein
Schaltelement zu präsentieren, das die Auswahl einer Farbe ermöglicht.
Mark Egloff 2006
15
Java
Programmierung mit
Swing
Aufbau der „Swing“ Library
>
Swing ist in Java 1.2 in folgende Pakete eingeteilt (Fortsetzung…)
>
javax.swing.event dieses Paket stellt genaugenommen lediglich eine
Erweiterung der Klassen aus java.awt.event dar, da auch die Interfaces und
Klassen aus jenem Paket für Swing-Elemente verwendet werden.
>
javax.swing.filechooser enthält Klassen, die vom Steuerelement
javax.swing.JFileChooser benötigt werden.
>
javax.swing.plaf bietet eine Auswahl verschiedener Klassen an, über die
jeweils das Look-and-Feel einer Java-Anwendung gezielt eingestellt werden
kann.
>
javax.swing.plaf.basic enthält Klassen, um grundlegende Funktionen
für ein Look-and-Feel zu unterstützen.
>
javax.swing.plaf.metal ist verantwortlich für das Standard-Look-andFeel von Java. javax.swing.plaf.multi bietet die Möglichkeit, verschiedenartige
Look-and-Feels zu kombinieren.
Mark Egloff 2006
16
Java
Programmierung mit
Swing
Aufbau der „Swing“ Library
>
>
Swing ist in Java 1.2 in folgende Pakete eingeteilt (Fortsetzung…)
>
javax.swing.table wird nur dann benötigt, wenn Sie das Steuerelement
javax.swing.JTable verwenden wollen, um eine Tabelle anzuzeigen.
>
javax.swing.text enthält Code zur Unterstützung von TextEingabefeldern.
>
javax.swing.text.html enthält Code zur Unterstützung spezieller HTMLEingabefelder.
>
javax.swing.tree benötigen Sie nur dann, wenn Sie das Steuerelement
javax.swing.JTree einsetzen möchten, um eine hierarchische Aufzählung
anzuzeigen.
>
javax.swing.undo enthält Code, um Undo- und Redo-Funktionen in JavaAnwendungen einfach zu entwickeln.
Seit der Java Version 1.4.2 gibt es zwei weitere Packages namens
javax.swing.html.parser und javax.swing.text.rtf.
Mark Egloff 2006
17
Java
Programmierung mit
Swing
Aufbau der „Swing“ Library
Von AWT zu Swing
>
Eine Umstellung von AWT auf Swing ist für den Programmierer einfach
gehalten. Für jede AWT Klasse gibt es eine entsprechende Swing Klasse
>
Alle Swing Klassen beginnen mit einem „Jxxxx“ und somit lassen sich die
entsprechenden Klassennamen von AWT zu Swing einfach herleiten
z.B.
>
java.awt.Frame
 javax.swing.JFrame
>
java.awt.Panel
 javax.swing.JPanel
>
java.awt.Button
 javax.swing.JButton
>
java.awt.Label
 javax.swing.JLabel
>
java.awt.TextField  javax.swing.JTextField
>
java.awt.TextArea
 javax.swing.JTextArea
>
...
 ...
Mark Egloff 2006
18
Java
Programmierung mit
Swing
Aufbau der „Swing“ Library
AWT  Swing Beispiel: Body Mass Index
AWT Applikation
Swing Applikation
Mark Egloff 2006
19
Java
Programmierung mit
Swing
Aufbau der „Swing“ Library
AWT  Swing Beispiel: Body Mass Index (1/2)
AWT Applikation
Swing Applikation
class BMIAWTFrame extends Frame
implements ActionListener
{
Label labelResult;
TextField textSize, textWeight;
public BMIAWTFrame()
{
setTitle("BMI - AWT Frame");
setSize(400, 120);
setLayout(new GridLayout(3, 2));
add(new Label("Körpergröße cm:"));
textSize = new TextField();
add(textSize);
...
class BMISwingFrame extends JFrame
implements ActionListener
{
JLabel labelResult;
JTextField textSize, textWeight;
public BMISwingFrame ()
{
setTitle("BMI - Swing Frame");
setSize(400, 120);
setLayout(new GridLayout(3, 2));
add(new JLabel("Körpergröße cm:"));
textSize = new JTextField();
add(textSize);
...
Mark Egloff 2006
20
Java
Programmierung mit
Swing
Aufbau der „Swing“ Library
AWT  Swing Beispiel: Body Mass Index (2/2)
AWT Applikation
Swing Applikation
...
add(new JLabel("Gewicht in kg:"));
textWeight = new JTextField();
add(textWeight);
labelResult = new JLabel();
add(labelResult);
Button ok = new JButton("OK");
ok.addActionListener(this);
add(ok);
setVisible(true);
}
public void actionPerformed(…){…}
public void actionPerformed(…){…}
}
...
add(new Label("Gewicht in kg:"));
textWeight = new TextField();
add(textWeight);
labelResult = new Label();
add(labelResult);
Button ok = new Button("OK");
ok.addActionListener(this);
add(ok);
setVisible(true);
}
}
Mark Egloff 2006
21
Java
Programmierung mit
Swing
Aufbau der „Swing“ - Library
Grundlegendes Klassendiagramm „Swing“
Mark Egloff 2006
22
Java
Programmierung mit
Swing
Die Basisklasse „javax.swing.JComponent“
>
Die Klasse „java.awt.Component“ bildet die Basisklasse der Objekte,
die als grafische AWT-Komponenten auf den Schirm kommen.
>
Diese wird nun für Swing-Komponenten noch einmal zu
„javax.swing.JComponent“ erweitert und bildet die Basisklasse für
sämtliche Swing Interaktions Elemente.
>
Allerdings leitet „JComponent“ nicht direkt von „Component“ ab, sondern
erst von „java.awt.Container“ (und Container dann direkt von
Component). Dies hat zur Konsequenz, dass jede „JComponent“
automatisch auch ein Container ist.
Component
AWT
Container
JComponent
JButton
Button
Mark Egloff 2006
Swing
23
Java
Programmierung mit
Swing
Aufbau der „Swing“ - Library
Grundlegende „Container“ Klassen bei „Swing“
>
Bei Swing wurden die Haupt-Cotainer Klassen nicht gross geändert, so
existieren die entsprechende Klassen „JFrame“, „JWindow“ und
„JDialog“.
Mark Egloff 2006
24
Java
Programmierung mit
Swing
Aufbau der „Swing“ - Library
Die „neuen“ LayoutManager bei Swing (1/2)
>
Bei den LayoutManagern gab es einige Neuerungen. So kamen Manager
speziell für das Verwalten der Scrollbereiche sowie 2 neue für die grafische
Unterteilungen hinzu
Mark Egloff 2006
25
Java
Programmierung mit
Swing
Aufbau der „Swing“ - Library
Die „neuen“ LayoutManager bei Swing (2/2) – Beispiel BoxLayout
z.B. GridLayout – gleichmässige Gittereinteilung
setLayout(new GridLayout(1,3));
add(new JLabel("Left"));
add(new JTextField("Middle"));
add(new JButton("Right"));
setSize(150, 220);
setVisible(true);
z.B. BoxLayout – angepasste Gittereinteilung
setLayout( new BoxLayout(
getContentPane(),
BoxLayout.X_AXIS));
add(new JLabel("Left"));
add(new JTextField("Middle"));
add(new JButton("Right"));
setSize(150, 220);
setVisible(true);
Mark Egloff 2006
26
Java
Programmierung mit
Swing
Aufbau einer „Swing“ - Komponente
Das „MVC“ Konzept
>
Bei Swing wurde nebst des Lightweigth Konzeptes eine weitere
bedeutungsvolle Eigenschaft geschaffen. Jede Swing Komponente baut
auf einem vereinfachtem „MVC“ Konzept auf.
>
„MVC“ steht für „Model View Controller“. „MVC“ ist ein Architekturmuster
zur Aufteilung von Softwaresystemen in das drei Einheiten Datenmodell
(engl. Model), Präsentation (engl. View) und Programmsteuerung (engl.
Controller).
>
Das „MVC“ Pattern baut auf dem „Observer“ Designpattern auf und benutzt
daher dieselben Konzepte der Registrierung und Benachrichtigung
>
Controller
>
Model
>
View
 Verwaltet Subjekt und Beobachter
 Subjekt (Observable)
 Beobachter (Observer)
Mark Egloff 2006
27
Java
Programmierung mit
Swing
Aufbau einer „Swing“ - Komponente
Das „MVC“ Konzept
1.
View
Controller
update()
action()
Model
3.
change()
register()
notify()
2.
Kollaborationsdiagramm
Klassendiagramm
Mark Egloff 2006
28
Java
Programmierung mit
Swing
Aufbau einer „Swing“ - Komponente
Das „MVC“ Konzept
>
Bei Swing wurde das MVC vereinfacht. Hierbei wurde der „Controller“ und
die „View“ zu einem Teil „UI-Delegate“ zusammengefasst. Mit anderen
Worten eine Swing Komponente besteht aus dem „Model“ und dem
„Delegator“ der die Daten verwaltet.
Mark Egloff 2006
29
Java
Programmierung mit
Swing
Aufbau einer „Swing“ - Komponente
Das „MVC“ Konzept
>
Dieses Model/Delegate Konzept wird bei folgenden Elementen angewandt:
Model
Swing Klasse, die dieses Model nutzt
ListModel
JList
ComboBoxModel
JComboBox
ButtonModel
JButton, JToggleButton, JCheckBox, JRadioButton, JMenu,
JMenuItem, JCheckBoxMenuItem, JRadioButtonMenuItem
Document
JTextField, JPasswordField, JTextArea, JEditorPane, JTextPane
BoundedRangeModel
JProgressBar, JScrollBar, JSlider
SingleSelectionModel
JMenuBar, JPopupMenu, JTabbedPane
TableModel
JTable
TableColumnModel
JTable
TreeModel
JTree
TreeSelectionModel
JTree
Mark Egloff 2006
30
Java
Programmierung mit
Swing
Aufbau einer „Swing“ - Komponente
Beispiel Model / UI-Delegate bei „javax.swing.JTree“
>
Das „Model/UI-Delegate“ haben wir schon beim Beispiel JTree
angewendet (siehe Lektion 10  Baumstrukturen).
>
Dort werden die Daten zuerst mittels Hilfsklassen in eine Baumstruktur
gebracht und dann der eigentliche GUI Komponente zugefügt
UI / Delegate:
JTree
Model:
DefaultTreeModel
Mark Egloff 2006
31
Java
Programmierung mit
Swing
Aufbau einer „Swing“ - Komponente
Beispiel Model / UI-Delegate bei „javax.swing.JTree“
JTree
UI /
Delegate
:
setModel()
getModel()
<<Interface>>
TreeModel
childs
0..*
DefaultTreeModel
<<Data>>
Object
<<Interface>>
TreeNode
DefaultMutable
TreeNode
Model
String
Mark Egloff 2006
32
Java
Programmierung mit
Swing
Aufbau einer „Swing“ - Komponente
Beispiel Model / UI-Delegate bei „javax.swing.JTree“
Erstellen des „TreeModel“
// Wurzel des Baumes erstellen
DefaultMutableTreeNode root =
new DefaultMutableTreeNode("The Java Series");
// Erste Kategorie
DefaultMutableTreeNode category =
new DefaultMutableTreeNode("Beginner Level");
root.add(category);
// Erstes Buch der Kategorie hinzufügen
DefaultMutableTreeNode book =
new DefaultMutableTreeNode(
new Book("The Java Tutorial ..."));
category.add(book);
// Model erstellen und Baum hinzufügen
DefaultTreeModel model = new DefaultTreeModel(root);
Mark Egloff 2006
33
Java
Programmierung mit
Swing
Aufbau einer „Swing“ - Komponente
Beispiel Model / UI-Delegate bei „javax.swing.JTree“
„TreeModel“ der GUI Komponente zuweisen
...
// GUI Element erstellen
JTree tree = new JTree();
// Modell zuweisen
tree.setModel(model);
GUI
Model
DefaultMutableTreeNode
DefaultMutableTreeNode
DefaultMutableTreeNode
tree
model
root
category
book
Mark Egloff 2006
„The Java Series“
String
„Beginner Level“
String
„The Java Tutorial“
Book
34
Herunterladen