Kein Folientitel - Institut für Geodäsie und Geoinformation der

Werbung
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
14. Vorlesung WS 2004/2005
Übersicht
• Benutzeroberflächen
– Menüs
– Einfache Graphik
– Dialog zur Farbauswahl
– Listen
– Interaktive Graphik
Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05
2
Menüs
JMenue
JMenueItem
JMenueBar
Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05
3
Menüs: Schritt 1
2. Klick
1. Klick
Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05
4
Menüs: Schritt 2
2. Klick
1. Klick
Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05
5
Menüs: Schritt 3
2. Klick
1. Klick
Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05
6
Menüs: Zwischenergebnis
Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05
7
Menüs: Schritt 4 - Beschriftung hinzufügen
Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05
8
Menüs: Schritt 5 - Methode hinzufügen
Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05
9
Menüs: Methode, die auf Klick reagiert
Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05
10
Graphik: Methode "paint"
• Graphik wird erzeugt durch Überladen der Methode
"paint" von "JFrame" (Polymorphismus)
• "paint" wird automatisch bei jedem Neuaufbau des
Bildschirms aufgerufen
• "paint" muss "paint" der Oberklasse aufrufen
• "paint" erhält als Parameter ein Objekt der Klasse
"Graphics"
• Zeichnen: Aufruf von Methoden für "Graphics"-Objekt
• Paket "java.awt.*" muss importiert werden
Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05
11
Zeichnen in Methode "paint" von JFrame
•
Beispiel:
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.cyan);
g.drawLine(30,40,100,80);
g.drawLine(100,80,50,190);
}
Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05
12
Methoden der Klasse „Graphics“
• drawPolygon(int[] xPoints, int[] yPoints, int nPoints)
• drawString(String str, int x, int y)
drawPolyline(int[] xPoints, int[] yPoints, int nPoints)
• drawOval(int x, int y, int width, int height)
• drawRect(int x, int y, int width, int height)
• fillRect(int x, int y, int width, int height)
• setColor(Color c), z.B. setColor(Color.cyan)
• weitere Methoden in JavaDoc
Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05
13
vorher: Größe des JFrame ändern
public MeinFrame() {
initComponents ();
pack ();
setSize(300,300);
}
Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05
14
Übungsaufgabe I
• Erzeugt ein JFrame und zeichnet darin die
französische Fahne
Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05
15
Übungsaufgabe II
• Erzeugt ein JFrame und zeichnet darin die ein
buntes Segelboot mit Segeln und Bullaugen
Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05
16
Alternative: Graphics2D statt Graphics
• Bessere Behandlung der Geometrie, von
Koordinatentransformationen, Farben und Texten
• Unterklasse Graphics2D statt Graphics in paint
(Typumwandlung erforderlich)
• Graphics2D hat Methode draw(Shape s)
– statt Methoden drawString, drawPolygon,
drawPolyline bei Graphics
• Graphics2D hat Methode fill(Shape s)
• Shapes können sein:
– Polygon, RectangularShape, Rectangle, Area, Line2D,
GeneralPath, QuadCurve2D, CubicCurve2D, Ellipse2D, ...
• Shapes sind eigene Objekte
• Paket: java.awt.geom
Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05
17
Beispiel
public void paint(Graphics g) {
//Typkonvertierung zu Graphics2D
Graphics2D g2d = (Graphics2D) g;
//Erzeugung der Shapes
Point2D p1 = new Point2D.Double(50,30);
Point2D p2 = new Point2D.Double(70,80);
Point2D p3 = new Point2D.Double(240,180);
Line2D l1 = new Line2D.Double(p1,p2);
Line2D l2 = new Line2D.Double(p2,p3);
//Zeichnen
g2d.setColor(Color.cyan);
g2d.draw(l1);
g2d.draw(l2);
}
Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05
18
Klasse „GeneralPath“
• für Polylinien bzw. Polygone
• „Unterklasse“ von Shape
• Methoden:
–
–
–
–
GeneralPath(): Konstruktor
append(Shape s, boolean connect): Fügt s an GeneralPath an
lineTo(float x, float y): Fügt Punkt (x,y) an
closePath(): schliesst Polygon
Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05
19
Beispiel
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
Point2D p1 = new Point2D.Double(50,30);
Point2D p2 = new Point2D.Double(70,80);
Line2D l1 = new Line2D.Double(p1,p2);
GeneralPath gp = new GeneralPath();
gp.append(l1,true);
gp.lineTo(67,99);
gp.closePath();
g2d.setColor(Color.cyan);
g2d.draw(gp);
g2d.setColor(Color.red);
g2d.fill(gp);
}
Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05
20
Interaktiv Farben setzen
• JColorChooser: Vordefinierter Dialog für Farbauswahl
• Aufruf:
Color c = JColorChooser.showDialog
(Parent, "Titel", Color);
– Parent: Referenz auf JFrame, aus dem ColorChooser aufgerufen
wird (eigentlich this-Zeiger)
– Titel: Beschriftung auf Leiste des Dialogs
– Color: voreingestellte Farbe, z.B. Color.blue
• Liefert nach Klicken von OK die ausgewählte Farbe zurück
• Parent: bei Aufruf aus Event-Handler:
this-Zeiger nicht zugreifbar (da in eingebetteter Klasse)
• Lösung: Definition eines Attributs des JFrames, dem im
Konstruktor this zugewiesen wird.
Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05
21
JColorChooser
Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05
22
Menüs: Methode, die auf Klick reagiert
Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05
23
Explizites Auslösen von "paint"
• "paint" wird automatisch bei Neuaufbau des Fensters
aufgerufen (z.B. nach Verdeckung, nach Maximieren,
.....)
• explizit kann "paint" durch Aufruf von repaint();
ausgelöst werden (Methode von JFrame)
– z.B. wenn Farbeinstellungen geändert werden, oder neue
Objekte gezeichnet werden sollen
Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05
24
Hausaufgabe
• Erzeugt ein JFrame, in dem interaktiv (über das
Menü) alle Fahnen (alle die mit 3 senkrechten
oder 3 waagerechten Balken) gezeichnet werden
können. Interaktion soll über Menüs erfolgen.
Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05
25
Exkurs: Listen
•
LinkedList: Datentyp für Liste (vgl. Vorlesung "Diskrete
Mathe")
Anzahl der Elemente beliebig erweiterbar (im Gegensatz
zu Arrays)
Elementtyp: Klasse Object
java.util.LinkedList muss importiert werden
Methoden von LinkedList:
•
•
•
•
•
•
•
•
•
boolean add(Object o)
void add(int index, Object element)
Object get(int index)
//Index beginnt bei 0
void clear()
int size()
•
weitere Methoden in JavaDoc
Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05
26
Exkurs: Listen - Beispiel
import java.util.LinkedList;
.....
LinkedList l = new LinkedList(); //Listenobj. erzeugen
Person p = new Person();
Professor pr = new Professor();
Assistent a = new Assistent();
l.add(p);
l.add(pr);
l.add(a);
Objekt o = l.get(1); //o referenziert den Prof.
Professor pp = (Professor) o; //Typkonvertierung
System.out.println(l.size()); //gibt 3 aus
l.clear();
System.out.println(l.size()); //gibt 0 aus
Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05
27
Exkurs: Listen - Iteratoren
• dienen zum sequentiellen Durchlaufen durch eine Liste
• Iteratoren sind eigene Objekte, die mit der Liste eng
verbunden sind
• Iterator-Objekt wird durch Aufruf der Methode iterator() für Liste
geliefert
• Methoden der Klasse Iterator:
• boolean hasNext(): wahr, wenn Durchlauf noch nicht fertig
• Object next(): liefert nächstes Listenelement, setzt Zeiger ein
Element weiter
• Iteratoren führen intern einen Zeiger auf Listenelemente
mit
• Iterator ist verbraucht, wenn Ende der Liste erreicht
• Eine Liste kann beliebig viele Iteratoren haben
Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05
28
Exkurs: Iteratoren - Beispiel
import java.util.LinkedList;
LinkedList ll = new LinkedList();
// Liste mit Werten füllen:
ll.add(new Person());
ll.add(new Professor());
//Liste Durchlaufen:
Iterator it = ll.iterator();
while(it.hasNext()) {
Object o = it.next();
System.out.println(o);
}
Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05
29
Interaktives Zeichnen in „paint“
•
•
bisher: Zeichnen fest in „paint“ programmiert
Interaktives Zeichnen: 3 Schritte
1. Attribut des JFrame der Klasse LinkedList (dient zur
Aufnahme der zu zeichnenden Shapes)
2. in „paint“ wird LinkedList durchlaufen und für jedes Shape
darin die Methode „draw“ aufgerufen
3. Die LinkedList wird mit Shapes gefüllt in z.B. Methode, die
auf Mausklicks in JFrame reagiert
– Aufruf der Methode repaint() des JFrame löst Aufruf von
paint() aus
– Klickkoordinaten: getX()/getY() des MouseEvents
Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05
30
Interaktives Zeichnen - Beispiel I/II
public class MeinFenster extends JFrame {
LinkedList ll;
public MeinFenster() {
super();
ll = new LinkedList();...}
public void paint(Graphics g){
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
Iterator it = ll.iterator();
while(it.hasNext()) {
Object o = it.next();
Shape s = (Shape) o;
g2d.fill(s);}
Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05
31
Interaktives Zeichnen - Beispiel II/II
public void mouseClicked(java.awt.event.MouseEvent e) {
ll.add(new Rectangle(e.getX(), e.getY(),5,8));
repaint();
}
Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05
32
Herunterladen