Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Programmierpraktikum Java SS 2005

Ähnliche Präsentationen


Präsentation zum Thema: "Programmierpraktikum Java SS 2005"—  Präsentation transkript:

1 Programmierpraktikum Java SS 2005
Mag.Thomas Hilpold Institut für Wirtschaftsinformatik Software Engineering JKU Linz Termin 12 (AWT, Graphics)

2 NATIVE CODE (zB C++) (Windows)
AWT-Funktionsweise Die Darstellung von AWT-Komponenten Jeder Bildpunkt einer GUI-Anwendung muß berechnet und gezeichnet werden Grundidee: jede GUI-Komponente ist selbst dafür verantwortlich In AWT gibt es zwar Java-GUI-Klassen wie Label, Button,...; das tatsächliche Zeichnen erfolgt allerdings über sog. Peer-Klassen vom Betriebssystem (zB. Windows) Eine Peer-Klasse stellt die Verbindung vom Java-System zur tatsächlichen GUI-Komponente des gerade verwendeten Betriebssystems her. Dadurch hat man als Programmierer wenig Einfluß auf die Darstellung der Komponenten (zB. runder Button unmöglich) aButton WButtonPeer JAVA VM NATIVE CODE (zB C++) (Windows) Operating System

3 NATIVE CODE (zB C++) (Windows)
AWT-Funktionsweise Die Darstellung von AWT-Komponenten (2) Beim Programmieren in Java hat man zB ein Button-Objekt, bei dem man bestimmte Eigenschaften setzten kann, die sich auf die Darstellung auswirken (zB. setText(), setForeground(), setFont(),...) Das tatsächliche Zeichnen der Darstellung des Button übernimmt das Betriebssystem. "Die Peer Klasse verbindet Java mit dem Betriebssystem." Um dieses Zeichnen der Darstellung braucht man sich üblicherweise nicht zu kümmern. aButton WButtonPeer JAVA VM NATIVE CODE (zB C++) (Windows) Operating System

4 NATIVE CODE (zB C++) (Windows)
AWT-Funktionsweise Wann muß eine Komponente gezeichnet werden? Hier unterscheidet man zwei Arten: Systemverursachtes Zeichnen Komponente erscheint zum ersten Mal auf dem Bildschirm Größe und/oder Position der K ändert sich Darstellung der Komponente wurde beschädigt (häufig!) Anwendungsverursachtes Zeichnen Aufgrund einer Änderung des internen Zustandes der Komponente muß neu gezeichnet werden (zB. setText("x"), setEnabled(false), setForeground(c), addItem(x); auch Mausklick auf Button) aButton WButtonPeer JAVA VM NATIVE CODE (zB C++) (Windows) Operating System

5 NATIVE CODE (zB. x86) (Windows)
AWT-Funktionsweise Ablauf des Zeichnens in AWT Systemverursacht oder anwendungsverursacht: Betriebssystem zeichnet einen Teil oder die ganze GUI-Komponente neu AWT-System ruft Methode update(Graphics g) bei jeder Komponente auf, die gerade neu gezeichnet wurde. Dies ist nur bei AWT-Behältern von Bedeutung, da diese hier ihren Hintergrund löschen. Anschließend wird paint(Graphics g) aufgerufen. Hier hat der Ersteller eigener GUI-Komponenten die Möglichkeit in die Darstellung einzugreifen, indem er diese Methode überschreibt und Code zum Zeichnen einfügt. (AWT-Event Thread) aButton WButtonPeer JAVA VM NATIVE CODE (zB. x86) (Windows) Operating System

6 AWT-Funktionsweise Zusammenfassung
Das Zeichnen der Darstellung von AWT-Komponenten übernimmt grundsätzlich das Betriebssystem (Windows, MacOs) Zusätzlich werden im Anschluß an das Zeichnen (durch das Betriebssystem) die Methoden update() und paint() aufgerufen. In paint() kann der Programmierer durch Ableiten und Überschreiben zusätzlichen Zeichencode einfügen. Dies ist bei Standard-AWT-GUI-Komponenten nur selten sinnvoll aber möglich. Die eigene Zeichnung erscheint zusätzlich zur Darstellung durch das Betriebssystem. Es gibt eine spezielle Komponente, die für diesen Zweck vorgesehen wurde (java.awt.Canvas). Unterschied AWT/SWING: Darstellung der Komponenten erfolgt in SWING vollständig in Java (nicht durch das Betriebssystem, keine Peer-Klassen). -> mehr Flexibilität

