Kü /Info Oberstufe OOP - Raumplanung Sj. 2012/2013 Wie zeichnet man einfache Figuren in Java? Ziel ist es zu verstehen, wie das Zeichnen von Formen mit Java grundsätzlich funktioniert. Wenn du das verstanden hast, ist es relativ einfach, zwei neue Möbelklassen zu entwerfen. Eine Erklärung dazu gibt es hier: Video: o „OOP - Figuren zusammenstellen“ - http://youtu.be/s3JS_kGFJ1A Schauen wir uns dazu zunächst die Methode gibAktuelleFigur() von der Klasse Stuhl an, denn sie ist für das Aussehen des Stuhls verantwortlich: private Shape gibAktuelleFigur(){ GeneralPath stuhl = new GeneralPath(); stuhl.moveTo(0 , 0); stuhl.lineTo(breite, 0); stuhl.lineTo(breite+(breite/20+1), tiefe); stuhl.lineTo(-(breite/20+1), tiefe); stuhl.lineTo(0 , 0); //Das ist die Umrandung. Das Stuhl bekommt noch eine Lehne stuhl.moveTo(0 , (breite/10+1)); stuhl.lineTo(breite, (breite/10+1)); // transformieren AffineTransform t = new AffineTransform(); t.translate(xPosition, yPosition); Rectangle2D umriss = stuhl.getBounds2D(); t.rotate(Math.toRadians(orientierung), umriss.getX()+umriss.getWidth()/2, umriss.getY()+umriss.getHeight()/2); return t.createTransformedShape(stuhl); } Diese gehen wir nun Stück für Stück durch, um zu verstehen, wie sie arbeitet und dann in der Lage zu sein, Dinge zu ändern, um neue Möbel zu zeichnen. 1. Die erste Zeile private Shape “gibAktuelleFigur(){“ gibt den Namen und den Rückgabewert: Shape. Dieser Shape enthält nachher den Umriss des Möbelstücks und kann an die Leinwand zum Zeichnen direkt weitergereicht werden. Shape ist eine Klasse, die Java bereits vorgibt. 2. Die Zeile: GeneralPath stuhl = new GeneralPath(); erzeugt offensichtlich ein Objekt stuhl, welches vom Typ „GeneralPath“ ist. Auch das ist eine Klasse, die von Java bereits vorgegeben wird und die zum Zeichnen von Objekten verwendet wird. Sie stellt folgende Methoden zur Verfügung: - moveTo(int x, int y) - lineTo (int x_neu, int y_neu) - append(…) - …… Kü /Info Oberstufe OOP - Raumplanung Sj. 2012/2013 Um auf die Methoden von der Klasse GeneralPath zugreifen zu können, muss man ein Objekt der Klasse GeneralPath erzeugen. Wir brauchen die Methoden, um einzelne Linien zeichnen zu können. Das Möbelstück setzt sich dann nachher aus diesen einzelnen Linien (dem Path) zusammen. Daher wird das Objekt stuhl erzeugt. Über die Punktnotation (siehe Einschub I) kann das Objekt nun auf die Methoden zugreifen und Stück für Stück Linien zeichnen, die zu einem GeneralPath zusammengesetzt werden. Um diese Klasse verwenden zu können, wird am Anfang der Klasse Stuhl folgende Anweisung ausgeführt: import java.awt.geom.GeneralPath; 3. 4. 5. 6. Dadurch ist die Klasse und somit auch alle enthaltenen Methoden in unserer Klasse Stuhl bekannt. Sie wird sozusagen „hinzugenommen“. Die Zeile: stuhl.moveTo(0 , 0); legt den Startpunkt des neu zu schaffenden Objektes fest – von hier aus werden die folgenden Linien gezogen (bis zum nächsten stuhl.moveTo…) Die Zeile: stuhl.lineTo(breite, 0); zieht eine Linie von dem zuletzt angegebenen Punkt (hier (0,0)) zu einem neuen Punkt (0+breite, 0+0). Allgemein hieße die Anweisung: : stuhl.lineTo(x, y); dadurch würde von dem vorher gegebenen Punkt (xalt, yalt) nun eine Linie gezogen zu dem Punkt (xalt+x, yalt+y). Die weiteren Zeilen ergeben sich aus 4. Analog. Der zweite Teil bleibt erst einmal eine Art „black box“: // transformieren AffineTransform t = new AffineTransform(); t.translate(xPosition, yPosition); Rectangle2D umriss = stuhl.getBounds2D(); t.rotate(Math.toRadians(orientierung), umriss.getX()+umriss.getWidth()/2, umriss.getY()+umriss.getHeight()/2); return t.createTransformedShape(stuhl); 7. Hier wird der Stuhl mit dem gesamten GeneralPath einfach nur verschoben und gegebenenfalls gedreht. Denn wir haben ihn ja zunächst oben links in der Ecke gezeichnet – auf der Leinwand soll er aber vielleicht an einer ganz anderen Position und gedreht – aber mit dem gleichen GeneralPath erscheinen. Beachte: das Objekt existiert nun im Prinzip in zwei Darstellungen: Als Objekt mit gespeicherten Werten in den Instanzvariablen farbe = "blau"; orientierung = 0; istSichtbar = false; breite = 40; tiefe = 40; kachelGroesse =breite; rotationsEinheit=45; xPosition = x*kachelGroesse; yPosition = y*kachelGroesse; Als Shape mit Punktkoordinaten gespeichert: Kü /Info Oberstufe OOP - Raumplanung Sj. 2012/2013 Woher kommen all diese vorgegebenen Klassen und woher weiß man, was sie können, bzw. welche Methoden man dadurch verwenden kann? Es gibt sogenannte Java-Klassenbibliotheken (API), in denen alle bereits geschriebenen und für die Allgemeinheit zur Verfügung gestellten Klassen geordnet und verfügbar gemacht wurden. Über die import Anweisung können diese Klassen dem eigenen Projekt bzw. der einzelnen Klasse hinzugefügt werden, so dass davon dann auch Objekte abgeleitet werden können und die Methoden der hinzugefügten Klassen über diese Objekte dann zur Verfügung stehen.