Einführung in die Programmierung mit Java

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
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
ActionsActionEventactionPerformed)
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
Herunterladen