7 Benutzerschnittstellenkomponenten
Hierarchie Oberklasse aller GUI-Komponenten -- Canvas

8 Die Klasse Canvas Allgemeines Canvas, engl. = Leinwand, Gemälde.
Canvas ist eine "leere" GUI-Komponente ohne besondere Darstellung und Funktionalität Man muß eine Unterklasse bilden und paint() überschreiben, um Zeichnen zu können. Diese Klasse eignet sich nicht nur zum Zeichnen, sondern man kann natürlich auch auf Benutzerereignisse reagieren. Beispiele/Ideen: SpaceView-Klasse, die alle MovingObjects darstellt und zusätzlich jeweils eines per Mausklick anwählen läßt. Graph-Plotter für mathematische Funktionen viele viele weitere;

9 Die Klasse Canvas Eine leere GUI-Komponente zum Erstellen von eigenen GUI-Komponenten. Konstruktoren und Methoden Canvas() paint(Graphics g) // geerbt von Component // sollte überschrieben werden // und natürlich alle weiteren, // setForeGround(), ... Ereignisse keine besonderen, aber ! //+ inherited from Component

10 Die Klasse Canvas Hinweise zum Überschreiben von paint(g)
Eine GUI-Komponente ist rechteckig, sie hat Breite und Höhe Wann und warum paint() aufgerufen wird, kann kaum vorhergesehen werden (systemverursacht, anwendungsverursacht) Deshalb muß paint() so implementiert werden, daß jederzeit die gesamte Darstellung in Abhängigkeit von Breite und Höhe gezeichnet wird. paint() darf nie direkt aufgerufen werden. Sollte ein Aktualisieren der Darstellung der Komponente erwünscht sein, muß repaint() aufgerufen werden. Ein repaint()-Aufruf führt letztlich zu einem paint()-Rückruf von AWT.

11 Zusammenfassung Bisher: Jetzt: AWT-Funktionsweise Peer-Klassen
Ablauf des Zeichnens Neue Klasse: Canvas (Leinwand) für eigene GUI-Komponenten Überschreiben der paint()-Methode Jetzt: Inhalt der paint(Graphics g)-Methode Grafikkontext Zeichnen von Linien, Rechtecken, Ovale, ...

12 Grafik in Java Allgemeines
Gezeichnet wird normalerweise in überschriebenen paint(g)-Methoden und zwar im AWT-Event Thread Wir behandeln 2D-Grafik Dabei werden wir vorwiegend die Klasse Canvas verwenden. Möglich ist dies grundsätzlich bei allen AWT-Klassen Sinnvoll meist nur bei Frame, Dialog, Window Zwei wesentliche Konzepte zur Grafikdarstellung: Koordinatensystem Grafikkontext

13 Grafik in Java Koordinatensystem p(0,0) ist links oben.
p(getWidth()-1, getHeight()-1) ist rechts unten. Dies gilt für jede GUI-Komponente (Vorsicht: Hierarchie). Die Positionen x, y einer GUI-Komponente beziehen sich auf deren Position im übergeordneten Container. Position einer Komponente ist für deren Darstellung kaum von Belang. 0,0 getWidth()-1, getHeight()-1 Positionen stellt man sich als unendlich kleine Punkte zwischen den Pixel vor. Von Zeichenoperationen werden diejenigen Pixel(Bildpunkte) berührt, die rechts unterhalb der eigentlichen Position liegen (deshalb –1).

14 Grafik in Java Grafikkontext
In der paint(Graphics g)-Methode wird ein Objekt vom Typ java.awt.Graphics übergeben. Dieses Objekt enthält eine Reihe von Methoden zur Ausgabe von Grafik (z.B. drawLine()). Zusätzlich hat das Objekt eine Reihe von Zuständen, die die Grafikausgabe beeinflussen (zB. aktuelle Zeichenfarbe). Beim Aufruf der Methoden des Grafikkontext-Objekts wird auf ein Ausgabegerät gezeichnet (meist Bildschirm, aber auch Drucker...) Der Grafikkontext bietet also auch eine Abstraktion vom tatsächlichen Ausgabegerät. Aus der Sicht des Programmierers macht es keinen Unterschied, ob er auf einen Drucker, in eine Bild-Datei oder auf den Bildschirm zeichnet. Ein Graphics-Objekt erzeugt man niemals selbst.

