Aufgabe 5.1 (Laboraufgabe, Nocheinmal ein wenig Graphik

Werbung
Übungen zu „Objektorientierte Programmierung in Java“
PD Dr. Wolfgang Goerigk
Sommersemester 2009
Übungsaufgaben
Serie 5
Aufgabe 5.1 (Laboraufgabe, Nocheinmal ein wenig Graphik)
Die Klasse java.awt.Container (und damit auch die Klasse java.applet.Applet) enthält eine
Methode void paint (Graphics g), die vom System immer dann aufgerufen wird, wenn Teile oder
die ganze Grafik des Containers neu gezeichnet werden müssen (z.B. nach einem Verdecken des Fensters).
Ändern Sie Ihr Programm aus Aufgabe 4.2 derart, dass Sie die Methode paint überschreiben und Ihre
Grafikausgaben dort programmieren.
Beobachten Sie (etwa indem Sie das Applet-Fenster verdecken und wieder in den Vordergrund bringen)
den Unterschied zu Ihrem Programm aus Aufgabe 4.2.
import java.applet.Applet;
import java.awt.*;
public class Aufgabe_5_1 extends Applet {
public void init () {
setSize(400, 400); setVisible(true);
}
public void paint (Graphics g) {
/**
* Hier folgt Ihr Programmcode
*/
}
}
Aufgabe 5.2 (Laboraufgabe, Ein kleiner Grafikeditor)
Definieren Sie Klassen GraphicsCircle und GraphicsRectangle mit jeweils (int x, int y)
als Mittelpunkt und Radius (int r) für Kreise bzw. Breite und Höhe (int width, int height)
für Rechtecke, ähnlich wie in der Vorlesung. Die Klassen sollen jeweils eine Methode void draw
(Graphics g) enthalten, die die Instanz auf die Graphik g zeichnet, und eine gemeinsame Superklasse
GrElement haben (ohne Attribute und mit einer Dummy-Methode void draw (Graphics g) {}
mit leerem Rumpf).
Das Package java.util enthält eine Klasse Vector (Listen mit wahlfreiem Zugriff und unbeschränkter
Länge). Die Deklaration
public Vector <GrElement> elements = new Vector <GrElement>();
deklariert eine public Variable elements vom Typ Vector <GrElement> und initialisiert sie mit
einem neuen leeren Vektor. Vector <GraphicsElement> bezeichnet den Typ der Vector-
Instanzen, die nur Elemente vom Typ GraphicsElement enthalten dürfen (also auch
GraphicsCircle, ...).
Definieren Sie in Ihrem Applet eine Methode void paint (Graphics g), die alle Elemente dieses
Vektors zeichnet, in dem sie ihnen die Nachricht draw(this.getGraphics()) sendet:
import java.applet.Applet;
import java.awt.*;
import java.util.*;
public class Aufgabe_5_2 extends Applet {
public Vector <GrElement> elements = new Vector <GrElement>();
public void init () {
setSize(400, 400); setVisible(true);
mymain();
}
public void paint (Graphics g) {
/**
* Hier der Code, der alle Elemente aus elements zeichnet
*/
}
public mymain () {
/**
* Hier Ihr Code, der Instanzen erzeugt und elements hinzufügt
*/
repaint();
}
}
Hinzu kommen die Klassen für die graphischen Elemente. Instanziieren Sie
nun einige graphische Elemente e (Kreise, Rechtecke) und tragen Sie diese
durch elements.add(e) in den Vektor ein. Nach jeder Änderung des
Vektors sollte ein repaint() ausgeführt werden, um die dargestellte
Grafik zu aktualisieren. Wenn Sie nun Ihr Applet-Fenster verdecken, wieder
sichtbar machen u.ä., werden die Elemente in elements immer wieder neu
gezeichnet.
Hinweise:
•
•
•
•
Diese Aufgabe ist ein wenig aufwändiger und Sie können sich die Labore in dieser und der
kommenden Woche (KW 22) dafür Zeit nehmen.
In mymain() können Sie z.B. einen kleinen Dialog programmieren, der etwa Kommandos der
Form
c 100 100 50
(Kreis, Mittelpunkt = (100,100), Radius = 50)
r 200 200 100 50 (Rechteck, Mittelpunkt = (200,200), Breite = 100, Höhe = 50)
von der Standardeingabe (java.util.Scanner(System.in)) liest und die entsprechenden
Elemente instanziiert und dem Vektor elements hinzufügt.
Wer Lust hat, kann versuchen, Elemente aus Elements wieder zu löschen, mit Rand- und Füllfarben
spielen u.ä..
Es kann sein, dass Sie in Ihrem Eclipse-Projekt (rechte Maustaste auf das Projekt, Properties, Java
Compiler) den Compiler Compliance Level auf 5.0 (Java 1.5.0) umstellen müssen, wenn Sie
syntaktische Probleme mit Vektoren haben.
Aufgabe 5.3 (Finalisieren von Klassen)
1. Gegeben sei das folgende Java-Programm:
class A {
int x = 1, y = 1;
int m () {
return f();
}
int f() {
return x;
}
}
class B extends A {
int x = 2;
int f () {
return x;
}
}
class C extends B {
int x = 3;
double z = 1.0;
C c = new C();
int f () {
return x;
}
static void main (String[] args) {
System.out.println( c.m() );
}
}
class D extends B {
int x = 4;
}
1. Zeichnen Sie den Vererbungsgraphen des Programms, etwa in Form eines UML-Klassendiagramms,
wie wir es in der Vorlesung verwendet haben.
2. Finalisieren Sie die Klassen: Welche Attribute haben die Klassen A, B, C und D? Welche Methoden
haben die Klassen A, B, C und D. Geben Sie die vier finalisierten Klassendefinitionen an (die alle ihre
Attribute und Methoden lokal deklarieren).
3. Welcher Wert wird von der main-Methode der Klasse C ausgegeben?
Hinweise:
Attribute (Instanzvariablen) werden statisch gebunden; ein return x liefert also den Wert derjenigen
Instanzvariablen x der Klasse, in der es syntaktisch auftritt. Machen Sie sich also insbesondere klar, welche
der Instanzvariablen x von der jeweiligen return x –Anweisung referenziert wird.
Herunterladen