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 15. Vorlesung WS 2004/2005 Übersicht • Benutzeroberflächen – Interaktive Graphik – Änderung der Liniendicke Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05 2 Interaktives Zeichnen • bisher: Zeichnen fest in „paint“ programmiert – Objekte wurden in "paint" erzeugt und gemalt • Interaktives Zeichnen: – Objekte werden durch Mausklick erzeugt und an Mausposition gezeichnet Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05 3 Interaktives Zeichnen: Übersicht • Interaktives Zeichnen: 3 Schritte 1. Liste (LinkedList) mit zu zeichnenden Objekten (Shapes) – Liste ist Attribut des JFrame – Liste muss mit new im Konstruktor des JFrame erzeugt werden 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 – Klickkoordinaten: getX()/getY() des MouseEvents – Aufruf der Methode repaint() des JFrame löst Aufruf von paint() aus Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05 4 Interaktives Zeichnen - Beispiel I/II public class MeinFenster extends JFrame { LinkedList ll; //Attribut des JFrame 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 5 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 6 Änderung von Linieneigenschaften • z.B. Dicke, Linienübergänge, Linienform (z.B. gestrichelt) • Linieneigenschaften: Objekt der Klasse BasicStroke • einfachster Konstruktor: BasicStroke(float width) • Objekt von BasicStroke muss erzeugt werden und dem Graphics2D-Objekt mit Methode setStroke(BasicStroke) übergeben werden • Beispiel: public void paint(Graphics g){ super.paint(g); Graphics2D g2d = (Graphics2D) g; g2d.setStroke(new BasicStroke(7)); ..... Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05 7 Liniendicke und Verbindungsart Konstruktoren ( hier interessante) BasicStroke stroke = new BasicStroke( width); BasicStroke stroke = new BasicStroke( float width, int cap, int join); Strichstärke (width) Form des Linienendes (cap) : 2. CAP_ROUND 1. CAP_BUT 3. CAP_SQUARE Form des Linienverbindung (join) : 1. JOIN_BEVEL 2. JOIN_MITER 3. JOIN_ROUND Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05 8 Liniendicke und Verbindungsart: Beispiel • public void paint(Graphics g){ super.paint(g); Graphics2D g2d = (Graphics2D) g; g2d.setStroke( new BasicStroke(7, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_MITER) ); ..... Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05 9 Übungsaufgabe • Programmiert ein JFrame, das auf Mausklick Kreise an der Klickposition darstellt. Die Liniendicke der Kreise soll interaktiv (Textfeld + Button) änderbar sein. Gröger, Dörschlag, Plümer - Einführung in Java - 1. Semester - WS 04/05 10