# JPanel: Graphics2D, scale und Mauskoordinaten



## Fabian23 (12. Jan 2007)

Hallo zusammen,

ich habe ein JPanel, auf das ich mittels Graphics2D zeichne. Den Zoom stelle ich über g2.scale() ein, was auch wunderbar funktioniert.

Jetzt habe ich Shapes auf dem Panel, die ich nach dem Zoomen gerne bewegen möchte. Allerdings stimmen die Mauskoordinaten nach dem Zoomen nicht mehr. Wie kann ich die am einfachsten umrechnen? 

Eigentlich sollte es ja reichen, den Zoom-Grad mit einzubeziehen, nach dem Berechnen habe ich dann aber evtl. double-Werte und ich setze bei jedem Shape int-Werte . Gibt es eine einfachere Möglichkeit oder muss ich mir die Arbeit machen und das alles auf double umstellen?


Gruß,
Fabian


----------



## Wildcard (12. Jan 2007)

Mach dir einfach eine Util-Klasse die dafür eine statische Methode anbietet.


----------



## Marco13 (13. Jan 2007)

Beschreib mal genauer, was du machen willst. Willst du die Shapes (die skaliert gezeichnet werden) mit der Maus anklicken und z.B. verschieben?


----------



## Fabian23 (13. Jan 2007)

Hallo Marco13,

ja genau das will ich erreichen.


----------



## Marco13 (13. Jan 2007)

Kurze Antwort: Du mußt nach int casten.

Lange Antwort:

Die Positionen der Shapes sind also mit ints gespeichert, und werden skaliert auf eine Component gezeichnet. Die Shapes haben wohl Methoden wie z.B.

```
boolean containsPoint(int x, int y)
{
    return .... 
}
```

Wenn man einen MouseListener an die Component hängt, bekommt man die Mausposition in Fensterkoordinaten (als ints). Man kann nun überprüfen, ob das Shape die Mausposition enthält, indem man die Mausposition von Fensterkoordinaten in Weltkoordinaten umrechnet. Das könnte man (mit wenig Aufwand) sehr allgemein machen, z.B. für den Fall, dass der Zeichenbereich nicht nur skaliert, sondern auch verschoben oder gedreht ist. Falls du das so allgemein machen willst (was nicht schaden könnte) sag nochmal bescheid. 

Ansonsten mal für den einfachsten Fall, das NUR skaliert wurde:

```
public void mouseClicked(MouseEvent e)
{
    // Man bekommt die Position der Maus in FENSTERKoordinaten (int)
    int xWin = e.getX();
    int yWin = e.getY();

    // Man rechnet die Position in WELTkoordinaten um (double), (scale==0 ausschließen!)
    double xWorld = xWin / scale;
    double yWorld = xWin / scale;

    // Man überprüft, ob das Shape die Koordinaten enthält
    if (containsPoint((int)xWorld, (int)yWorld)) // Hier steckt der cast aus der kurzen Antwort drin  :wink: 
    {
        ...
    }
}
```


----------

