Fortgeschrittene Objektorientierung



Ähnliche Dokumente
GUI Programmierung mit JAVA Swing

Zentrale Objekte zur Programmierung graphischer Benutzeroberflächen (GUI)

Objektorientierte Programmierung

Objektorientierte Software-Entwicklung

Swing Lernen am Code Teil 1

Java I Vorlesung 11 Graphische Oberflächen mit Swing

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 7. Grafische Benutzeroberflächen

NTB Druckdatum:

GUI Programmierung in Java

Abteilung Informatik, JFC/Swing 2004 Diego Schmidlin V2.2

2A Basistechniken: Weitere Aufgaben

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik GUI-Programmierung mit Swing

AK-Automatisierungs und Kommunikationstechnik TI Technische Informatik. NWT Netzwerktechnik

Objektorientierte Softwareentwicklung

Einstieg in die Informatik mit Java

Grundlagen der Programmierung APPLETS

Grafische Benutzeroberflächen mit Swing

GRAFISCHE BENUTZERSCHNITTSTELLEN

DHBW Karlsruhe, Vorlesung Programmieren, Events Musterlösung

Institut für Programmierung und Reaktive Systeme. GUIs mit Swing. Markus Reschke

JButton, JCheckBox, JRadioButton. Programmieren II. Vorlesung 7. Handout S. 1. Dr. Klaus Höppner. Hochschule Darmstadt Sommersemester 2009.

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 15/16. Kapitel 7. Grafische Benutzeroberflächen 1

Funktionale und Objekt-Orientierte Programmierkonzepte

Programmiertechnik GUI Programmierung mit Java Swing

Graphische Benutzungsoberflächen

Tutorial04: Swing: Erstellen eines JFrames mit einem JSplitPane

Einführung in Swing. Graphical User Interface

Hochschule der Medien Prof. Uwe Schulz 14. Juli 2010 Klausur Informatik, EDV-Nr Seite 1 von 5. Teil 2: Aufgaben

Java für Computerlinguisten

...erinnern Sie sich? oopjs4b / kwhbkd4r

Kap. 35 Swing: Grundlagen Kap Swing: Hauptfenster

Abteilung Informatik, JFC/Swing 2004 Diego Schmidlin V2.2

Einführung in die Programmierung für NF. Grafische Benutzeroberflächen

Ist eine Softwarekomponente, die dem Benutzer eines Computers die Interaktion mit der Maschine über grafische Symbole erlaubt

Vorlesung Programmieren. Bisher... Apple Lisa Office System 3.1. GUIs mit Java

Ziel dieses Kapitels: Einführung in die Grundzüge der Programmierung graphischer Benutzeroberflächen (engl.: "graphical user interface", GUI) in Java

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI

Programmieren II. Java im Vergleich zu anderen Sprachen. Einführung: GUI. Einführung: Grafische Benutzeroberflächen. Dr.

GUIs in Java und ihre Programmierung

04 - Actions. Actions

GUI-Programmierung in Java

Swing :Komponenten I (Teil 2)

Praktikum. SEP: Java-Programmierung SS JAVA Swing. Thomas Bunk und Karlheinz Friedberger

Java Game Development Fabian Birzele Programmierpraktikum 2008 / 2009

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Techniken der Projektentwicklung

Java Lab 2006/12/13 Client

Benutzeroberflächen. Java Teil 4

Programmierkurs Java

Vorlesung Programmieren

Software-Engineering und Optimierungsanwendungen in der Thermodynamik

Einführung: Grafische Benutzeroberflächen. Programmieren II. Dr. Klaus Höppner. Hochschule Darmstadt Sommersemester / 22

Javakurs für Fortgeschrittene

EAD II Übung 5. Graphische Benutzungsoberfläche mit BlueJ

Java Projekt: Tic Tac Toe + GUI

ProgWerkstatt 7. Dezember 2006 Tipps & Tricks. GUI Programmierung

Design Patterns 2. Model-View-Controller in der Praxis

CS1005 Objektorientierte Programmierung Bachelor of Science (Informatik)

Swing oder AWT? Was ist das: Swing bzw. AWT. Haupterkennungsmerkmal von Swing Source-Code:

J.1. J.1 GUI-Programmierung in in Java Prof. Dr. Rainer Manthey Informatik II 1

Grafische Benutzeroberflächen

Abteilung Informatik, JFC/Swing 2004 Diego Schmidlin V2.2

