einführung in die programmierung mit java
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 PresentationTRANSCRIPT
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
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
IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 33
Mein MalprogrammSmile
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
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)
+
+
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
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 !
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 !
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
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 :
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 :
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 !
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
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
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 !
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
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 !
IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 1818
Ein Interface anlegen mit Forte
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
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
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
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
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
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
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
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
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
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
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
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
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
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 !
IKG; DörschlagDörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 3333
Hintergrundfarbe wählen
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
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 !
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 !
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
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()));
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.