Universität Bremen Universität Bremen
Abstract Window Toolkit Rückblick „Generisches Programmieren“
Motivation Generische Klassen/Interfaces Generische Typen
classclassNode
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, d.h. sie bilden reale Objekte und 4 Seit Java 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 Applet 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