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