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