Institut für Informatik

Einführung in GUI-Programmierung. javax.swing

Objektorientierte Programmierung

Graphical User Interfaces

Einführung in die Programmierung

Schritt 1 - Ein Spielfeld

Ereignisbehandlung 21

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

11. GUI-Programmierung mit SWING Überblick

5. Tutorium zu Programmieren

Applets. Applets. Applets. Applet: Java-Programm Eingebettet in einer HTML-Seite Ausführung von einem Java-fähigen Web-Browser oder sog.

GUI-Programmierung. Teil I. Unterlagen zum Modul OOP mit Java V by MOU2/BFH-TI. Berner Fachhochschule Technik und Informatik

16 Zeichnen in Swing-Komponenten , Prof. Dr. D. Ratz

Delegatesund Ereignisse

jcontentpane.setlayout(new BorderLayout()); // unten JPanel unten = new JPanel(); unten.setlayout( new BoxLayout(unten, BoxLayout.

Softwaretechnik (Medieninformatik): GUIs mit Swing Überblick

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

Grundlagen der Programmierung (GP) Prof. Dr. H. Schlingloff Joachim Hänsel

Universität Paderborn Prof. Dr. Stefan Böttcher. Kapitel 3: Java Applets

2. ERSTELLEN VON APPS MIT DEM ADT PLUGIN VON ECLIPSE

Einführung in die Programmierung für NF. Übung

Java Einführung Umsetzung von Beziehungen zwischen Klassen. Kapitel 7

Windows Presentation Foundation (WPF) -Grundlagen -Steuerelemente. Dr. Beatrice Amrhein

Ho Ngoc Duc IFIS - Universität zu Lübeck

Lösungen. 1. Aufgabe. // ActionExample.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.

Kap. 36. SWING: Menüs. und weitere SWING-Container. Seán Dempsey

Einführung in GUI-Programmierung. javax.swing

Testen von graphischen Benutzeroberflächen. 26. Juni 2013

Einführung in die OOP mit Java

Programmieren in Java

Objektorientierte Programmierung. Kapitel 12: Interfaces

Kapitel 8: Grafische Benutzerschnittstellen

Universität Paderborn Prof. Dr. Stefan Böttcher. Abschluss von Kapitel 2: Programmierung Grafischer Oberflächen mit der Swing-Bibliothek

Software-Engineering Grundlagen des Software-Engineering

Dokumentation des Projektes Tic Tac Toe

Grafische Benutzeroberflächen

Transkript:

Fortgeschrittene Objektorientierung GUI-Programmieren in Java Gregor Snelting Andreas Lochbihler Universität Karlsruhe Lehrstuhl Programmierparadigmen 27. Mai 2008 Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 1 / 40

Übersicht Eine Einführung in Java Swing 1 Eine Einführung in Java Swing Swing Applikationen Das Swing-Eventmodell GUI-Layout organisieren Weitere Swing-Komponenten Komplexere GUI-Elemente Zeichnen mit Swing 2 GUI Programmiertechniken Trennung von Programmlogik und Darstellung GUIs und Threads Summary Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 2 / 40

Eine Einführung in Java Swing Swing ( 23) Swing ist eine Bibliothek von Java zur Programmierung von graphischen Benutzeroberflächen nach dem Baukastenprinzip Nachfolger des Abstract Window Toolkit (AWT) Plattformunabhängig Durchgängig objektorientiert Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 3 / 40

