39
Institut für Kartographie und Geoinformation Prof.-Dr. Lutz Plümer, Dr. Gerhard Gröger, Dipl.-Ing. Dirk Dörs Einführung in die Programmierung mit Java 13. Vorlesung WS-03/04

Einführung in die Programmierung mit Java

Embed Size (px)

DESCRIPTION

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 !. - PowerPoint PPT Presentation

Citation preview

Page 1: Einführung in die Programmierung mit Java

Institut für Kartographie und GeoinformationProf.-Dr. Lutz Plümer, Dr. Gerhard Gröger, Dipl.-Ing. Dirk DörschlagInstitut für Kartographie und GeoinformationProf.-Dr. Lutz Plümer, Dr. Gerhard Gröger, Dipl.-Ing. Dirk Dörschlag

Einführung in dieProgrammierung mit Java

13. Vorlesung WS-03/04

Page 2: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 22

Malprogramm

der vollständige und kommentierte Quellcode für meinMalprogramm steht im Internet und auf den Folien der letzen Vorlesung.Weite Teile werden in dieser Vorlesung wiederholt !

Die letzte Hausaufgabe

Page 3: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 33

Mein MalprogrammSmile

Page 4: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 44

Mein MalprogrammSmile

Leinwand zum Bemalen:JPanel

Funktionsknöpfe : JToolBox + JToggleButtonAnwendungsmenü : JMenuBar + JMenu + JMenuItem

Page 5: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 55

x

y

Mein Malprogrammdas Leinwandkoordinatensystem

Leinwand zum Bemalen:JPanel

Funktionsknöpfe : JToolBox + JToggleButtonAnwendungsmenü : JMenuBar + JMenu + JMenuItem

(0,0)

+

+

Page 6: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 66

Mein MalprogrammSmile

Leinwand zum Bemalen:JPanel

Funktionsknöpfe : JToolBox + JToggleButtonAnwendungsmenü : JMenuBar + JMenu + JMenuItemclass Smile extends JFrame {

Leinwand display;...

}

class Leinwand extends JPanel {...

}

Es gibt 2 Quellcode-Dateien :• Leinwand.java• Smile.java

Page 7: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 77

Mein MalprogrammDie 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 !

Page 8: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 88

Mein MalprogrammDie 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 !

Page 9: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 99

ExkursJava an sich

Referenzvariablen 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 !

Methodenkopf

Weiß, was eine Methode macht, wenn sie aufgerufen wird !

Methodenrumpf

public void zeichnen_auf( Graphics2d g2d) public void zeichnen_auf( Graphics2d g2d) {g2d.drawOval(x,y,breite, hoehe);

}

zeigen auf

Page 10: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 1010

dynamisches Malen= malen mittels Nutzerinteraktion

dynamisch Objekte auf die Oberfläche malen

Ziel :

Page 11: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 1111

dynamisches Malen

dynamisch Objekte auf die Oberfläche malen

auf Knopfdruck auf Mausklick

Ziel :

Page 12: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 1212

dynamisches Malen

dynamisch Objekte auf die Oberfläche malen

auf Knopfdruck auf Mausklick

Kann nur Objekte brauchen, die sich selbst zeichnen können

+ zeichnen_auf(Graphics2D g2d):void

Ziel :

! UML – Notation !

Was gemalt wird, ist je nach Typ des Objekts ganz unterschiedlich !

Page 13: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 1313

dynamisches Malen

dynamisch Objekte auf die Oberfläche malen

auf Knopfdruck auf Mausklick

Kreis EllipseLinieKann nur Objekte brauchen, die sich selbst zeichnen können

+ zeichnen_auf(Graphics2D g2d):void

Ziel :

Punkt

Page 14: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 1414

dynamisches Malen

dynamisch Objekte auf die Oberfläche malen

auf Knopfdruck auf Mausklick

Kreis EllipseLinieKann nur Objekte brauchen, die sich selbst zeichnen können

+ zeichnen_auf(Graphics2D g2d):void

Ziel :

Punkt

Point

Line2D

Page 15: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 1515

extends

extends

extends

dynamisches Malen

dynamisch Objekte auf die Oberfläche malen

auf Knopfdruck auf Mausklick

Kreis EllipseLinie Kann nur Objekte brauchen, die sich selbst zeichnen können

+ zeichnen_auf(Graphics2D g2d):void

Ziel :

Punkt

Point

Line2D

! mehrfach Vererbung ! in Java verboten !

Page 16: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 1616

erzwingt

implements

dynamisches Malen

dynamisch Objekte auf die Oberfläche malen

auf Knopfdruck auf Mausklick

Kreis EllipseLinieKann nur Objekte brauchen, die sich selbst zeichnen können

+ zeichnen_auf(Graphics2D g2d):void

Ziel :

Punkt

Point

Line2D

Lösung :Grafikobjekt - Interface

Page 17: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 1717

Mein DisplayGrafikobjekte

import java.awt.*;

interface GrafikObjekt {public void zeichnen_auf( Graphics2D g2d);

}

Graphics2D und Point sind Klassen des Package java.awt.

Jedes Interface steht in einer eigenen Interfacename.java Datei, die z.B. den hier abgebildeten Quellcode enthält

Alle roten Anweisungen sind von Hand zu programmieren ! Den Rest erzeugt Forte beim anlegen eines Interface automatisch !

Page 18: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 1818

