Ü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.