Hello, world! Eine Einführung in Java Swing Swing Applikationen import javax.swing.*; import java.awt.* public class SwingHelloWorld { public static void main(string[] args) { JFrame frame = new JFrame(); frame.getcontentpane().add(new JLabel("Hello, world!")); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.setsize(100, 100); frame.setvisible(true); 1 Fenster erzeugen (JFrame) 2 Schriftzug Hello, world! einfügen (JLabel) 3 Programm soll sich beim Schließen des Fensters beenden 4 Größe festlegen 5 Anzeigen Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 4 / 40

Hello, world! Eine Einführung in Java Swing Swing Applikationen import javax.swing.*; import java.awt.* public class SwingHelloWorld { public static void main(string[] args) { JFrame frame = new JFrame(); frame.getcontentpane().add(new JLabel("Hello, world!")); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.setsize(100, 100); frame.setvisible(true); 1 Fenster erzeugen (JFrame) 2 Schriftzug Hello, world! einfügen (JLabel) 3 Programm soll sich beim Schließen des Fensters beenden 4 Größe festlegen 5 Anzeigen Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 4 / 40

Eine Einführung in Java Swing Nun eine Schaltfläche Swing Applikationen import javax.swing.*; import java.awt.*; public class ButtonXpl { public static void main(string[] args) { JFrame frame = new JFrame("Button example"); frame.setlayout(new FlowLayout()); Container c = frame.getcontentpane(); c.add(new JButton("Click me!")); c.add(new JButton("Ignore me!")); c.add(new JTextField("Type something! Please!")); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.setsize(200, 150); frame.setvisible(true); Aber: Noch keine Reaktion auf Benutzeraktionen Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 5 / 40

Eine Einführung in Java Swing Nun eine Schaltfläche Swing Applikationen import javax.swing.*; import java.awt.*; public class ButtonXpl { public static void main(string[] args) { JFrame frame = new JFrame("Button example"); frame.setlayout(new FlowLayout()); Container c = frame.getcontentpane(); c.add(new JButton("Click me!")); c.add(new JButton("Ignore me!")); c.add(new JTextField("Type something! Please!")); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.setsize(200, 150); frame.setvisible(true); Aber: Noch keine Reaktion auf Benutzeraktionen Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 5 / 40

Eine Einführung in Java Swing Swing Applikationen Reaktion auf Benutyeraktionen: Events ( 25) GUI-Programmierung ist Event-driven Programming. Was sind Events? Mausklicks Mausbewegungen Eingaben auf der Tastatur... Wie bekommt man Events? Registrieren bei dem Swing Widget mit einem Event-Listener Verschiedene Kategorien von Events: Action Keyboard Mouse Focus MouseMotion... Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 6 / 40

ActionListener Eine Einführung in Java Swing Swing Applikationen import javax.swing.*; import java.awt.*; import java.awt.event.*; public class ActionListenerDemo extends JFrame { private JButton button1, button2; private JTextField textfield; public ActionListenerDemo() { super("button example"); ButtonListener bl = new ButtonListener(); button1 = new JButton("Click me!"); button1.setactioncommand("first button"); button1.addactionlistener(bl); button2 = new JButton("Ignore me!"); button2.setactioncommand("second button"); button2.addactionlistener(bl); textfield = new JTextField("Type something! Please!"); this.setlayout(new FlowLayout()); Container c = getcontentpane(); c.add(button1); c.add(button2); c.add(textfield); private class ButtonListener implements ActionListener { public void actionperformed(actionevent e) { textfield.settext(e.getactioncommand()); public static void main(string[] args) { JFrame frame = new ActionListenerDemo(); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.setsize(200, 150); frame.setvisible(true); Reaktion auf Klicks: ActionListener implementieren actionperformed definiert Reaktion ActionEvent speichert Informationen zum Event addactionlistener Verknüpfung von Widget und ActionListener setactioncommand setzt String-Parameter für ActionEvent Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 7 / 40

Eine Einführung in Java Swing Das Swing-Eventmodell Das Swing-Eventmodell ( 25.2) Eventgetriebene Aktionen in Swing: 1 Swing-Komponente feuert Event 2 Aufruf der entsprechenden Methode in allen registrierten Listener 3 Verarbeitung in den Listenern Verschiedene Klassen für verschiedene Events: Je Event-Typ eine Event-Klasse eine Listener-Klasse eine Registrierungsmethode addxxxlistener(...) Aufteilung in Algorithmik, Darstellung und Aktionsverarbeitung Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 8 / 40

Eine Einführung in Java Swing Eventtypen und Listener ( 25.3.3) Das Swing-Eventmodell ActionEvent Verarbeitet durch ActionListener Unterstützt von JButton, JList, JTextField, JMenuItem, JMenu, JPopupMenu addactionlistener(...), removeactionlistener(...) MouseEvent Verarbeitet durch MouseListener Unterstützt von allen Komponenten addmouselistener(...), removemouselistener(...) u.v.a.m. siehe Java-API, Pepper: 25.3.3 Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 9 / 40

Eine Einführung in Java Swing Listener-Interfaces und Adapter Das Swing-Eventmodell public interface MouseListener extends EventListener { void mouseclicked(mouseevent e); void mouseentered(mouseevent e); void mouseexited(mouseevent e); void mousepressed(mouseevent e); void mousereleased(mouseevent e); Oft nur eine Methode benötigt MouseAdapter public class MouseAdapter implements MouseListener... { void mouseclicked(mouseevent e) { void mouseentered(mouseevent e) { void mouseexited(mouseevent e) { void mousepressed(mouseevent e) { void mousereleased(mouseevent e) {... Vererben von MouseAdapter und Methode überschreiben Analog für alle anderen Event-Typen Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 10 / 40

Eine Einführung in Java Swing Hierarchischer Aufbau von GUIs GUI-Layout organisieren Basis-Widgets elementare GUI-Komponenten wie JButton, JTextField, JLabel,... Container Behälter für andere Widgets JFrame, JPanel,... JComponent... JLabel AbstractButton JPanel JButton... Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 11 / 40

Eine Einführung in Java Swing GUI-Layout organisieren Layout-Manager ( 24.3.4) Layout-Manager ordnen Elemente in Containern an: FlowLayout Anordnung nach Einfügereihenfolge von links nach rechts, von oben nach unten BorderLayout Einfache Positionsangabe (oben, unten, links, rechts, mittig) GridLayout Tabellenlayout mit fester Spalten- und Zeilenzahl, alle Zellen sind gleich gross BoxLayout Alles in einer Zeile oder einer Spalte AbsolutePositioning Ganz ohne Layout-Manager mühsam und schlecht portabel Setzen mit setlayout(new...layout(...)) Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 12 / 40

BorderLayout Eine Einführung in Java Swing GUI-Layout organisieren import javax.swing.*; import java.awt.*; public class BorderLayout1 { public static void main(string[] args) { JFrame frame = new JFrame("BorderLayout"); frame.setlayout(new BorderLayout()); Container c = frame.getcontentpane(); c.add(new JLabel("North"), BorderLayout.NORTH); c.add(new JLabel("South"), BorderLayout.SOUTH); c.add(new JLabel("East"), BorderLayout.EAST); c.add(new JLabel("West"), BorderLayout.WEST); c.add(new JLabel("Center"), BorderLayout.CENTER); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.setsize(300, 200); frame.setvisible(true); Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 13 / 40

BorderLayout Eine Einführung in Java Swing GUI-Layout organisieren import javax.swing.*; import java.awt.*; public class BorderLayout1 { public static void main(string[] args) { JFrame frame = new JFrame("BorderLayout"); frame.setlayout(new BorderLayout()); Container c = frame.getcontentpane(); c.add(new JLabel("North"), BorderLayout.NORTH); c.add(new JLabel("South"), BorderLayout.SOUTH); c.add(new JLabel("East"), BorderLayout.EAST); c.add(new JLabel("West"), BorderLayout.WEST); c.add(new JLabel("Center"), BorderLayout.CENTER); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.setsize(300, 200); frame.setvisible(true); Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 13 / 40

GridLayout Eine Einführung in Java Swing GUI-Layout organisieren import javax.swing.*; import java.awt.*; public class GridLayout1 { public static void main(string[] args) { JFrame frame = new JFrame("GridLayout"); frame.setlayout(new GridLayout(4, 5)); Container c = frame.getcontentpane(); for (int i = 0; i < 18; i++) { c.add(new JButton(String.valueOf(i))); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.setsize(300, 200); frame.setvisible(true); Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 14 / 40

GridLayout Eine Einführung in Java Swing GUI-Layout organisieren import javax.swing.*; import java.awt.*; public class GridLayout1 { public static void main(string[] args) { JFrame frame = new JFrame("GridLayout"); frame.setlayout(new GridLayout(4, 5)); Container c = frame.getcontentpane(); for (int i = 0; i < 18; i++) { c.add(new JButton(String.valueOf(i))); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.setsize(300, 200); frame.setvisible(true); Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 14 / 40

Eine Einführung in Java Swing Beispiel: Hierarchisches GUI-Design GUI-Layout organisieren import javax.swing.*; import java.awt.*; public class HierarchicLayout { public static void main(string[] args) { JFrame frame = new JFrame("Hierarchic layout"); frame.setlayout(new BorderLayout()); JPanel c = new JPanel(new GridLayout(2, 3)); for (int i = 0; i < 6; i++) { c.add(new JButton(String.valueOf(i))); frame.getcontentpane().add(c, BorderLayout.CENTER); JPanel w = new JPanel(); w.setlayout(new BoxLayout(w, BoxLayout.Y_AXIS)); for (int i = 0; i < 5; i++) { w.add(box.createverticalglue()); w.add(new JLabel(String.valueOf(i))); w.add(box.createverticalglue()); frame.getcontentpane().add(w, BorderLayout.WEST); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.setsize(300, 200); frame.setvisible(true); Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 15 / 40

Eine Einführung in Java Swing GUI-Layout organisieren Zusammenfassung GUI-Aufbau GUI-Aufbau mit Swing: GUI-Aufbau aus verschiedenen Komponenten Verschachtelte Container für hierarchischen Aufbau Layout-Manager zur Anordnung der Elemente Mehr dazu: Laying Out Components Within a Container http://java.sun.com/docs/books/tutorial/uiswing/layout/index.html Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 16 / 40

Eine Einführung in Java Swing Weitere Swing-Komponenten Mehr Schaltflächen Verschiedene Buttons für verschiedene Anwendungen: JButton JToggleButton JCheckBox JRadioButton Vorgefertige Schaltflächen Gruppierung von Schaltflächen mit ButtonGroup: JToggleButton, JCheckBox, JRadioButton Immer maximal einer ausgewählt Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 17 / 40

Bilder als Icon Eine Einführung in Java Swing Weitere Swing-Komponenten Fast alle Widgets lassen sich mit Bildern (Icon) hinterlegen. Beispiel aus Thinking in Java: Dieses Beispiel zeigt auch noch einmal schön das Arbeiten mit Events. Übung: Implementieren Sie das nach! Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 18 / 40

JScrollPanes Eine Einführung in Java Swing Weitere Swing-Komponenten JScrollPanes als Wrapper um ein Widget oder Container: import javax.swing.*; import java.awt.*; public class JScrollPanes { public static void main(string[] args) { JFrame frame = new JFrame("JScrollPanes"); Container cp = frame.getcontentpane(); cp.setlayout(new FlowLayout()); String content = "01234567890123456789012" + "\n1\n2\n3\n4\n5\n6\n7\n8\n9\n0\n1\n2\n3\n4\n5"; JTextArea t6 = new JTextArea(content, 10, 10); cp.add(new JScrollPane(t6, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS)); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.setsize(170, 230); frame.setvisible(true); Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 19 / 40

Eine Einführung in Java Swing Weitere Swing-Komponenten Weitere GUI-Elemente Oft auch brauchbar: JComboBox Drop-Down-Box JList List-Box JTextField einzeiliges Textfeld JTextArea mehrzeiliges Textfeld Java-Demo SwingSet2 zu Swing: $JAVA HOME/demo/jfc/SwingSet2 java -jar SwingSet2.jar Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 20 / 40

Eine Einführung in Java Swing Komplexere GUI-Elemente Komplexere GUI-Elemente von Swing Swing bietet neben Basis-Bausteinen auch vorgefertigte Standard-Komponenten an: Message Boxes - Feedback für den Benutzer Menüs Zeichnen mit Swing Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 21 / 40

Eine Einführung in Java Swing Komplexere GUI-Elemente Einfache Popup-Dialoge Vom Benutzer wird benötigt: Einfache Eingaben Bestätigungsabfrage Auswahl Konfigurierbare Standarddialoge aus JOptionPane Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 22 / 40

Eine Einführung in Java Swing Message boxes mit JOptionPane Komplexere GUI-Elemente public void actionperformed(actionevent e) { String id = e.getactioncommand(); if (id.equals(titles[0])) { JOptionPane.showMessageDialog(null, "There s a bug on you!", "Hey!", JOptionPane.ERROR_MESSAGE); else if (id.equals(titles[1])) { JOptionPane.showConfirmDialog(null, "or no", "choose yes", JOptionPane.YES_NO_OPTION); else if (id.equals(titles[2])) { Object[] options = { "Red", "Green" ; int sel = JOptionPane.showOptionDialog(null, "Choose a Color!", "Warning", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[0]);... Das Methodenangebot der Utility-Klasse JOptionPane: showmessagedialog() reiner Hinweis showconfirmdialog() Auswahldialog (ja/nein, links/rechts,...) showinputdialog() Eingabedialog showoptiondialog() Frei konfigurierbarer Dialog Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 23 / 40

Eine Einführung in Java Swing Komplexere GUI-Elemente Menüs mit Swing Menüs sind klassische Kandidaten, um diese als ein separates GUI-Objekt zu erzeugen. Aggregationshierarchie: eine JMenuBar enthält JMenus, diese enthalten JMenuItems oder JMenus Beliebig tief verschachtelbar! JMenuBar und JMenu verwenden BoxLayout Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 24 / 40

Menü-Beispiel Eine Einführung in Java Swing Komplexere GUI-Elemente // Menükomponenten erzeugen JMenuBar menubar = new JMenuBar(); JMenu blmenu = new JMenu("Blinken"); JMenuItem bllinks = new JMenuItem("Links"); JMenuItem blrechts = new JMenuItem("Rechts"); JMenuItem blbeide = new JMenuItem("Beidseitig"); JRadioButtonMenuItem blschnell = new JRadioButtonMenuItem("Schnell"); JRadioButtonMenuItem bllangsam = new JRadioButtonMenuItem("Langsam");... // Verhalten der Komponenten durch ActionListener festlegen bllinks.addactionlistener(...); blrechts.addactionlistener(...);...... blmenu.add(bllinks); blmenu.add(blrechts); blmenu.add(blbeide); blmenu.addseparator(); // RadioButtons gruppieren ButtonGroup bg = new ButtonGroup(); bg.add(blschnell); bg.add(bllangsam); blschnell.setselected(true); blmenu.add(blschnell); blmenu.add(bllangsam);... menubar.add(blmenu); getcontentpane().add(menubar); Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 25 / 40

Popup-Menüs Eine Einführung in Java Swing Komplexere GUI-Elemente Kontext-Menü: JPopupMenu + MouseListener JPopupMenu popup = new JPopupMenu(); JMenuItem hither = new JMenuItem("Hither"); JMenuItem yon = new JMenuItem("Yon"); JMenuItem afar = new JMenuItem("Afar"); JMenuItem stayhere = new JMenuItem("Stay here");... hither.addactionlistener(...); yon.addactionlistener(...);... popup.add(hither); popup.add(yon); popup.add(afar); popup.addseparator(); popup.add(stayhere); JLabel jb = new JLabel("Click me!", SwingConstants.CENTER); jb.addmouselistener(new MouseAdapter() { @Override public void mousepressed(mouseevent e) { if (e.ispopuptrigger()) popup.show(frame.getcontentpane(), e.getx(), e.gety()); ); frame.getcontentpane().add(jb); Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 26 / 40

Zeichnen mit Swing Eine Einführung in Java Swing Zeichnen mit Swing Manchmal sind Standard-Widgets nicht genug selbst zeichnen JPanel als Zeichenfläche 1 Überschreiben der paintcomponent(graphics g)-methode 2 Graphics bietet Methoden zum Zeichnen an 3 Neuzeichnen mit repaint() anfordern Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 27 / 40

Zeichnen mit Swing Eine Einführung in Java Swing Zeichnen mit Swing class SineDraw extends JPanel { private static final int SCALEFACTOR = 200; private int cycles; private int points; private double[] sines; public SineDraw() { setcycles(5); @Override public void paintcomponent(graphics g) { super.paintcomponent(g); int maxwidth = getwidth(); double hstep = (double) maxwidth / (double) points; int maxheight = getheight(); int[] pts = new int[points]; for(int i = 0; i < points; i++) pts[i] = (int)(sines[i] * maxheight / 2 *.95 + maxheight / 2); g.setcolor(color.red); for(int i = 1; i < points; i++) { int x1 = (int) ((i - 1) * hstep); int x2 = (int) (i * hstep); int y1 = pts[i - 1]; int y2 = pts[i]; g.drawline(x1, y1, x2, y2); public void setcycles(int newcycles) { cycles = newcycles; points = SCALEFACTOR * cycles * 2; sines = new double[points]; for(int i = 0; i < points; i++) sines[i] = Math.sin((Math.PI / SCALEFACTOR) * i); repaint(); Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 28 / 40

Übersicht GUI Programmiertechniken 1 Eine Einführung in Java Swing Swing Applikationen Das Swing-Eventmodell GUI-Layout organisieren Weitere Swing-Komponenten Komplexere GUI-Elemente Zeichnen mit Swing 2 GUI Programmiertechniken Trennung von Programmlogik und Darstellung GUIs und Threads Summary Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 29 / 40

GUI Programmiertechniken Trennung von Programmlogik und Darstellung Trennung von Programmlogik und Darstellung Grundprinzip des Software Engeneering: Jede Klasse hat genau ein Geheimnis! Problem: Verflechtung von Programmlogik und Darstellung Algorithmik in der Event-Verarbeitung Berechnung von Daten in den graphischen Komponenten schwer wartbar schwer erweiterbar nicht wiederverwendbar Lösung: Konsequente Trennung Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 30 / 40

GUI Programmiertechniken Trennung von Programmlogik und Darstellung Trennung von Programmlogik und Darstellung class BusinessLogic { private int modifier; public BusinessLogic(int mod) { modifier = mod; public void setmodifier(int mod) { modifier = mod; public int getmodifier() { return modifier; // Some business operations: public int calculation1(int arg){ return arg * modifier; public int calculation2(int arg){ return arg + modifier; public class Separation extends JFrame { private JTextField t = new JTextField(15); private JTextField mod = new JTextField(15); private JButton calc1 = new JButton("Calc 1"), private JButton calc2 = new JButton("Calc 2"); private BusinessLogic bl = new BusinessLogic(2); public static int getvalue(jtextfield tf) { try { return Integer.parseInt(tf.getText()); catch(numberformatexception e) { return 0; class Calc1L implements ActionListener { public void actionperformed(actionevent e) { // Delegation an BusinessLogic int i = bl.calculation1(getvalue(t)); t.settext(integer.tostring(i));... public Separation() { Container cp = getcontentpane(); cp.setlayout(new FlowLayout()); cp.add(t); calc1.addactionlistener(new Calc1L()); calc2.addactionlistener(new Calc2L()); JPanel p1 = new JPanel(); p1.add(calc1); p1.add(calc2); cp.add(p1); JPanel p2 = new JPanel(); p2.add(new JLabel("Modifier:")); p2.add(mod); cp.add(p2);... Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 31 / 40

GUI Programmiertechniken Trennung von Programmlogik und Darstellung Trennung von Programmlogik und Darstellung Geschäftslogik Das zugrundeliegende Modell für Berechnungen Variable modifier der Klasse BusinessLogic und die calculate-methoden Darstellung Die Anzeige des Modells modifier dargestellt in JTextField mod Ereignisverarbeitung Verknüpft GUI und Model Listener Vorteil dieser Architektur: Abhängigkeit Geschäftslogik unabhängig von der GUI Wiederverwendbar Automatisch testbar Delegation GUI delegiert Berechnungen an die Geschäftslogik Änderungen am einen Ende unabhängig vom anderen Ende möglich! Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 32 / 40

GUI Programmiertechniken GUIs und Threads Swing & Nebenläufigkeit Achtung: Swing Applikationen sind immer nebenläufig! Verschiedene Anzeigen: Initial Value Initialization complete Application ready Done Preisfrage: In welcher Reihenfolge? public class EventThreadFrame extends JFrame { private JTextField statusfield = new JTextField("Initial Value"); public EventThreadFrame() { getcontentpane().add(statusfield, BorderLayout.NORTH); this.addwindowlistener(new WindowAdapter() { public void windowopened(windowevent e) { try { // Simulate initialization overhead Thread.sleep(2000); catch (InterruptedException ex) { statusfield.settext("initialization complete"); ); public static void main (String[] args) { EventThreadFrame etf = new EventThreadFrame(); etf.setsize(150, 60); etf.setdefaultcloseoperation(jframe.exit_on_close); etf.setvisible(true); etf.statusfield.settext("application ready"); System.out.println("Done"); Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 33 / 40

GUI Programmiertechniken Kontrollieren der Nebenläufigkeit Des Rätsels Lösung: GUIs und Threads 1 Done wird als erstes auf der Konsole ausgegeben 2 Application ready wird sofort überschrieben, ist gar nicht sichtbar 3 statusfield zeigt Initial Value 4 statusfield wechselt nach 2s zu Initialization complete Zwei Threads: main führt main-methode aus EventDispatcher verarbeitet Events und zeichnet die GUI Nebenläufiger Zugriff auf etf.statusfield Unsauberkeiten: Keine Synchronisation vorhanden Nur EventDispatcherThread sollte GUI ändern Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 34 / 40

GUI Programmiertechniken invokelater und invokeandwait GUIs und Threads Einfügen von Aufrufen in die EventQueue mit SwingUtilities.invokeLater() und SwingUtilities.invokeAndWait() Runnable-Objekt als Parameter run-methode wird später ausgeführt invokeandwait() legt aktuellen Thread solange schlafen public static void main(string[] args) { final EventThreadFrame elf = new EventThreadFrame(); etf.setsize(150, 60); etf.setdefaultcloseoperation(jframe.exit_on_close); etf.setvisible(true); SwingUtilities.invokeLater(new Runnable() { public void run() { elf.statusfield.settext("application ready"); ); System.out.println("Done"); Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 35 / 40

GUI Programmiertechniken GUIs und Threads GUI-Lock Ups: Aufwändige Berechnung im EventThread public class GUILock1 extends JFrame { public GUILock1() { Container c = getcontentpane(); c.setlayout(new FlowLayout()); JButton b = new JButton("Lock Up!"); c.add(b); final JTextField tf = new JTextField(5); c.add(tf); b.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { int cnt = 0; while (true) { tf.settext("" + cnt++); );... Grundproblem: Aufwändige Aktionen im EventThread träge GUI Hier: 1 Die GUI wird normal angezeigt 2 Sobald der Button angeklickt wird, friert die GUI ein 3 actionperformed hindert EventDispatcherThread am Zeichnen Lösung: Eigene Threads für aufwändige Operationen, nur reine GUI-Updates (z.b. repaint) im Event-Thread Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 36 / 40

Idee: Benachrichtigung der GUI bei neuen Werten invokeandwait Bremst den Rechenkern invokelater Produktion ist evtl. zu schnell Überlauf der EventQueue; Absturz mit OutOfMemoryError Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 37 / 40 GUI Programmiertechniken GUI Lock Ups: Pushen von Daten GUIs und Threads class GUILock2 { public static void main(string[] args) { JFrame f = new JFrame(); final JTextField txt = new JTextField("0"); f.getcontentpane().add(txt);... while (true) { SwingUtilities.invokeLater(new Runnable() { public void run() { // expensive update txt.settext("" + (Integer.parseInt(txt.getText()) + 1)); try { Thread.sleep(1000); catch (InterruptedException e) { ); Szenario: Der main-thread produziert kontinuierlich Daten, die in der GUI angezeigt werden sollen.

GUI Programmiertechniken GUIs und Threads Pull von Daten mittels Timer class TimedGUI { public static final int DELAY = 50; private static int counter = 0; public static void main(string[] args) { JFrame frame = new JFrame(); final JTextField txt = new JTextField("0"); frame.getcontentpane().add(txt);... Timer timer = new Timer(DELAY, new ActionListener() { public void actionperformed(actionevent e) { txt.settext("" + counter); txt.repaint(); ); timer.start(); while (true) { frame.counter++; Stabilere Lösung: Pull Modell. GUI stellt sich regelmäßig selbst neu dar: realisierbar mit Timer-Objekt dessen Konstruktor bekommt Zeitintervall und ActionListener, der ausgeführt werden soll actionperformed implementiert das GUI-Update Achtung: i.a. werden nur einzelne Komponenten neu gezeichnet, nicht der ganze Frame Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 38 / 40

GUI Programmiertechniken Summary Summary Das war eine (sehr) knappe Einführung in Java Swing. Details: Java Tutorial, Swing Trail: http://java.sun.com/docs/books/tutorial/uiswing/ind Die SwingSet2 Demo Applikation (Teil des JDK) Swing und Threads: http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html Es gibt gute und dicke Bücher zu Swing alleine! Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 39 / 40

GUI Programmiertechniken Summary Noch eine Warnung zum Schluss Die Autoren des SubArctic Java ToolKit: It is our basic belief that extreme caution is warranted when designing and building multi-threaded applications, particularly those which have a GUI component. Use of threads can be very deceptive. In many cases they appear to greatly simplify programming by allowing design in terms of simple autonomous entities focused on a single task. In fact in some cases they do simplify design and coding. However, in almost all cases they also make debugging, testing, and maintenance vastly more difficult and sometimes impossible. Neither the training, experience, or actual practices of most programmers, nor the tools we have to help us, are designed to cope with the non-determinism. For example, thorough testing (which is always difficult) becomes nearly impossible when bugs are timing dependent. This is particularly true in Java where one program can run on many different types of machines and OS platforms, and where each program must work under both preemptive or non-preemptive scheduling. As a result of these inherent difficulties, we urge you to think twice about using threads in cases where they are not absolutely necessary... Gregor Snelting (Universität Karlsruhe) Fortgeschrittene Objektorientierung 27. Mai 2008 40 / 40