# Ein Kreis als Graphics2D oder als Ellipse2D Objekt



## Dit_ (5. Nov 2009)

Hallo!

Ich habe drei Klassen Kreis, Rechteck und Linie.

Klasse Kreis zB gibt mit _*gebeFigur()*_ ein *Ellipse2D* Objekt zurueck.

Nach Aufgabestellung soll sich jede Figur selbst zeichnen... Eine andere Klasse bekommt eine Liste mit Figuren und zeichnet diese auf dem panel... mit draw(..) wahrscheinlich.

```
public class Tafel extends JPanel {
...
		public void paintComponent(Graphics gr) {
		Graphics2D gr2d = (Graphics2D) gr;
		gr2d.draw(figurenListe[0].gebeFigur()); //so als Beispiel
		}
...
}
	}
```

Rechteck und Kreis sollen ausgefüllt dargestellt werden, das heisst dass man zB die methode *void fillOval(int x, int y, int w, int h)* benutzen soll. Da jede Figur sich selbst zeichnen soll, muss wohl die Klasse Oval ein Graphics2D Objekt zurückgeben?
Wenn ja, dann kann ich draw(..) nicht mehr benutzen, da draw nur die _Shape _Objekte als parameter erwartet... :shock:

Hat jemand eine Idee?

Danke schon mal


----------



## Wildcard (5. Nov 2009)

```
figurenListe[0].zeichne(gr2d);
```


----------



## Dit_ (5. Nov 2009)

Wildcard hat gesagt.:


> ```
> figurenListe[0].zeichne(gr2d);
> ```



ja genau das habe ich ja in meiner Klasse Kreis


```
public class Kreis {
...
	public void zeichne() {
		oval = new Ellipse2D.Double(startPunkt.getX(), startPunkt.getY(),
				breite, hoehe);

	}
...
}
```

die frage ist ja, wo nutze ich die *void fillOval(int x, int y, int w, int h)* ?


----------



## Wildcard (5. Nov 2009)

Zeichne braucht als Parameter das Graphics2D Objekt. Damit zeichnest du dann.


----------



## Dit_ (5. Nov 2009)

Wildcard hat gesagt.:


> Zeichne braucht als Parameter das Graphics2D Objekt. Damit zeichnest du dann.



und dann gebe ich Graphics2D Objekt zurück? Welche methode macht was ?
ich meine was bekommt dann die methode *paintComponent(Graphics gr)* zum "drawen" ?
sorry stehe gerade auf dem Schlauch


----------



## Dit_ (5. Nov 2009)

axoooo du meinst wahrscheinlich ich soll einfach an die methode zeichne die Referenz übergeben. Die Klasse Kreis gibt gar nichts zurück! oder ?


----------



## Wildcard (5. Nov 2009)

In paintComponent bekommst du das Graphics Objekt und diese Objekt reichst du an die zeichne Methode deiner Figuren durch. Ein Graphics Objekt ist wie ein Pinsel der auf eine Leinwand ausgerichtet ist. Jeder deiner Figuren muss nun den Pinsel schwingen, aber dafür musst du ihnen einen geben.


----------



## Dit_ (5. Nov 2009)

ok danke sehr!
und letzte Frage. *Wer *und vor allem *wie* schwindet den Pinsel zur FarbenPalette?


```
public void zeichne(Graphics2D gr) {
		gr.setColor(Color.RED);
		gr.fillOval(x,y, w, h);

	}
```

so richtig ?


----------



## Wildcard (5. Nov 2009)

Müsstest du doch beim ausführen sehen ob richtig, oder nicht? 
Sollte passen, aber ich dachte eigentlich deine Figur hat ein Java Shape? Wenn ja, zeichne direkt das Shape anstatt drawOval.


----------



## Dit_ (5. Nov 2009)

ok farben setzte geht  Problem ist nur das die Objekte, Kreis zB zu kantig sind... und zeichen Shape direkt, weiss nicht was du meinst  kenne nur draw(..), oder fillOval(..)


----------



## Wildcard (5. Nov 2009)

genau... draw(Shape)
Kanten bekommst du durch Antialiasing weg. Das musst du als rendering hint im Graphics Objekt setzen


----------



## Dit_ (6. Nov 2009)