15 Grafik in Java Beispiel public class PaintTestCanvas1 extends Canvas {
public void paint(Graphics g) { for (int x = 0; x <= getWidth()-1; x = x + 1) { g.setColor(new Color(0, (int)(255.0/getWidth()*x), (int)(255.0/getWidth()*x))); g.drawLine(x, 0, getWidth()-x, getHeight()-1); } System.err.println(Thread.currentThread()); } }

16 Die Klasse Graphics Allgemeines Abstrakte Klasse
Objekte von Unterklassen werden üblicherweise vom AWT-System in Abhängigkeit des Ausgabegerätes erzeugt und von uns über die Typvereinbarung Graphics genutzt. Er enthält eine Reihe von Zustandsinformation, die sich auf das Zeichnen auswirken: Color (gegenwärtige Zeichenfarbe) Font (gegenwärtige Schriftart für Text) ein sog. Clip (Zeichenoperationen wirken sich nur innerhalb des Clip aus) gegenwärtige logische Pixeloperation (XOR oder Paint) Die Komponente, auf der gezeichnet werden soll. So hängt z.B. die Operatoin drawLine(x1,y1,x2,y2) von XOR-Mode, Color und Clip ab. (Zurück zum Beispiel (wegen Clip))

17 Die Klasse Graphics Zeichenmethoden
clearRect(int x,int y,int w, int h) copyArea(x,y, w,h, dx, dy) draw3DRect(x,y,w,h, boolean raised) drawArc(x,y,w,h, int startAngle, int arcAngle) drawLine(x1,y1,x2,y2) drawOval(x,y,w,h) drawPolygon(x[], y[], int nPoints) drawPolyLine(x[], y[], int nPoints) drawRect(x,y,w,h) drawRoundRect(x,y,w,h, int arcWidth, int arcHeight) drawString(String str, x,y) fill3DRect(x,y,w,h, boolean raised) fillArc(...) fillOval(...) fillPolygon(...) fillRoundRect(...) drawImage(Image img, x,y, ImageObserver obs) // v. n. relevant. drawImage(...) // vorläufig nicht relevant

18 Die Klasse Graphics Weitere Methoden (für Zustandsinformationen)
translate(int x, int y) setPaintMode() setXORMode(Color c1) setFont(Font f) setColor(Color c) setClip(x,y,w,h) getFontMetrics():FontMetrics getFont():Font getColor():Color getClipBounds():Rectangle .... // Verschieben des Koordinatenursprungs // normalen Zeichenmodus setzen (default) // XOR-Modus momentane Farbe xor c1 // Schriftart setzen // Zeichenfarbe setzten // setzt neues Clip (Pixel nur innerhalb betroffen) // holt Metrik-informationen zur Font // zB. wieviele Pixel breit/hoch ist "1. Object" // aktuelle Schriftart // Rechteckigen Clip-Bereich holen; Auch wenn eine Linie über diesen hinausgeht, wird nur innerhalb gezeichnet.

19 Font und Fontmetrics Die Klasse Font Einige Methoden
Repräsentiert eine Schriftart: Konstruktion mit: Font f = new Font("Monospaced", Font.BOLD, 14) 3 Standard Namen: "MonoSpaced", "Serif", "SansSerif", Einige Methoden Font (String name, int style, int size) getSize():int // Schriftgröße in Pixel isBold():boolean // fett isItalic():boolean // kursiv static final int PLAIN // constants for Style static final int BOLD static final int ITALIC ... uvm.

20 Font und Fontmetrics Die Klasse Fontmetrics nützliche Methoden:
Stellt typographische Informationen über einzelne Zeichen und Strings in konkreten Schriftarten zur Verfügung. Erreicht man am besten über Grafikkontext: FontMetrics fm = g.getFontMetrics(); oder fm = g.getFontMetrics(aFont); nützliche Methoden: charWidth(char ch):int stringWidth(String s):int getAscent():int // Oberlänge getDescent():int // Unterlänge getHeight():int // Höhe getLeading():int // Zeilenabstand


Herunterladen ppt "Programmierpraktikum Java SS 2005"

Ähnliche Präsentationen


Google-Anzeigen