Ein Interface anlegen mit Forte

Page 19: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 1919

BeispielBeispiel

es fehlt noch1 Methode

Interfaceimport java.awt.*;

class Ellipse implements GrafikObjekt {// Attribute der Klasse Ellipseint x, y, breite, hoehe; Color farbe;// Konstruktor der Klasse Ellipsepublic 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;

}...

}

Grafikobjekte

Page 20: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 2020

import java.awt.*;

class Ellipse implements GrafikObjekt {// Attribute der Klasse Ellipseint x, y, breite, hoehe; Color farbe;// Konstruktor der Klasse Ellipsepublic 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 zeichnen_auf( Graphics2D g2d) {

g2d.setColor( farbe);g2d.drawOval( x – (breite / 2), y – (hoehe / 2), breite, hoehe);

}...

}

Grafikobjekte

BeispielBeispiel

Methode, die das Interface erzwingt !

Implementierung der Methode

Page 21: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 2121

import java.awt.*;

class Ellipse implements GrafikObjekt {// Attribute der Klasse Ellipseint x, y, breite, hoehe; Color farbe;// Konstruktor der Klasse Ellipsepublic 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) {

this.farbe = farbe;}

}

Grafikobjekte

BeispielBeispiel

hat nichts mit dem Interface zu tun

Page 22: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 2222

Mein DisplayGrafikobjekte anzeigen

import javax.swing.*;import java.util.*;import java.awt.*;

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

}}

}

Quellcode ErgänzungenQuellcode Ergänzungen

Page 23: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 2323

Mein DisplayGrafikobjekte hinzufügen

import java.swing.*;import java.util.*;import java.awt.*;

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)*/ }}

Quellcode ErgänzungenQuellcode Ergänzungen

Page 24: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 2424

Mein Displayvon außen auf allealle Grafikobjekte zugreifen

import java.swing.*;import java.util.*;import java.awt.*;

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)*/ }}

Quellcode ErgänzungenQuellcode Ergänzungen

Page 25: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 2525

Mein Displayvon außen auf einein Grafikobjekt zugreifen

import java.swing.*;import java.util.*;import java.awt.*;

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)*/ }}

Quellcode ErgänzungenQuellcode Ergänzungen

Page 26: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 2626

Menu

Mein MalprogrammDie Ellipsen-Toolbar

x : y : breite : hoehe : zeichnenzeichnen

JLabel

JTextField

JButton

JToolBar

Smile

Page 27: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 2727

Eine Ellipseerschaffen und anzeigen

1. den Button mit einerMethode versehen !

zeichnen

Page 28: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 2828

Eine Ellipseerschaffen und anzeigen

import java.awt.*;import java.util.*;import javax.swing.*;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();String breite_wert = jTextfield3.getText();String hoehe_wert = jTextfield4.getText();

int x = Integer.parseInt( x_wert);int y = Integer.parseInt( y_wert);int breite = Integer.parseInt( breite_wert);int hoehe = Integer.parseInt( hoehe_wert);

GrafikObjekt go = new Ellipse( x, y, breite, hoehe);display.grafik_objekt_hinzufuegen( go);this.repaint();

}...

}

1. den Button mit einerMethode versehen !

2. die Methode mit Anweisungen füllen !

Quellcode ErgänzungenQuellcode Ergänzungen

Page 29: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 2929

Eine Ellipsebei allen Ellipsen die Farbe ändern

Menu

x : y : breite : hoehe : zeichnenzeichnen

JLabel

JTextField

JButton

JToolBar

Smile

regenbogenregenbogen

JButton

Page 30: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 3030

Eine Ellipsebei allen Ellipsen die Farbe ändern

import java.awt.*;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();

}...

}

Quellcode ErgänzungenQuellcode Ergänzungen

Page 31: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 3131

Eine Ellipsebei allen Ellipsen die Farbe ändern

import java.awt.*;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();

}...

}

Quellcode ErgänzungenQuellcode Ergänzungen

explizite Typenkonvertierung

Page 32: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 3232

Eine Ellipsebei allen Ellipsen die Farbe ändern

import java.awt.*;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();

}...

}

Quellcode ErgänzungenQuellcode Ergänzungen

Anweisungen, die für das Durch-laufen der Liste notwendig sind !

Page 33: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 3333

Hintergrundfarbe wählen

Page 34: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 3434

Hintergrundfarbe wählenJMenu und JRadioButtonItem hinzufügen

Page 35: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 3535

Mein DisplayJRadioButtonItem mit Aktionen belegen

Mit der Lupe kann in eine Komponente hin-eingeschaut werden. Hierzu muss mit der Maus auf die Lupe geklickt werden !

Page 36: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 3636

Hintergrundfarbe wählenQuellcode ergänzen

private void jRadioButtonMenuItem3ActionPerformed(java.awt.event.ActionEvent evt) {jRadioButtonMenuItem1.setSelected( false);jRadioButtonMenuItem2.setSelected( false);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();

}

Teil der Klasse Smile !Teil der Klasse Smile !

Page 37: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 3737

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

Page 38: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 3838

Ü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 mittelsGrafikObjekt neu = new Ellipse( mittelpunkt_x, mittelpunkt_y,

2*( mittelpunkt_x –evt.getX()), 2*( mittelpunkt_y – evt.getY()));

Page 39: Einführung in die Programmierung mit Java

IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 3939

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.