Universität Bremen Universität Bremen

Abstract Window Toolkit Rückblick „Generisches Programmieren“

Motivation Generische Klassen/Interfaces Generische Typen

classclassNode Node NodeNode nn == newnewNode("foo"); Node("foo"); 1 String s = n.getInfo(); Thomas Röfer {{ String s = n.getInfo(); privateprivateT T info;info; private Node left, right; 2 3 private Node left, right; Node(TNode(T i) i) {info{info = = i;}i;} Typebounds Desktop-Metapher Node(TNode(T i, i, NodeNode l,l, NodeNode r)r) classclassNode> Comparable> 4 5 {info{info = = i;i; leftleft = = l;l; rightright == r;}r;} {{ AWT und TT getInfo()getInfo() { {returnreturn info;} info;} //// ...... NodeNode getLeft()getLeft() { {returnreturn left;} left;} und Anwendungen 6 NodeNode getRight()getRight() { {returnreturn right;} right;} voidvoidsetInfo(T setInfo(T i) i) {info{info = = i;}i;} Rahmen und Menüs }} Polymorphe Methoden Komponenten und Container interfaceinterfaceFoldlFnB> {{ AA fn(Afn(A a, a, BB b);b); } } Panels und Layouts Wildcard-Typen Typ Lesen Schreib. Kompatible Typargumente B> AA foldl(FoldlFnB> f,f, AA a,a, B[]B[] b)b) { Grafik und Schriften Invarianz ja ja T { forfor(B(B b0 b0 :: b)b) Bivarianz C nein nein Alle Ereignisbehandlung aa == f.fn(a,f.fn(a, b0);b0); Covarianz C ja nein B und abgeleitete Typen returnreturna; a; Contravarianz C nein ja B und Basistypen }}

PI-1: Abstract Window Toolkit 2

Universität Bremen Universität Bremen

Desktop-Metapher AWT und Swing

4 Ansatz 4 Abstract Window Toolkit 4 Graphische Oberflächen bedienen sich Metaphern, .h. sie bilden reale Objekte und 4 Seit 1.0 Abläufe nach, die dem Benutzer den Umgang mit dem Computer erleichtern sollen, da 4 Nutzt die Elemente des unterliegenden Fenstersystems er diese Objekte aus der realen Welt bereits kennt 4 Ist relativ schnell 4 Der Benutzer bestimmt, was zu tun ist, d.h. es gibt keine globale feste Reihenfolge 4 Der Leistungsumfang ist eingeschränkt 4 modal vs. nicht-modal 4 Findet sich unter java.awt.* 4 Beispiele 4 Swing 4 Desktop (Schreibtischoberfläche) 4 Seit Java 1.1 4 Man kann Dinge ablegen, hin- und herschieben und in den Papierkorb werfen 4 Teilweise schräg: Disketten in Papierkorb werfen, um sie entnehmen zu können 4 „Leichtgewichtige“ Komponenten (d.h. nur wenig Code des unterliegenden Fenstersystems) 4 Fenster 4 Zeigen einen Ausschnitt der Welt. Die Sicht kann durch Rollbalken geändert werden 4 Ist langsamer als AWT 4 Buttons (IBM-Deutsch: Schaltflächen) 4 Der Leistungsumfang ist deutlich größer 4 Listen, Dialoge, Karteikarten, Assistenten … 4 Unterstützt unterschiedliche „Look & Feels“ 4 Findet sich unter javax.swing.*

PI-1: Abstract Window Toolkit 3 PI-1: Abstract Window Toolkit 4

Universität Bremen Universität Bremen

Applets und Anwendungen Applets

4 Applets 4 Allgemein 4 Ein ist eine Klasse, die von java.applet.Applet erbt 4 Können nur innerhalb eines Webbrowsers oder im AppletViewer ausgeführt werden 4 Funktionalität wird implementiert, indem existierende Methoden überschrieben oder Schnittstellen implementiert werden 4 Sind immer grafisch 4 Der Programmfluss wird von außen bestimmt (Ereignisbasierte Programmierung) 4 Zeichenfläche ist statisch 4 Don‘t call us, we‘ll call you! 4 Starten und Beenden automatisch durch Browser 4 Methoden 4 Initialisierung 4 Anwendungen 4 void init() 4 Können sowohl textuell als auch grafisch sein 4 Benutzer betritt mit Applet Seite (wieder) 4 Grafische Anwendungen generell aufwändiger als 4 void start() Applets 4 Benutzer verlässt Seite mit Applet (wieder) 4 void stop() 4 Müssen eine Funktion main() haben 4 Applet wird nicht mehr gebraucht 4 main() erzeugt typischerweise nur ein Objekt des 4 void destroy() Hauptfensters und kann daher in BlueJ entfallen 4 Alle Methoden von java.awt.Panel , z.B. 4 void paint(Graphics g)

PI-1: Abstract Window Toolkit 5 PI-1: Abstract Window Toolkit 6

1 Universität Bremen Universität Bremen

Struktur des AWT Rezept für eine AWT-Anwendung

4 Fenster und Dialogelemente 4 Benutzungsschnittstelle 4 CheckboxGroup , s. rechts 4 Erzeugen eines Rahmens (Ableitung von class Frame ) 4 Layouts 4 4 BorderLayout, CardLayout, Initialisierung der Schriften, Farben, Layouts und anderer sog. Resourcen FlowLayout, GridLayout, 4 Erzeugung der Menüs und des Menübalkens GridBagLayout … 4 Erzeugung der Steuerelemente, Dialoge, Fenster usw. 4 Zeichnen und Grafikprimitive 4 Color, Graphics, Image, Point, 4 Implementierung Polygon, Rectangle 4 Ereignisbehandler (event handlers) hinzufügen 4 Schriften 4 Funktionalität hinzufügen 4 Font, FontMetrics 4 Fehlerbehandlung hinzufügen 4 Ereignisse 4 Event 4 Menüs 4 MenuComponent, MenuBar, MenuItem, CheckboxMenuItem, Menu 4 Toolkit PI-1: Abstract Window Toolkit 7 PI-1: Abstract Window Toolkit 8

Universität Bremen Universität Bremen

Erzeugen eines Rahmens Menüs

4 Allgemein //// im im Konstruktor Konstruktor MenuBar mbar = new MenuBar(); 4 Jede grafische Anwendung benötigt MenuBar mbar = new MenuBar(); ein Hauptfenster (einen Rahmen) import java.awt.*; MenuMenu m m = = new newMenu( Menu("File");"File"); import java.awt.*; m.add( new MenuItem( "New")); 4 Üblicherweise wird dazu eine Klasse m.add(new MenuItem("New")); m.add( new MenuItem( "Open…")); von Frame abgeleitet und ein einzelnes class AWTApp extends Frame m.add(new MenuItem("Open…")); class AWTApp extends Frame m.add( new MenuItem( "Save")); Objekt davon konstruiert (z.B. in { m.add(new MenuItem("Save")); main()) { m.add(m.add(newnew MenuItem( MenuItem("Save"Save As…" As…"));)); AWTApp() m.addSeparator(); 4 Einschränkungen AWTApp() m.addSeparator(); {{ m.add( new MenuItem( "Print…")); 4 Eine so erzeugte Anwendung reagiert m.add(new MenuItem("Print…")); super ("My App"); m.addSeparator(); noch auf keine Ereignisse, z.B. nicht super("My App"); m.addSeparator(); auf das Drücken der Schließen - setSize(300,setSize(300, 300);300); m.add(m.add(newnew MenuItem( MenuItem("Quit"));"Quit")); mbar.add(m); Schaltfläche setVisible(setVisible(true);true ); mbar.add(m); m = new Menu("Help"); 4 Man kann es nur beenden, indem man }} m = new Menu("Help"); es „abschießt“ (BlueJ: Virtuelle m.add( new MenuItem( "Help!!!!" )); }} m.add(new MenuItem("Help!!!!")); Maschine zurücksetzen) m.addSeparator();m.addSeparator(); m.add(m.add(newnew MenuItem( MenuItem("About..."));"About..." )); mbar.add(m);mbar.add(m); setMenuBar(mbar);setMenuBar(mbar);

PI-1: Abstract Window Toolkit 9 PI-1: Abstract Window Toolkit 10

Universität Bremen Universität Bremen

Komponenten und Container Panels und Layouts

4 Allgemein 4 Panel 4 Component ist die Basisklasse aller 4 Ein rechteckiger Bereich, der andere Komponenten Elemente, mit denen der Benutzer enthalten kann und dem ein LayoutManager interagieren kann zugeordnet ist 4 Arten 4 LayoutManager 4 List, Scrollbar, TextArea, TextField, 4 Erlauben die Anordnung von Komponenten nach Choice, Button, Label, … vorgegebenen Kriterien 4 Alle Container 4 Notwendig für Plattformunabhängkeit 4 Methoden, z.B. 4 BorderLayout 4 set/getBackground(Color) 4 Standard-LayoutManager für alle Fenster, z.B. 4 set/getFont(Font) Rahmen und Dialoge 4 setVisible() 4 Speichert Komponenten in fünf Bereichen 4 set/getLocation (int, int), set/getSize(int, 4 north , south , east , west und center int) 4 Der überschüssige Raum wird dem mittleren Bereich 4 paint(Graphics), update(Graphics), zugeordnet repaint() 4 CardLayout 4 Container 4 Speichert mehrere Komponenten, die nacheinander 4 Komponenten, die andere Komponenten angezeigt werden sollen, d.h. man kann zwischen enthalten können verschiedenen Komponenten umschalten

PI-1: Abstract Window Toolkit 11 PI-1: Abstract Window Toolkit 12

2 Universität Bremen Universität Bremen

Panels und Layouts Panels und Layouts

4 FlowLayout 4 GridBagLayout 4 Standard-LayoutManager für Panels 4 Kompliziertester, aber auch mächtigster LayoutManager 4 Kann beliebig viele Komponenten enthalten, 4 Erlaubt die Zuordnung sog. Einschränkungen die an den Fenstergrenzen umgebrochen (Constraints ) zu jeder Komponente werden 4 GridBagConstraints 4 Unterschiedliche Ausrichtungen 4 Legt die Einschränkungen für Komponenten in 4 FlowLayout.LEFT , FlowLayout.CENTER , GridBagLayout fest, z.B. FlowLayout.RIGHT 4 Relative Breite und Höhe 4 GridLayout 4 gridwidth , gridheight 4 Ordnet Komponenten in einem Gitter an 4 Anzahl Zellen, GridBagConstraints.RELATIVE , 4 Alle Komponenten haben die gleiche Größe GridBagConstraints.REMAINDER 4 Gewichtungen 4 weightx , weighty

PI-1: Abstract Window Toolkit 13 PI-1: Abstract Window Toolkit 14

Universität Bremen Universität Bremen

Grafik Schriften

import java.awt.*; import java.awt.*; 4 Allgemein class FrameBeispiel extends Frame 4 Begriffe class FrameBeispiel extends Frame { 4 In alle Komponenten kann { FrameBeispiel() 4 Grundlinie, Oberlänge, Unterlänge, Höhe gezeichnet werden, in dem FrameBeispiel() { paint(Graphics) überschreibt { 4 Proportionalschrift, Schrittweite setSize(320,280); setSize(320,280); setVisible(true); 4 Aber es kann zu Konflikten mit setVisible(true); 4 Unterschneidung, Ligaturen } den Zeichenroutinen der } Komponenten kommen 4 Serifen public void paint(Graphics g) public void paint(Graphics g) { 4 Allgemeine Zeichenfläche { 4 Auswahl einer Schrift (Font) g.setColor(Color.black); 4 g.setColor(Color.black); class Canvas g.drawString("Vereinzellungseinheit", 150, 50); 4 g.drawString("Vereinzellungseinheit", 150, 50); Name, z.B. „SansSerif“ g.fillRect(90, 5, 5, 240); 4 Zeichenschnittstelle g.fillRect(90, 5, 5, 240); g.fillRect(135, 5, 5, 200); 4 Stil, (ver-odert) z.B. Font.BOLD | Font.ITALIC g.fillRect(135, 5, 5, 200); 4 interface Graphics g.fillRect(90, 245, 145, 5); g.fillRect(90, 245, 145, 5); 4 g.fillRect(135, 205, 100, 5); Größe in Punkten (1pt = 1/72 Zoll), z.B. 4 Wird an paint übergeben g.fillRect(135, 205, 100, 5); 4 g.setFont(new Font("SansSerif", Font.PLAIN, 16); 4 Arbeitet zustandsbasiert g.setColor(Color.red); g.setColor(Color.red); g.fillOval(95, 80, 40, 40); 4 Speichert den aktuellen g.fillOval(95, 80, 40, 40); 4 Informationen über eine Schrift (FontMetrics) g.setColor(Color.yellow); Zustand des Zeichenwerkzeugs g.setColor(Color.yellow); g.fillOval(95, 120, 40, 40); 4 g.fillOval(95, 120, 40, 40); getAscent(), getDescent(), getHeight() (Farbe, Schriftart usw.) } } } 4 stringWidth(String) }

PI-1: Abstract Window Toolkit 15 PI-1: Abstract Window Toolkit 16

Universität Bremen Universität Bremen

Ereignisbehandlung (event-handling) WindowEvent / WindowListener

import java.awt.*; public void windowClosing(WindowEvent e) import java.awt.*; public void windowClosing(WindowEvent e) 4 { Konzept importimportjava.awt.event.*; java.awt.event.*; { dispose(); 4 Programmsteuerung erfolgt durch Ereignisse dispose(); classclassAWTApp AWTAppextends extendsFrame Frame System.exit(0);System.exit(0); 4 Man kann Listener an Komponenten hängen, die über Ereignisse ( …Event ) implementsimplementsWindowListener, WindowListener, }} informiert werden ActionListenerActionListener {{ publicpublicvoid voidwindowOpened(WindowEvent windowOpened(WindowEvent e) e) 4 Die Mitteilung erfolgt über den Aufruf von Objekt-Methoden AWTApp()AWTApp() {}{} { 4 { Welche Ereignisse mitgehört werden können, ist über Interfaces ( …Listener ) supersuper("My("My App"); App"); publicpublicvoid voidwindowClosed(WindowEvent windowClosed(WindowEvent e) e) vordefiniert addWindowListener(addWindowListener(this);this ); {}{} Button b = new Button("Close"); 4 Button b = new Button("Close"); Die Ereignisbehandler heißen oft process…Event(…Event) add(b);add(b); publicpublicvoid voidwindowIconified(WindowEvent windowIconified(WindowEvent e) e) b.addActionListener(this); {} 4 Vordefinierte Ereignisse und Listener b.addActionListener(this); {} setSize(300,setSize(300, 300);300); 4 ActionEvent/Listener AdjustmentEvent/Listener setVisible(true);setVisible(true); publicpublicvoid voidwindowDeiconified(WindowEvent windowDeiconified(WindowEvent e) e) }} {}{} 4 ComponentEvent/Listener ContainerEvent/Listener public void actionPerformed(ActionEvent e) public void windowActivated(WindowEvent e) 4 FocusEvent/Listener ItemEvent/Listener public void actionPerformed(ActionEvent e) public void windowActivated(WindowEvent e) {{ {}{} 4 KeyEvent/Listener MouseEvent/Listener ifif(e.getActionCommand().equals("Close"))(e.getActionCommand().equals("Close")) windowClosing(windowClosing(null);null ); publicpublicvoid voidwindowDeactivated(WindowEvent windowDeactivated(WindowEvent e) e) 4 TextEvent/Listener WindowEvent/Listener }} {}{} }}

PI-1: Abstract Window Toolkit 17 PI-1: Abstract Window Toolkit 18

3 Universität Bremen Universität Bremen

Fachgespräche Fachgespräche

4 Ziel 4 Bewertung 4 Überprüfung der Individualität der Leistung 4 Ausgangspunkt: Vornote aus dem 4 Ablauf Übungsbetrieb 4 Kleine Programmieraufgabe, z.B. 4 Aufwertung: Maximal 1/3-Note 4 Schreibe eine iterative Methode, die alle Elemente einer Reihung quadriert 4 Abwertung: beliebig 4 Gegeben: class Elem {int value; Elem next;} 4 Wiederholung Schreibe eine rekursive Methode, die alle Elemente einer Liste quadriert 4 Nach mindestens 4 Wochen 4 Schreibe eine rekursive Methode, die alle Elemente einer Reihung quadriert 4 SBLN mitbringen! 4 Fragen nach Begriffen und Konzepten 4 Außer Systems Engineering 4 Keine Java-Syntax 4 Haben eigene Scheine 4 Schwerpunkt auf Vorlesungen 2-6 4 4 Aber auch allgemeine Fragen aus anderen Vorlesungen, z.B. Von PI-1-Homepage zu Ende ausfüllen und ausdrucken Unterschied zwischen Vorrang und Assoziativität von Operatoren? 4 Name, Matrikel-Nr., Studiengang

PI-1: Abstract Window Toolkit 19 PI-1: Abstract Window Toolkit 20

4