der Sachverhalt:
ich habe viele Klassen, in jeder ein Grafik2d objekt, welches aus mehreren Grafik2d Objekten besteht. erstellt durch die dynamische Klassen der Grundshapes ( siehe Rectangle, eine der dynamischen Klassen). Da jede dynamische Klasse die methode drehen hat, kann ich jedes einzelne Grafik2d objekt in der Klasse selber drehen, jedoch nicht die Ganze Klasse, so als wäre es ein Objekt.
nun ist meine Frage: wie kann ich die ganzen Objekte so drehen, als wäre es ein ganzes Objekt?
ich hab mir schon mehrere gedanken gemacht, 2 Ideen haben sich herauskristalisiert, wobei eine nicht realisierbar ist. ( inzwischen rausgefunden, Danke SlaterB)
hier:
Idee : Aufbau wie der Methode "private Shape gibAktuelleFigur()" der klasse Rectangle. Verknüpfung der einzelnen Objekte durch die append Methode des generalPath.
Haken: beim Zeichnen der Objekte kann ich nicht auswählen ob sie ausgefüllt sein sollen, oder ob nur die Konturen gezeichnet werden. Dies ist sehr wichtig, und wurde bis jetzt über die zeichne() methode weitergegeben, an die innere Klasse der Klasse Leinwand( ShapeMitFarbe)
meine Frage ist nun, wie kann ich diesen "Haken" umgehen oder ausmerzen?
die Canvas findet ihr im 3. Post
vielen lieben Dank!
arxior
updated#2
ich habe viele Klassen, in jeder ein Grafik2d objekt, welches aus mehreren Grafik2d Objekten besteht. erstellt durch die dynamische Klassen der Grundshapes ( siehe Rectangle, eine der dynamischen Klassen). Da jede dynamische Klasse die methode drehen hat, kann ich jedes einzelne Grafik2d objekt in der Klasse selber drehen, jedoch nicht die Ganze Klasse, so als wäre es ein Objekt.
nun ist meine Frage: wie kann ich die ganzen Objekte so drehen, als wäre es ein ganzes Objekt?
ich hab mir schon mehrere gedanken gemacht, 2 Ideen haben sich herauskristalisiert, wobei eine nicht realisierbar ist. ( inzwischen rausgefunden, Danke SlaterB)
hier:
Idee : Aufbau wie der Methode "private Shape gibAktuelleFigur()" der klasse Rectangle. Verknüpfung der einzelnen Objekte durch die append Methode des generalPath.
Haken: beim Zeichnen der Objekte kann ich nicht auswählen ob sie ausgefüllt sein sollen, oder ob nur die Konturen gezeichnet werden. Dies ist sehr wichtig, und wurde bis jetzt über die zeichne() methode weitergegeben, an die innere Klasse der Klasse Leinwand( ShapeMitFarbe)
meine Frage ist nun, wie kann ich diesen "Haken" umgehen oder ausmerzen?
die Canvas findet ihr im 3. Post
vielen lieben Dank!
arxior
updated#2
Code:
import java.awt.Shape;
import java.awt.geom.GeneralPath;
import java.awt.geom.Rectangle2D;
import java.awt.geom.Line2D;
import java.awt.geom.AffineTransform;
import java.awt.geom.*;
import java.awt.*;
public class Rectangle
{
private int xPosition;
private int yPosition;
private int orientierung;
private String farbe;
private boolean istSichtbar;
private int breite;
private int tiefe;
private boolean filled;
/**
* Erzeuge ein neues Bett mit einer Standardfarbe und Standardgroesse
* an einer Standardposition
*/
public Rectangle(int xPosition, int yPosition,int breite,int tiefe, boolean filled) {
this.xPosition=xPosition;
this.yPosition=yPosition;
this.breite=breite;
this.tiefe=tiefe;
this.filled = filled;
farbe = "schwarz";
orientierung = 0;
istSichtbar = false;
}
/**
* Berechnet das zu zeichnende Shape anhand der gegebenen Daten
* [ Zum Anzeigen der Attributwerte über Inspect muss hier die Sichtbarkeit
* auf public gesetzt werden. ]
*/
private Shape gibAktuelleFigur() {
// einen GeneralPath definieren
GeneralPath bett = new GeneralPath();
Rectangle2D rahmen = new Rectangle2D.Double(xPosition, yPosition, breite, tiefe);
/**
* folgender auskommentierter Teil dient zur späteren orientierung, wie man 2D linien erstellt.
*/
/* Line2D obererUmschlag = new Line2D.Double(xPosition1, yPosition1, xPosition2, yPosition2);
//Line2D mitte = new Line2D.Double(0, tiefe/2, breite, tiefe/2);
//Line2D untererUmschlag = new Line2D.Double(0, tiefe/2, breite, tiefe);
*/
bett.append(rahmen,false);
/*bett.append(obererUmschlag,false);
bett.append(mitte,false);
bett.append(untererUmschlag,false);
*/
// transformieren:
AffineTransform t = new AffineTransform();
t.translate(xPosition, yPosition);
Rectangle2D umriss = bett.getBounds2D();
t.rotate(Math.toRadians(orientierung),umriss.getX()+umriss.getWidth()/2,umriss.getY()+umriss.getHeight()/2);
return t.createTransformedShape(bett);
}
/**
* Mache dieses Objekt sichtbar. Wenn es bereits sichtbar ist, tue nichts.
*/
public void zeige() {
if (!istSichtbar) {
istSichtbar = true;
zeichne();
}
}
/**
* Mache dieses Objekt unsichtbar. Wenn es bereits unsichtbar ist, tue nichts.
*/
public void verberge() {
loesche(); // "tue nichts" wird in loesche() abgefangen.
istSichtbar = false;
}
/**
* Füllt das Objekt aus.
*/
public void fuellen() {
loesche();
filled= true;
zeichne();
}
/**
* Zeigt nur die Konturen des Objektes. Gegenteil von der Methode fuellen.
*/
public void nurKonturen() {
loesche();
filled= false;
zeichne();
}
public double getX1()
{
return xPosition;
}
public double getY1()
{
return yPosition;
}
/**
* Drehe auf den angegebenen Winkel
*/
public void dreheAuf(int neuerWinkel) {
loesche();
orientierung = neuerWinkel;
zeichne();
}
/**
* Bewege dieses Objekt horizontal um 'entfernung' Bildschirmpunkte.
*/
public void bewegeHorizontal(int entfernung) {
loesche();
xPosition += entfernung;
zeichne();
}
/**
* Bewege dieses objekt vertikal um 'entfernung' Bildschirmpunkte.
*/
public void bewegeVertikal(int entfernung) {
loesche();
yPosition += entfernung;
zeichne();
}
/**
* Aendere die Farbe dieses Objektes in 'neueFarbe'.
* Gueltige Angaben sind "rot", "gelb", "blau","hellblau", "gruen",
* "lila", "pink", "grau", "hellgrau", "dunkelgrau", "orange" und "schwarz"
*/
public void aendereFarbe(String neueFarbe) {
loesche();
farbe = neueFarbe;
zeichne();
}
/**
* Zeichne dieses Objekt mit seinen aktuellen Werten auf den Bildschirm.
*/
public void zeichne() {
if (istSichtbar) {
Shape figur = gibAktuelleFigur();
Leinwand leinwand = Leinwand.gibLeinwand();
leinwand.zeichne (
this, // leinwand kennt das Objekt
farbe, // definiert seine Zeichenfarbe
figur, // definiert seinen grafischen Aspekt
filled); // definiert, ob das Objekt ausgefüllt ist, oder ob nur die Konturen gezeichnet werden
leinwand.warte(10);
}
}
/**
* Loesche dieses Objekt vom Bildschirm.
*/
public void loesche() {
if (istSichtbar){
Leinwand leinwand = Leinwand.gibLeinwand();
leinwand.entferne(this);
}
}
}