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 12. Vorlesung WS-03/04 Mein Malprogramm Smile IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Mein Malprogramm Smile Anwendungsmenü : JMenuBar + JMenu + JMenuItem Funktionsknöpfe : JToolBox + JToggleButton Leinwand zum Bemalen: JPanel IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 javax.swing.JMenuBar das Anwendungsmenü • Kann allen Swing-FormKomponenten hinzugefügt werden • Swing-Form-Komponenten sind: JFrame, JApplet, JPanel, JInternalFrame und Jdialog • Form-Komponenten können genau eine sichtbare JMenuBar besitzen, alle anderen werden verdeckt. • Ein JMenuBar kann Komponenten von Typ JMenu aufnehmen IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 javax.swing.JMenuBar Menupunkte hinzufügen öffnen durch Klick mit rechter Maustaste IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 javax.swing.JMenu der Titel des Menüs IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 javax.swing.JMenu hinzufügen von Menüpunkten IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 javax.swing.JMenuItem ein einfacher Menüpunkt IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 javax.swing.JMenuItem Menüpunkte mit Aktionen verbinden IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 javax.swing.JPanel die Zeichenfläche Anlegen : Über das Menü (in Forte): 1. Datei -> Neu 2. im sich öffenden Fenster „Templates“ den Ordner „Swing Forms“ öffnen und „JPanel“ auswählen und weiter mit Next 3. den Namen eingeben (, eventuell das Package (Verzeichnis) in dem die neu Klasse liegen soll auswählen) und mit Finish das Erzeugen abschließen 4. es öffnet sich automatisch die Forte-Umgebung „GUI Editing“ IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 javax.swing.JPanel die Zeichenfläche • JPanel sind einfache Oberflächen • JPanel sind keine Anwendung • JPanel können andere Komponenten aufnehmen • JPanel haben ein Layout z.B. ein BorderLayout IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Malen auf einem JPanel Nötig ist das Überschreiben (siehe Polymorphie) der Methode : ... public void paintComponent( java.awt.Graphics g){ super.paintComponent( g); ... } Wichtig, da nur dann sämtliche Einstellungen die in Attributen der Klasse JPanel gespeichert sind berücksichtigt werden Der Grafikkontext der Oberfläche IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Malen auf einem JPanel Beispiel : malt einen Kreis und einen Text public class Leinwand extends JPanel { public void paintComponent( java.awt.Graphics g){ super.paintComponent( g); java.awt.Graphics2D g2d = (java.awt.Graphics2D) g; // malt einen Kreis g2d.drawOval( 13 , 12 , 14 , 14 ); // ändern der Malfarbe g2d.setColor( new java.awt.Color( 0, 0, 255)); // ändern der Stricheigenschaften g2d.setStroke( new java.awt.BasicStroke(2)); // einen Text ausgeben g2d.drawString( “Mein Text“ , 80 , 80 ); ... } } Zugriff auf den erweiterten Grafikkontext mehr Funktionen IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 JPanel zur Anwendung hinzufügen public class Smile extends javax.swing.JFrame { public Leinwand leinwand; //Leinwand extends JPanel {} /** Creates new form Smile */ public Smile() { leinwand = new Leinwand( ); //Ein Leinwandobjekt erzeugen //Den LayoutManager von Hand wählen this.getContentPane().setLayout( new java.awt.BorderLayout()); //Das JPanel auf der Oberfläche anmelden this.getContentPane().add( leinwand, java.awt.BorderLayout.CENTER); //Initialisieren der mit Forte erzeugten Komponenten initComponents(); } ... } IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 die Klasse Polygon verbessern public class Polygon { Probleme aufgrund des Arrays : private Punkt[] punkte; • hoher Zeitaufwand bei public void hinzu( Punkt punkt){ dynamischem hinzufügen oder if( punkte == null){ löschen von Punkten punkte = new Punkt[1]; } else{ Punkt[] neu = new Punkt[ punkte.length + 1]; for( int i = 0; i < punkte.length; i++){ neu[i] = punkte[i]; } punkte = neu; } punkte[ punkte.length – 1] = punkt; } ... } IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 die Klasse Polygon verbessern Probleme aufgrund des Arrays: • hoher Zeitaufwand bei dynamischem hinzufügen oder löschen von Punkten besser für diese Aufgaben : • Listen verwenden ( Diskrete Mathe): - entweder selbst schreiben ( siehe Vorlesung 11) - oder vorgefertigte Klassen nutzen (z.B. java.util.LinkedList oder javax.swing.DefaultListModel) IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 javax.swing.DefaultListModel Ablegen von Objekten in Listen import javax.swing.DefaultListModel; public class Polygon { private DefaultListModel punkte; public void hinzu( Punkt punkt){ if( punkte == null){ punkte = new DefaultListModel(); } punkte.addElement( punkt); public void addElement(Object object){ } ... ... } } ist Methode der Klasse DefaultListModel, mit ihr kann ein Objekt am Ende der Liste hinzugefügt werden. Wichtig : ALLE Klassen sind von Object abgeleitet ! IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 javax.swing.DefaultListModel durchlaufen einer Liste import javax.swing.DefaultListModel; import java.util.Enumeration public class Polygon { private DefaultListModel punkte; public void ausgabe(){ // Zugriff öffnen Enumeration laeufer = punkte.elements(); // solange noch nicht alle Objekte abgefragt wurden while( laeufer.hasMoreElements()){ // ein Objekt abfragen und behandeln ((Punkt) laeufer.nextElement()).ausgeben(); } } ... } IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 eigene Grafikobjekte java.awt.Rectangle java.awt.Point public class Punkt extends Point { } public class Ellipse { } public class Rechteck extends Rectangle { } sollen alle eine Methode public void zeichen_auf( java.awt.Graphics2D g2d){ ... } haben ... IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 eine eigene Grafikobjektschnittstelle java.awt.Rectangle java.awt.Point public class Punkt extends Point { } public class Ellipse { } public class Rechteck extends Rectangle { } public abstract class GrafikObjekt { public abstract void zeichnen_auf( java.awt.Graphics2D g2d); } müsste mittels extends eingebunden werden. Es ist aber nur eine Oberklasse je Klasse erlaubt => IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 eine eigene Grafikobjektschnittstelle java.awt.Point public class Punkt extends Point implements GrafikObjekt {} Lösung : public class Ellipse implements GrafikObjekt {} java.awt.Rectangle public class Rechteck extends Rectangle implements GrafikObjekt {} public interface GrafikObjekt { public void zeichnen_auf( java.awt.Graphics2D g2d); } eine Klasse kann zusätzlich zum erweitern der Oberklasse beliebig viele Interfaces implementieren ! IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 das Interface an sich Syntax : jedes Interface hat eine eigene Interfacename.java - Datei! public interface Interfacename { public void methodenname( parameter); ... } Ein Interface darf nur : • abstrakte Methoden und • statische Attribute enthalten ! Ein Interface kann nicht : • instanziiert werden ! Beispiel : public interface GrafikObjekt { public void zeichnen_auf( java.awt.Graphics2D g2d); ... } das Schlüsselwort abstract wird nicht benötigt ! IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 ein Interface erweitern Syntax : public interface Interfacename extends Interface_1 (, Interface_2 ...){ public void methodenname( parameter); ... } Ein Interface darf : • beliebig viele Interfaces als Oberklasse haben ! Beispiel : public interface FarbObjekt extends GraphikObjekt { public void farbe_aendern( java.awt.Color color); ... } IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 ein Interface implementieren Syntax : public class Klassenname implements Interface_1 (, Interface_2 ...){ ... } Eine Klasse die ein Interface implementiert muss : • abstrakt sein oder • alle Methoden des Interfaces implementieren Beispiel : public class Kreis implements GrafikObjekt { public void zeichen_auf( java.awt.Graphics2D g2d){ g2d.drawOval( this.x, this.y, this.radius, this.radius); } ... } IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 eigene Grafikobjekte darstellen durchlaufen einer Liste import javax.swing.*; import java.util.Enumeration; public class Leinwand extends JPanel { public DefaultListModel grafik_objekte; public void paintComponent( java.awt.Graphics g){ super.paintComponent( g); java.awt.Graphics2D g2d = (java.awt.Graphics2D) g; Enumeration laeufer = grafik_objekte.elements(); while(laeufer.hasMoreElements()){ GrafikObjekt go = (GrafikObjekt) laeufer.nextElement() go.zeichen_auf( g2d); } } } IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Grafikobjekte auf Mausklick IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Grafikobjekte auf Mausklick import javax.swing.*; import java.util.Enumeration; public class Leinwand extends JPanel { public Smile parent; public DefaultListModel grafik_objekte; private void formMouseClicked(java.awt.event.MouseEvent evt) { // Add your handling code here: grafik_objekte.addElement( new Kreis( evt.getX(), evt.getY(), 10)); parent.repaint(), } ... } IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Die Klasse Kreis public class Kreis implements GraphikObjekt { public doubel radius, x, y; public Kreis( double x, double y, double radius) { this.x = x; this.y = y; this.radius = radius; } public void zeichen_auf(java.awt.Graphics2D g2d) { g2d.drawOval(x, y, radius, radius); } } IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 javax.swing.JToolBar • ist automatisch mit BoxLayout ausgestattet • kann im laufenden Programm neu platziert werden IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 javax.swing.JToggleButton • hat zwei Zustände : ausgewählt und nicht ausgewählt • Zustand kann mit der Methode public boolean isSelected() abgefragt werden • Zustand wird beim Anklicken der Komponente gewechselt • drücken kann als Event mit hinzugefügt werden (bei Forte mittels ActionsActionEventactionPerformed) IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 erzeugen von Kreisen an- und abschalten (erster Teil) import javax.swing.*; public class Smile extends JFrame { public boolean kreise_erzeugen() { return( jToggleButton1.isSelected()); } ... private JToggleButton jToggleButton1; } IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 erzeugen von Kreisen an- und abschalten (zweiter Teil) import javax.swing.*; import java.util.Enumeration; Leinwand besitzt folgenden Konstruktor : public Leinwand( Smile parent) { public class Leinwand extends JPanel { this.parent = parent; grafik_objekte = new DefaultListModel(); } public Smile parent; public DefaultListModel grafik_objekte; private void formMouseClicked(java.awt.event.MouseEvent evt) { // Add your handling code here: if( parent.kreise_erzeugen() == true) grafik_objekte.addElement( new Kreis( evt.getX(), evt.getY(), 10); parent.repaint(); } ... } IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Übungsaufgabe Baut ein Malprogramm, das einem Menü, eine Toolbar mit einem ToggleButton und einer Leinwand besteht. Die Klasse Leinwand soll von JPanel abgeleitet sein und die Methode paintComponent( java.awt.Graphics g){...} überschreiben. Beim Start des Malprogramms soll auf der Leinwand ein Kreis gemalt werden. Wenn dieses funktioniert versucht mal einen Smily, ein Gesicht oder etwas anderes. Ihr könnt auch probieren, die Ausgabe mit dem ToggleButton an und ab zu schalten ... IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Hausaufgabe Versucht, das Malprogramm aus der Vorlesung zu schreiben. Hierfür könnt ihr viele Klassen aus der Übung nutzen. Neu : • Die Schnittstelle GrafikObjekt • und die Klassen die diese implementieren (z.B. Kreis), • sowie die Benutzung von DefaultListModel um die GrafikObjekte zu speichern, die gleichzeitig mit einer Änderung der paintComponent() Methode der Leinwand verbunden ist ! IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04