import - Institut für Geodäsie und Geoinformation der Universität Bonn

Werbung
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
Herunterladen