Programmierpraktikum Java SS 2005

Slides:



Advertisements
Ähnliche Präsentationen
Blue J.
Advertisements

Kapselung , toString , equals , Java API
Progwerkstatt JAVA Klasse, Objekte, Konstruktoren, Methoden
Java: Reversi Spielbrett
Java: Objektorientierte Programmierung
Java2D Richard Göbel.
Java: Grundlagen der Objektorientierung
Abstrakte Klassen.
Ein Beispiel in Java.
Polymorphie (Vielgestaltigkeit)
Polymorphie (Vielgestaltigkeit)
Interface bzw. Schnittstelle anschaulich: Hüllenklasse
Sommersemester 2003 Lars Bernard
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 6 Model-View-Controler als Grundlage für Nutzerschnittstellen Sommersemester 2003 Lars Bernard.
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 5 Polymorphismus Sommersemester 2003 Lars Bernard.
Sommersemester 2004 Jan Drewnak Entwicklung und Einsatz von Geosoftware I Praktikum Sitzung 8 Sitzung 8: Zeichnen in Java.
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 7 User Interfaces in Java Sommersemester 2003 Lars Bernard.
AWT – Detailbetrachtung Java 3D – Seminar im Wintersemester 2002/2003 Christian Schneider.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer, Dr. Gerhard Gröger, Dipl.-Ing. D. Dörschlag Einführung in die Programmierung mit Java.
Java-Kurs Grafik Julian Drerup.
Programmieren mit JAVA Teil V. Grafikausgabe mit JAVA, das AWT Java wurde von Anfang an mit dem Anspruch entwickelt, ein vielseitiges, aber einfach zu.
Programmieren mit JAVA
Vererbung Spezialisierung von Klassen in JAVA möglich durch
1DVG3 - Paint Paint ein Zeichenprogramm. DVG3 - Paint 2 Paint – ein Zeichenprogramm.
1 Animation (Doublepuffering) Vorlesung: Datenverarbeitung Grundlagen 3 Fachbereich II - Mathematik Rolf Heitzenröder.
1DVG3 - anonyme Klassen Anonyme Klassen. DVG3 - anonyme Klassen 2 Syntax new BasisKlasse(Parameterliste) { Modifikationen und Erweiterungen der Basisklasse.
DVG A bstract W indow T oolkit. DVG Als standardisierte portable Grafikschnittstelle existiert in JAVA das Package AWT - Abstract Window.
07-GraphischeObjekte Graphische Objekte in EMMA301Paint.
DVG Klassen und Objekte
FH-Hof Java2D - Grundlagen Richard Göbel. FH-Hof Java2D - Funktionen Java2D unterstützt: das Zeichnen von Grafiken die Darstellung von Texten die Darstellung.
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Sommersemester 2004 Jan Drewnak Entwicklung und Einsatz von Geosoftware I Praktikum Sitzung 6 Sitzung 6: Model-View-Controller als Grundlage.
Sommersemester 2004 Jan Drewnak Entwicklung und Einsatz von Geosoftware I Praktikum Sitzung 7 Sitzung 7: User Interfaces in Java.
Java ohne Kara. Java ohne Kara Ab jetzt: Java ohne Kara Ziel: Erfahrungen sammeln mit ersten Java Programmen.
Applets Java für’s Web.
Objektorientiertes Programmieren
CuP - Java Elfte Vorlesung Montag, 11. November 2002.
Copyright 2011 Bernd Brügge, Christian Herzog Grundlagen der Programmierung TUM Wintersemester 2011/12 Kapitel 11, Folie 1 2 Dr. Christian Herzog Technische.
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut.
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut.
Java-AG Benutzeroberflächen Juni 2001 Michael Haas.
Algorithmen und Datenstrukturen Übungsmodul 8
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Thomas Hilpold: Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger.
Polymorphie (Vielgestaltigkeit). Wenn eine Methode, wie z.B. print für verschiedene Programmteile steht (und z.B. einmal Objekte verschiedener Klassen.
Algorithmen und Datenstrukturen 1 SS 2002
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Programmierpraktikum Java SS 2005 Mag.Thomas Hilpold.
Algorithmen und Datenstrukturen 1 SS 2002
Java-Kurs Übung Benutzeroberflächen und Graphik
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
Java-Kurs Übung Benutzeroberflächen und Graphik Frames (Fenster)
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Algorithmen und Datenstrukturen 1 SS 2002
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Java-Kurs Übung Besprechung der Hausaufgabe
Einführung in die Programmierung mit Java
Institut für Kartographie und Geoinformation Prof. Dr. L. Plümer, Dipl.-Ing. D. Dörschlag, Dr. G. Gröger Einführung in die Programmierung mit Java 13.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer, Dr. Thomas H. Kolbe Einführung in die Programmierung mit Java 9. Vorlesung WS 2001/2002.
Einführung in die OOP in Java
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Objektorientierte Programmierung (OOP)
Abstrakte Klassen und das Interface-Konzept
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Programmierpraktikum Java SS 2005 Mag.Thomas Hilpold.
GUI Programmierung in Java Branimir Djordjevic. GUI - Wichtige Begriffe -  Die Swing-Bibliothek in Java stellt zum Beispiel die folgenden Windows zur.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Vererbung in Java. public abstract class Form { protected int breite; protected int hoehe; protected String farbe; /** * Erzeuge eine Form der Breite.
Java-Kurs Übung Grafik in Java - das Abstract Windowing Toolkit
Java-Kurs Übung Klassen und Objekte: Vererbung (Fortsetzung)
 Präsentation transkript:

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

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

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

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

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

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

Benutzerschnittstellenkomponenten Hierarchie Oberklasse aller GUI-Komponenten -- Canvas

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;

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

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.

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, ...

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

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).

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.

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()); } }

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))

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

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.

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.

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