Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Programmierpraktikum Java SS 2005 Mag.Thomas Hilpold.

Ähnliche Präsentationen


Präsentation zum Thema: "Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Programmierpraktikum Java SS 2005 Mag.Thomas Hilpold."—  Präsentation transkript:

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

2 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 2 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) aButtonWButtonPeer JAVA VMNATIVE CODE (zB C++) (Windows) Operating System

3 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 3 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. aButtonWButtonPeer JAVA VMNATIVE CODE (zB C++) (Windows) Operating System

4 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 4 AWT-Funktionsweise Wann muß eine Komponente gezeichnet werden? Hier unterscheidet man zwei Arten: Systemverursachtes Zeichnen 1.Komponente erscheint zum ersten Mal auf dem Bildschirm 2.Größe und/oder Position der K ändert sich 3.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) aButtonWButtonPeer JAVA VMNATIVE CODE (zB C++) (Windows) Operating System

5 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 5 AWT-Funktionsweise Ablauf des Zeichnens in AWT Systemverursacht oder anwendungsverursacht: 1.Betriebssystem zeichnet einen Teil oder die ganze GUI- Komponente neu 2.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. 3.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) aButtonWButtonPeer JAVA VMNATIVE CODE (zB. x86) (Windows) Operating System

6 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 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 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 7 Benutzerschnittstellenkomponenten Hierarchie Oberklasse aller GUI- Komponenten -- Canvas

8 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 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 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 9 Die Klasse Canvas Eine leere GUI-Komponente zum Erstellen von eigenen GUI- Komponenten. Konstruktoren und Methoden Ereignisse Canvas() paint(Graphics g) keine besonderen, aber ! //+ inherited from Component // geerbt von Component // sollte überschrieben werden // und natürlich alle weiteren, // setForeGround(),...

10 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 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 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 11 Zusammenfassung AWT-Funktionsweise Peer-Klassen Ablauf des Zeichnens Neue Klasse: Canvas (Leinwand) für eigene GUI-Komponenten Überschreiben der paint()-Methode Bisher: Jetzt: Inhalt der paint(Graphics g)-Methode Grafikkontext Zeichnen von Linien, Rechtecken, Ovale,...

12 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 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 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 13 Grafik in Java 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. Koordinatensystem 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 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 14 Grafik in Java 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. Grafikkontext

15 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 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 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 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 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 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 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 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 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 19 Font und Fontmetrics Die Klasse Font Repräsentiert eine Schriftart: Konstruktion mit: Font f = new Font("Monospaced", Font.BOLD, 14) 3 Standard Namen: "MonoSpaced", "Serif", "SansSerif", 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. Einige Methoden

20 Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 20 Font und Fontmetrics Die Klasse Fontmetrics 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 "Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Programmierpraktikum Java SS 2005 Mag.Thomas Hilpold."

Ähnliche Präsentationen


Google-Anzeigen