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 Informatik 2, SS 2005, F olien Java;4, (4. Mai2005) Seite 1
GUIs: graphical user interfaces Graphische Elemente: Fenster mit Schiebeleisten, waagrechte/senkrechte Menüs, Radioknöpfe, Symbole zum Anklicken (Icons), Textfelder P raktische Informatik 2, SS 2005, F olien Java;4, (4. Mai2005) 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 Informatik 2, SS 2005, F olien Java;4, (4. Mai2005) 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 Informatik 2, SS 2005, F olien Java;4, (4. Mai2005) 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 Informatik 2, SS 2005, F olien Java;4, (4. Mai2005) Seite 5
Graphische Zeichenfläche graphischer, farbiger Bildschirm, mit ca. 1000 X 1000 Bildpunkte (Pixel) Pixel-Koordinatensystem (x,y). (0,0) ist links oben. Eingabekanäle: Tastatur: Zeiger-Position und Tasteneingabe Maus: Position, Click; Art des Clicks P raktische Informatik 2, SS 2005, F olien Java;4, (4. Mai2005) Seite 6
Vordefinierte Fenstertypen und graphische Elemente Oberste Klasse ist Component Unterklassen sind: Button Canvas Checkbox Choice Container Label List Scrollbar Textcomponent 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 P raktische Informatik 2, SS 2005, F olien Java;4, (4. Mai2005) Seite 7
Applets Applet ist Unterklasse von Panel Panel-Methoden stehen einem Applet somit zur Verfügung P raktische Informatik 2, SS 2005, F olien Java;4, (4. Mai2005) 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 Informatik 2, SS 2005, F olien Java;4, (4. Mai2005) Seite 9
Component - Methoden. Beispiele Größe und Position können ermittelt und verändert werden. bounds(), inside(), location(), move(), size(),... Farbe des Hintergrunds, Vordergrunds: getbackground(), setforeground(),.... Ereignisse Ermitteln und Handhabung der Ereignisse mouseup(), handleevent(), postevent(),... Zeichnen innerhalb der Komponente, Neuzeichnen des Bildes. paint(), repaint(), update() Status Feststellen, ob Komponente aktiv, usw. Bei Definition einer Unterklasse können bzw. müssen bestimmte Methoden in diesen Klasse überschrieben werden. P raktische Informatik 2, SS 2005, F olien Java;4, (4. Mai2005) 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 Informatik 2, SS 2005, F olien Java;4, (4. Mai2005) 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 Informatik 2, SS 2005, F olien Java;4, (4. Mai2005) 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 Informatik 2, SS 2005, F olien Java;4, (4. Mai2005) 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 Informatik 2, SS 2005, F olien Java;4, (4. Mai2005) 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 Informatik 2, SS 2005, F olien Java;4, (4. Mai2005) 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 Informatik 2, SS 2005, F olien Java;4, (4. Mai2005) 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 Informatik 2, SS 2005, F olien Java;4, (4. Mai2005) 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