Institut für Kartographie und Geoinformation Prof.-Dr. Lutz Plümer, Dr. Gerhard Gröger, Dipl.-Ing. Dirk Dörschlag Einführung in die Programmierung mit Java 13. Vorlesung WS-03/04 Die letzte Hausaufgabe Malprogramm der vollständige und kommentierte Quellcode für mein Malprogramm steht im Internet und auf den Folien der letzen Vorlesung. Weite Teile werden in dieser Vorlesung wiederholt ! IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 2 Mein Malprogramm Smile IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 3 Mein Malprogramm Smile Anwendungsmenü : JMenuBar + JMenu + JMenuItem Funktionsknöpfe : JToolBox + JToggleButton Leinwand zum Bemalen: JPanel IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 4 Mein Malprogramm das Leinwandkoordinatensystem Anwendungsmenü : JMenuBar + JMenu + JMenuItem Funktionsknöpfe : JToolBox + JToggleButton (0,0) x + Leinwand zum Bemalen: JPanel y + IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 5 Mein Malprogramm Smile class Smile extends JFrame { Leinwand display; ... } Anwendungsmenü : JMenuBar + JMenu + JMenuItem Funktionsknöpfe : JToolBox + JToggleButton Leinwand zum Bemalen: JPanel Es gibt 2 QuellcodeDateien : • Leinwand.java • Smile.java class Leinwand extends JPanel { ... } IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 6 Mein Malprogramm Die Leinwand der Anwendung hinzufügen import javax.swing.*; import java.awt.*; class Smile extends JFrame { Leinwand display; public Smile(){ display = new Leinwand( this); this.getContentPane().setLayout( new BorderLayout()); this.getContentPane().add( display, BorderLayout.CENTER); initComponets(); } ... } Alle roten Anweisungen sind von Hand zu programmieren ! Den Rest erzeugt Forte beim Anlegen eines JFrame automatisch ! IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 7 Mein Malprogramm Die Leinwand bemalen import java.awt.*; class Leinwand extends JPanel { private Smile parent; public Leinwand( Smile parent){ this.parent = parent; initComponents(); } ... public void paintComponent( Graphics g){ super.paintComponent( g); Graphics2D g2d = (Graphics2D) g; g2d.drawOval( (30 – 5), (30 – 5), 10,10); ... } ... } Alle roten Anweisungen sind von Hand zu programmieren ! Den Rest erzeugt Forte beim anlegen eines JPanel automatisch ! IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 8 Exkurs Java an sich Referenzvariablen zeigen auf Objekte/Instanzen Referenzvariablen sind u.a. Variablen, Attribute oder Parameter vom Typ einer Klasse oder eines Interfaces Sind konkrete Instanzen einer bestimmten Klasse (= Typ des Objekts) mit einer eigenen Menge von Methoden und Attributen Weiß welche Methoden das Objekt mindestens hat ! Weiß, was eine Methode macht, wenn sie aufgerufen wird ! Methodenkopf Methodenrumpf public void zeichnen_auf( Graphics2d g2d) public void zeichnen_auf( Graphics2d g2d) { g2d.drawOval(x,y,breite, hoehe); } IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 9 dynamisches Malen = malen mittels Nutzerinteraktion Ziel : dynamisch Objekte auf die Oberfläche malen IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 10 dynamisches Malen auf Knopfdruck auf Mausklick Ziel : dynamisch Objekte auf die Oberfläche malen IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 11 dynamisches Malen auf Knopfdruck auf Mausklick Ziel : dynamisch Objekte auf die Oberfläche malen Was gemalt wird, ist je nach Typ des Objekts ganz unterschiedlich ! Kann nur Objekte brauchen, die sich selbst zeichnen können + zeichnen_auf(Graphics2D g2d):void ! UML – Notation ! IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 12 dynamisches Malen auf Knopfdruck auf Mausklick Ziel : dynamisch Objekte auf die Oberfläche malen Linie Kreis Punkt Ellipse Kann nur Objekte brauchen, die sich selbst zeichnen können + zeichnen_auf(Graphics2D g2d):void IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 13 dynamisches Malen auf Knopfdruck auf Mausklick Ziel : Line2D Linie dynamisch Objekte auf die Oberfläche malen Kreis Punkt Ellipse Kann nur Objekte brauchen, die sich selbst zeichnen können + zeichnen_auf(Graphics2D g2d):void Point IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 14 dynamisches Malen auf Knopfdruck auf Mausklick Ziel : Line2D dynamisch Objekte auf die Oberfläche malen extends Linie Kreis Punkt Ellipse extends Kann nur Objekte brauchen, die sich selbst zeichnen können extends Point ! mehrfach Vererbung ! in Java verboten ! + zeichnen_auf(Graphics2D g2d):void IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 15 dynamisches Malen auf Knopfdruck auf Mausklick Ziel : Line2D Linie dynamisch Objekte auf die Oberfläche malen Kreis Punkt Ellipse implements Kann nur Objekte brauchen, die sich selbst zeichnen können + zeichnen_auf(Graphics2D g2d):void Point Lösung : Grafikobjekt - Interface erzwingt IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 16 Mein Display Grafikobjekte import java.awt.*; interface GrafikObjekt { public void zeichnen_auf( Graphics2D g2d); } Jedes Interface steht in einer eigenen Interfacename.java Datei, die z.B. den hier abgebildeten Quellcode enthält Graphics2D und Point sind Klassen des Package java.awt. Alle roten Anweisungen sind von Hand zu programmieren ! Den Rest erzeugt Forte beim anlegen eines Interface automatisch ! IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 17 Ein Interface anlegen mit Forte IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 18 Grafikobjekte import java.awt.*; Interface Beispiel class Ellipse implements GrafikObjekt { // Attribute der Klasse Ellipse es fehlt noch int x, y, breite, hoehe; 1 Methode Color farbe; // Konstruktor der Klasse Ellipse public Ellipse( int x, int y, int breite, int hoehe) { this.x = x; this.y = y; this.breite = breite; this.hoehe = hoehe; this.farbe = Color.BLACK; } ... } IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 19 Grafikobjekte import java.awt.*; Beispiel class Ellipse implements GrafikObjekt { // Attribute der Klasse Ellipse int x, y, breite, hoehe; Color farbe; // Konstruktor der Klasse Ellipse public Ellipse( int x, int y, int breite, int hoehe) { this.x = x; this.y = y; Methode, die das this.breite = breite; Interface erzwingt ! this.hoehe = hoehe; this.farbe = Color.BLACK; Implementierung } Methode public void zeichnen_auf( Graphics2D g2d) { g2d.setColor( farbe); g2d.drawOval( x – (breite / 2), y – (hoehe / 2), breite, hoehe); } ... } IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 der 20 Grafikobjekte import java.awt.*; Beispiel class Ellipse implements GrafikObjekt { // Attribute der Klasse Ellipse int x, y, breite, hoehe; Color farbe; // Konstruktor der Klasse Ellipse public Ellipse( int x, int y, int breite, int hoehe) { this.x = x; this.y = y; this.breite = breite; this.hoehe = hoehe; this.farbe = Color.BLACK; } public void zeichen_auf( Graphics2D g2d) { g2d.setColor( farbe); g2d.drawOval( x – (breite / 2), y – (hoehe / 2), breite, hoehe); } public void farbe_setzen( Color farbe) { hat nichts mit dem this.farbe = farbe; Interface zu tun } } IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 21 Mein Display Grafikobjekte anzeigen import javax.swing.*; import java.util.*; import java.awt.*; Quellcode Ergänzungen class Leinwand extends JPanel { private DefaultListModel grafik_objekte = new DefaultListModel(); public void paintComponent( Graphics g) { super.paintComponent( g); Graphics2D g2d = (Graphics2D) g; Enumeration laeufer = grafik_objekte.elements(); while( laeufer.hasMoreElements()){ GrafikObjekt go = (GrafikObjekt) laeufer.nextElement(); go.zeichen_auf( g2d); } } } IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 22 Mein Display Grafikobjekte hinzufügen import java.swing.*; import java.util.*; import java.awt.*; Quellcode Ergänzungen class Leinwand extends JPanel { private DefaultListModel grafik_objekte = new DefaultListModel(); public void grafik_objekt_hinzufuegen( GrafikObjekt go) { if( go != null) this.grafik_objekte.addElement( go); } public void paintComponent( Graphics g) { /*(siehe Folie 22)*/ } } IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 23 Mein Display von außen auf alle Grafikobjekte zugreifen import java.swing.*; import java.util.*; import java.awt.*; Quellcode Ergänzungen class Leinwand extends JPanel { private DefaultListModel grafik_objekte = new DefaultListModel(); public void grafik_objekt_hinzufuegen( GrafikObjekt go) { /*(siehe Folie 23)*/ } public Enumeration grafik_elemente() { return( grafik_objekte.elements()); } public void paintComponent( Graphics g) { /*(siehe Folie 22)*/ } } IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 24 Mein Display von außen auf ein Grafikobjekt zugreifen import java.swing.*; import java.util.*; import java.awt.*; Quellcode Ergänzungen class Leinwand extends JPanel { private DefaultListModel grafik_objekte = new DefaultListModel(); public void grafik_objekt_hinzufuegen( GrafikObjekt go) { /*(siehe Folie 23)*/ } public Enumeration grafik_elemente() { /*(siehe Folie 24)*/ } public GrafikObjekt gib_grafik_objekt( int index) { return( (GrafikObjekt) grafik_objekte.get( index)); } public void paintComponent( Graphics g) { /*(siehe Folie 22)*/ } } IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 25 Mein Malprogramm Die Ellipsen-Toolbar JLabel JButton Smile Menu x: y: JToolBar breite : hoehe : zeichnen JTextField IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 26 Eine Ellipse erschaffen und anzeigen zeichnen 1. den Button mit einer Methode versehen ! IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 27 Eine Ellipse erschaffen und anzeigen import java.awt.*; import java.util.*; import javax.swing.*; Quellcode Ergänzungen public class Smile extends JFrame { private Leinwand display; ... private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { String x_wert = jTextfield1.getText(); String y_wert = jTextfield2.getText(); 1. den Button mit einer String breite_wert = jTextfield3.getText(); String hoehe_wert = jTextfield4.getText(); Methode versehen ! int x = Integer.parseInt( x_wert); int y = Integer.parseInt( y_wert); int breite = Integer.parseInt( breite_wert); int hoehe = Integer.parseInt( hoehe_wert); 2. die Methode mit Anweisungen füllen ! GrafikObjekt go = new Ellipse( x, y, breite, hoehe); display.grafik_objekt_hinzufuegen( go); this.repaint(); } ... } IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 28 Eine Ellipse bei allen Ellipsen die Farbe ändern JLabel JButton JButton Smile Menu x: y: JToolBar breite : hoehe : zeichnen regenbogen JTextField IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 29 Eine Ellipse bei allen Ellipsen die Farbe ändern import java.awt.*; Quellcode Ergänzungen import java.util.*; import javax.swing.*; public class Smile extends JFrame { ... private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { Enumeration laeufer = display.grafik_elemente(); GrafikObjekt go; float rot, gruen, blau; while( laeufer.hasMoreElements()){ go = (GrafikObjekt) laeufer.nextElement(); if( go instanceof Ellipse){ rot = (float) Math.random(); gruen = (float) Math.random(); blau = (float) Math.random(); ((Ellipse) go).farbe_setzen( new Color( rot, gruen, blau)); } } this.repaint(); } ... } IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 30 Eine Ellipse bei allen Ellipsen die Farbe ändern import java.awt.*; Quellcode Ergänzungen import java.util.*; import javax.swing.*; public class Smile extends JFrame { ... private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { Enumeration laeufer = display.grafik_elemente(); GrafikObjekt go; float rot, gruen, blau; while( laeufer.hasMoreElements()){ go = (GrafikObjekt) laeufer.nextElement(); if( go instanceof Ellipse){ rot = (float) Math.random(); gruen = (float) Math.random(); blau = (float) Math.random(); ((Ellipse) go).farbe_setzen( new Color( rot, gruen, blau)); } } explizite Typenkonvertierung this.repaint(); } ... } IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 31 Eine Ellipse bei allen Ellipsen die Farbe ändern import java.awt.*; Quellcode Ergänzungen import java.util.*; import javax.swing.*; public class Smile extends JFrame { ... private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { Enumeration laeufer = display.grafik_elemente(); GrafikObjekt go; float rot, gruen, blau; while( laeufer.hasMoreElements()){ go = (GrafikObjekt) laeufer.nextElement(); if( go instanceof Ellipse){ rot = (float) Math.random(); gruen = (float) Math.random(); blau = (float) Math.random(); ((Ellipse) go).farbe_setzen( new Color( rot, gruen, blau)); } Anweisungen, die für das Durch} laufen der Liste notwendig sind ! this.repaint(); } ... } IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 32 Hintergrundfarbe wählen IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 33 Hintergrundfarbe wählen JMenu und JRadioButtonItem hinzufügen IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 34 Mein Display JRadioButtonItem mit Aktionen belegen Mit der Lupe kann in eine Komponente hineingeschaut werden. Hierzu muss mit der Maus auf die Lupe geklickt werden ! IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 35 Hintergrundfarbe wählen Quellcode ergänzen private void jRadioButtonMenuItem3ActionPerformed(java.awt.event.ActionEvent evt) { jRadioButtonMenuItem1.setSelected( false); jRadioButtonMenuItem2.setSelected( false); Teil der Klasse Smile display.setBackground( Color.CYAN); repaint(); } ! private void jRadioButtonMenuItem2ActionPerformed(java.awt.event.ActionEvent evt) { jRadioButtonMenuItem1.setSelected( false); jRadioButtonMenuItem3.setSelected( false); display.setBackground( Color.YELLOW); repaint(); } private void jRadioButtonMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) { jRadioButtonMenuItem2.setSelected( false); jRadioButtonMenuItem3.setSelected( false); display.setBackground( Color.WHITE); repaint(); } IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 36 unterschiedliche Mausereignisse anklicken mit der Maus mit dem Mauszeiger auf die Komponente kommen mit dem Mauszeiger die Komponente verlassen während der Mausknopf länger gedrückt ist sobald der Mausknopf losgelassen wird IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 37 Übungsaufgabe Erweitern des Malprogramms Bei einem Klick mit der Maus auf die Leinwand [ JPanel] sollen die Werte der beiden zu ergänzenden Attribute mittelpunkt_x und mittelpunkt_y von Typ int die aktuelle Position des Mauszeigers zugewiesen bekommen [mittelpunkt_x = evt.getX() und mittelpunkt_y = evt.getY()]. Die beiden Attribute sollen einen negativen Wert haben solange der ToggleButton „Ellipse“ nicht gedrückt ist und wenn gerade eine neue Ellipse erzeugt wurde. Eine neue Ellipse wird genau dann erzeugt, wenn mit der Maus auf die Leinwand geklickt wird, der ToggleButton „Ellipse“ gedrückt ist und die Attribute mittelpunkt_x und mittelpunkt_y nicht negative Werte enthalten. Nach dem Erzeugen sind die Attribute mittelpunkt_x und mittelpunkt_y wieder auf negative Werte zu setzen ! Das neue Ellipsenobjekt erhält man mittels GrafikObjekt neu = new Ellipse( mittelpunkt_x, mittelpunkt_y, 2*( mittelpunkt_x –evt.getX()), 2*( mittelpunkt_y – evt.getY())); IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 38 Hausaufgabe Erweitern des Malprogramms Schreib, eine Toolbar für Rechtecke, die das Selbe macht, wie die ToolBar für Ellipsen aus der Vorlesung. (Folie 26 – 32) Hinweis: Hierfür müsst ihr eine extra Klasse Rechteck schreiben, welche das Interface GrafikObjekt implementiert. IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 39