Graphische Programmierung: GUIs: graphical user interfaces Ziel: Java -Programmierung und Handhabung von graphischen Benutzeroberflächen (in Applets) • • • • mehrere Fenster Fenster-Eigenschaften: aktiv oder inaktiv im Hintergrund oder im Vordergrund • parallele Verwendung verschiedener Eingabekanäle: Tastatur Maus mit i.a. 3 Tasten, Touchscreen, Joystick, . . . P raktische Inf ormatik 2, SS 2005, F olien Java;4, (4. M ai2005) Seite 1 GUIs: graphical user interfaces Graphische Elemente: • Fenster mit Schiebeleisten, • waagrechte/senkrechte Menüs, • Radioknöpfe, • Symbole zum Anklicken (Icons), • Textfelder P raktische Inf ormatik 2, SS 2005, F olien Java;4, (4. M ai2005) Seite 2 GUI: Bemerkungen Große Akzeptanz der GUIs: • intuitive Bedienbarkeit • Schnelleres Verständnis, • orientiert an der menschlichen Wahrnehmung • Schnelle Rechner/ Graphikkarte: Realzeitgefühl P raktische Inf ormatik 2, SS 2005, F olien Java;4, (4. M ai2005) Seite 3 Programmierung, Ereignissteuerung Problem der Programmierung: Anwendungsprogramme müssen mit einer Vielzahl von Interaktionen/ Eingabemöglichkeiten umgehen können Man muss mit allem rechnen und auf jedes relevante Ereignis eine sinnvolle Aktion starten. Beispiel Markierung eines Textstückes im Textverarbeitungsprogramm P raktische Inf ormatik 2, SS 2005, F olien Java;4, (4. M ai2005) Seite 4 Programmierung, Ereignissteuerung Interne Methode der Mitteilung der Ereignisse Strom von Ereignissen • erzeugt vom Benutzer über die Eingabekanäle • verändert bzw. gefiltert vom Betriebssystem / GUI-System • I.a. in zeitlichen Reihenfolge des Auftretens P raktische Inf ormatik 2, SS 2005, F olien Java;4, (4. M ai2005) Seite 5 Graphische Zeichenfläche graphischer, farbiger Bildschirm, mit ca. 1000 X 1000 Bildpunkte (Pixel) Pixel-Koordinatensystem (x,y). Eingabekanäle: P raktische Inf ormatik 2, SS (0,0) ist links oben. Tastatur: Zeiger-Position und Tasteneingabe Maus: Position, Click; Art des Clicks 2005, F olien Java;4, (4. M ai2005) Seite 6 Vordefinierte Fenstertypen und graphische Elemente Oberste Klasse ist Component Button Canvas Checkbox Choice Container Label List Scrollbar Textcomponent P raktische Inf ormatik 2, SS Unterklassen sind: Ein Knopf zum Anklicken. Ein Zeichenfläche. Ein Text und ein Kästchen zum Ankreuzen. Ein Auswahlmenü mit Kurztexten. abstrakte Klasse, mit der hierarchisch ein Fenster in Unterfenster gegliedert werden kann. Unterklassen von Container: Panel Fenster ohne Rahmen Window mit Unterklassen Frame, Dialog Textanzeigefeld Senkrechte, anklickbare Menüleiste Schiebeleiste Textanzeige 2005, F olien Java;4, (4. M ai2005) Seite 7 Applets Applet ist Unterklasse von Panel Panel-Methoden stehen einem Applet somit zur Verfügung P raktische Inf ormatik 2, SS 2005, F olien Java;4, (4. M ai2005) Seite 8 Component - Methoden. Beispiele Layout Steuerung der Verteilung von Subkomponenten: Je nach Layout Spezifikation mittels der entsprechenden Klasse: Borderlayout North, South, Center, East, West GridLayout(...) Komponenten matrixartig FlowLayout von oben nach unten. CardLayout Kartenstapel Die Klasse Container hat die Methode add zum Hinzufügen von Komponenten. P raktische Inf ormatik 2, SS 2005, F olien Java;4, (4. M ai2005) Seite 9 Component - Methoden. Beispiele Größe und Position können ermittelt und verändert werden. bounds(), inside(), location(), move(), size(), ... • Farbe • Ereignisse • Zeichnen • Status des Hintergrunds, Vordergrunds: getBackground(), setForeground(), . . . . Ermitteln und Handhabung der Ereignisse action(), gotFocus(), keyDown(), mouseDown(), mouseEnter() mouseUp(), handleEvent(), postEvent(), ... innerhalb der Komponente, Neuzeichnen des Bildes. paint(), repaint(), update() Feststellen, ob Komponente aktiv, usw. Bei Definition einer Unterklasse können bzw. müssen bestimmte Methoden in diesen Klasse überschrieben werden. P raktische Inf ormatik 2, SS 2005, F olien Java;4, (4. M ai2005) Seite 10 Bemerkungen In Ereignismodell 1.0: Ereignisse, werden in der Objekthierarchie von unten nach oben durchgereicht, bis handleEvent dieses Ereignis einfängt. Programmierhinweise: Das im Fenster sichtbare Bild möglichst vollständig in Datenstrukturen ablegen, damit das sichtbare Bild rekonstruierbar ist P raktische Inf ormatik 2, SS 2005, F olien Java;4, (4. M ai2005) Seite 11 Beispiel: Einfaches Zeichnen (Ereignismodell 1.0) Zeichenfläche: Strecken, Rechteck und Ellipsen zeichnen. // // veraenderte Version eines JDK Beispiels (alte Version der Ereignissteuerung) import java.awt.*; import java.applet.*; import java.util.Vector; public class DrawTestRechteck extends Applet { public void init() { P raktische Inf ormatik 2, SS 2005, F olien Java;4, (4. M ai2005) Seite 12 setLayout(new BorderLayout()); DrawPanel dp = new DrawPanel(); add("Center", dp); add("South", new SKWahl(dp)); dp.init(); } public boolean handleEvent(Event e) { switch (e.id) { case Event.WINDOW_DESTROY: System.exit(0); return true; default: return false; } } public static void main(String args[]) { Frame f = new Frame("DrawTest"); System.out.println("Main laeuft"); DrawTestRechteck drawTest = new DrawTestRechteck(); drawTest.init(); drawTest.start(); f.add("Center", drawTest); f.resize(300, 300); f.show(); } } class DrawPanel extends Panel { Vector lines = new Vector(); Vector streckeOderKreis = new Vector(); int x1,y1; boolean ziehen; int strecke; // 0 = strecke, 1 = kreis, 2 = Rechteck int x2,y2; public void init() { ziehen = false; strecke = 0; } public DrawPanel() { setBackground(Color.white); } public void setStrecke() { strecke = 0; } public void setRechteck() { strecke = 2; } public void setKreis() { strecke = 1; } public boolean handleEvent(Event e) { switch (e.id) { case Event.MOUSE_DOWN: x1 = x2 = e.x; y1 = y2 = e.y; ziehen = true; return true; case Event.MOUSE_UP: lines.addElement(new Rectangle(x1, y1, e.x, e.y)); // leichter Missbrauch von rectangle streckeOderKreis.addElement(new Rectangle(strecke,0,0,0)); ziehen = false; repaint(); return true; case Event.MOUSE_DRAG: x2 = e.x; y2 = e.y; repaint(); return true; case Event.WINDOW_DESTROY: System.exit(0); return true; default: return false; } } public void paint(Graphics g) { int np = lines.size(); int streckei; /* Zeichne alle Strecken und Ellipsen */ for (int i=0; i < np; i++) { Rectangle streckeip = (Rectangle)streckeOderKreis.elementAt(i); streckei = streckeip.x; Rectangle p = (Rectangle)lines.elementAt(i); if (streckei == 0) g.drawLine(p.x, p.y, p.width, p.height); else { if (streckei == 1) { if (p.height > p.y) g.drawOval(p.x, p.y, p.width-p.x, p.height-p.y); else g.drawOval(p.x, p.height, p.width-p.x, p.y-p.height); } else if (streckei == 2) { if (p.height > p.y) g.drawRect(p.x, p.y, p.width-p.x, p.height-p.y); else g.drawRect(p.x, p.height, p.width-p.x, p.y-p.height); } } } if (ziehen) { if (strecke == 0) {g.drawLine(x1, y1, x2, y2);} else { if (strecke == 1) { if (y2 > y1) g.drawOval(x1,y1,x2-x1,y2-y1); else g.drawOval(x1,y2,x2-x1,y1-y2); } else { if (y2 > y1) g.drawRect(x1, y1, x2-x1, y2-y1); else g.drawRect(x1, y2, x2-x1, y1-y2); } } } } } class SKWahl extends Panel { DrawPanel target; public SKWahl(DrawPanel target) { this.target = target; setLayout(new FlowLayout()); Choice SoderK = new Choice(); SoderK.addItem("Strecke"); SoderK.addItem("Ellipse"); SoderK.addItem("Rechteck"); SoderK.setBackground(Color.lightGray); add(SoderK); } public void paint(Graphics g) { Rectangle r = bounds(); g.setColor(Color.lightGray); g.draw3DRect(0, 0, r.width, r.height, false); } public boolean action(Event e, Object arg) { if (e.target instanceof Choice) { String choice = (String)arg; if (choice.equals("Strecke")) { target.setStrecke(); } else if (choice.equals("Ellipse")) { target.setKreis(); } else if (choice.equals("Rechteck")) { target.setRechteck(); } } return true; } } Ereignissteuerung nach dem Java Ereignis-Modell 1.1 Andere Modellvorstellung und Durchreichen“ der Ereignisse ” Modell 1.1- Strukturierung: • • • Ein Ereignis tritt bei einem Objekt auf (z.B. Button, Menü, . . . ) Dieses Ereignis wird in ein Ereignisobjekt verpackt und an einen Beobachter gesendet (Listener) Dieser Beobachter (Methode) enthält die Programmierung, wie nach Eintreten dieses Ereignisses zu verfahren ist. Swing: sehr ähnlich, aber andere Namen der Klassen: JLabel statt Label. P raktische Inf ormatik 2, SS 2005, F olien Java;4, (4. M ai2005) Seite 22 Ereignissteuerung zu 1.1 Programmierung: Registrierung der Listener an der Ereignis-Quelle Für jedes Ereignis eine eigene Methode. Vorteil: optimierte und gezielte Verteilung der Ereignisse. (Im Modell 1.0: Gießkannenprinzip) P raktische Inf ormatik 2, SS 2005, F olien Java;4, (4. M ai2005) Seite 23 Ereignissteuerung zu 1.1, Adapterklassen Adapterklassen: Zur Erleichterung der Programmierung Sind abstrakte Klassen, alle Methoden zur Ereignisbehandlung sind (leer) implementiert. Listener sind Unterklassen der Adapterklasse nur notwendigen Methoden werden überschrieben Im Beispiel anonyme Klasse mit new MouseAdapter () entsprechende Methode wird überschrieben P raktische Inf ormatik 2, SS 2005, F olien Java;4, (4. M ai2005) Seite 24 Beispiel zu 1.1-Ereignissteuerung import java.awt.*; import java.awt.event.*; import java.applet.*; public class KlickKlack extends Applet { Button klickButton = new Button("KlickKlack"); boolean geklickt = true; Color klick = new Color(255,255,0); Color klack = new Color(0,0,255); public void init() { add(klickButton); klickButton.addMouseListener( new MouseAdapter () { P raktische Inf ormatik 2, SS 2005, F olien Java;4, (4. M ai2005) Seite 25 public void mouseClicked(MouseEvent e) { Graphics g = getGraphics(); if (geklickt) g.setColor(klick); else g.setColor(klack); g.fillOval(0,0,200,200); // das original war g.fillOval(0,0,getWidth,getHeight); geklickt = !geklickt; } }); } } Kritikpunkte an der objektorientierten Programmierung ( Artikel von M. Broy, Informatik Spektrum, Februar 2002) Einige Kritikpunkte: • OO-Sprachen kennen keine Komposition von Klassen“ ” • Das OO-Ausführungsmodell ist sequentiell“ ” • Die Objektorientierung sagt uns nicht, wie wir das Verhalten von ” Schnittstellen definieren sollen“ Gemeint: Methodenaufruf und dessen operationale Semantik P raktische Inf ormatik 2, SS 2005, F olien Java;4, (4. M ai2005) Seite 27 • Vererbung verletzt das Geheimnisprinzip“ ” • Letzlich gibt es nur eine einzige, syntaktische Annahme: (die ” Unterklasse) hat mindestens dieselben Attribute und Methoden wie die Oberklasse“ • Kritik an der Wiederverwendbarkeit (sinngemäß:) neue Projekte ” werden sich i.a. eine eigene Klassenhierarchie schaffen, nicht auf eine bereits vorhandene Klassenhierarchie aufbauen“. • Multiple Dispatching“ fehlt. ” Das bezog sich auf Java1 1.4. In Java 5 gibt es durch Argumenttypen überladene Klassen, somit ist diese Kritik nicht mehr stichhaltig. • statische Analyse der Fernwirkung von Methodenaufrufen ist so ” gut wie unmöglich“