ok danke läuft...

was mache ich aber mit negativer Breite ? Objekte mit negativer Breite werden nicht gezeichnet


----------



## Wildcard (6. Nov 2009)

Was erwartest du denn? Ein Objekt mit negativer Breite ist nicht da.
Ich würde sagen ein Objekt das eine negative Breite gesetzt bekommt sollte direkt eine IllegalArgumentException werfen.


----------



## André Uhres (7. Nov 2009)

Dit_ hat gesagt.:


> ```
> public class Kreis {
> ...
> public void zeichne() {
> ...


In einem systemausgelösten Malvorgang, bittet das System eine Komponente, ihren Inhalt darzustellen, normalerweise aus einem der folgenden Gründe: 

Die Komponente wird zum erstenmal sichtbar auf dem Bildschirm abgebildet. 
Die Komponente wird in der Größe verändert. 
Die Komponente wurde beschädigt und muß repariert werden (zum Beispiel wurde etwas verschoben, das vorher die Komponente verdeckte, und ein vorher verdeckter Teil der Komponente wird sichtbar). 
In allen drei Fällen ruft das System automatisch die paintComponent Methode der Komponente auf. Es leuchtet ein, daß paintComponent möglichst schnell reagieren sollte, daher werden wir "teure" Sachen dort vermeiden wollen, wie z.B neue Objekte erzeugen:

```
...
public class Kreis {
    private final Ellipse2D.Double oval;
    private Point startPunkt;
    private double breite;
    private double hoehe;
    public Kreis(final Point startPunkt, final double breite, final double hoehe) {
        this.startPunkt = startPunkt;
        this.breite = breite;
        this.hoehe = hoehe;
        oval = new Ellipse2D.Double();
    }
    public void zeichne(final Graphics2D g) {
        //hier sollten wir kein neues Ellipse2D.Double Objekt erzeugen!
        oval.setFrame(startPunkt.getX(), startPunkt.getY(), breite, hoehe);
        g.draw(oval);
    }
...
}
```


----------



## Dit_ (7. Nov 2009)

Wildcard hat gesagt.:


> Ich würde sagen ein Objekt das eine negative Breite gesetzt bekommt sollte direkt eine IllegalArgumentException werfen.



so kannst du aber nicht mit der Maus nach Links zeichnen.

ok das mit negativer Breite ist halb so schlimm...

@André  danke für den Tipp.

noch eine Frage hätte ich noch:

wie selektiert man dann das Oval?


----------



## andre111 (7. Nov 2009)

Wenn ich das mit dem "nach links ziehen" richtig verstehe, dann musst du eben die Breite positiv setzen und die x-Position nach links verschieben.


----------



## Dit_ (7. Nov 2009)

andre111 hat gesagt.:


> Wenn ich das mit dem "nach links ziehen" richtig verstehe, dann musst du eben die Breite positiv setzen und die x-Position nach links verschieben.



Position x ist aber fest und kann nicht verschoben werden. Wie gesagt das ist erstmal unwichtig.

Mich würde aber interessieren wie ich mein Oval nach dem fill(oval); selektieren kann.


----------



## Wildcard (8. Nov 2009)

Das Panel/Canvas von dem das Graphics Objekt kommt registriert einen MouseListener. Bei Klick fragst du alle deiner Figuren ab, ob sie den Klickpunkt enthalten. Wenn ja, selektierst du das betreffende.


----------



## Dit_ (8. Nov 2009)

Wildcard hat gesagt.:


> Das Panel/Canvas von dem das Graphics Objekt kommt registriert einen MouseListener. Bei Klick fragst du alle deiner Figuren ab, ob sie den Klickpunkt enthalten. Wenn ja, selektierst du das betreffende.



ja schon klar, aber wie? ich meine, shape hat ja keine Funktion wie zum Beispiel oval.setSelected(); 
muss ich dann ein graues rechteck auf mein Oval legen?


----------



## Wildcard (8. Nov 2009)

Deine Figur muss das leisten. Sie hat zb eine setSelected(boolean) Methode. Wenn eine Figur selected ist, zeichnet sie vielleicht in einer anderen Farbe, oder zeichnet ein zusätzliches Rechteck, das liegt an dir.


----------

