Graphische Programmierung: GUIs: graphical user interfaces

Werbung
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“
Herunterladen