Hi,
ich versuche derzeit in Java ein Paint-ähnliches Zeichenprogramm umzusetzen und bin dabei auf ein Problem gestoßen, bei dem ich aktuell nicht weiter komme. Bei meiner google-Recherche hab ich dieses Forum hier entdeckt und mir gedacht ich schildere mein Problem hier einfach mal, in der Hoffnung, dass mir evtl. jmd. weiterhelfen oder den ein oder anderen nützlichen Tipp geben kann.
Zu meinem Problem: Nach erfolgreicher Umsetzung des "Freihand"-Zeichnens widme ich mich momentan dem Zeichnen von Shapes wie Kreisen und Rechtecken.
Mir ist dabei bekannt, wie das grundsätzliche Erstellen und Einfügen der jeweiligen Shape funktioniert, das Problem ist das "dynamische" Zeichnen der Shape während der Benutzereingabe (also das "ziehen" der Kreis- oder Rechteckgröße per Maus).
Ein Beispiel: Der Benutzer will einen Kreis zeichnen. Das soll analog zu (z.B.) MS Paint funktionieren, der Benutzer klickt also auf den gewünschten Ausgangspunkt für den Kreis und "zieht" (=dragged) dann die Maus, wobei sich die Kreisgröße entsprechend anpasst. Bei mouse-release soll der Kreis dann (endgültig) auf die Zeichenfläche übernommen werden.
Die Realisierung habe ich mir folgendermaßen vorgestellt: bei jedem MouseDragged-Event zeichne ich einen Kreis entsprechend den aktuellen Koordinaten; sollte dies nicht der erste Kreis sein, so wird der vorherige entfernt (sonst zeichne ich ja eine "3D-Röhre" aus vielen Kreisen).
Das Problem dabei ist nun folgendes: es gibt scheinbar keine Möglichkeit von meiner Zeichenfläche (Canvas oder JPanel, beides bereits versucht) das jeweils zuletzt (per .draw()) gezeichnete Objekt (hier: der obsolete Kreis der des alten MouseDragged-Events) wieder zu löschen. Das gezeichnete Objekt "verschmilzt" gewissermaßen mit der Zeichenfläche und lässt sich nachträglich nicht removen. Das bedeutet, dass ich bei jedem MouseDragged-Event ein repaint() ohne die Kreise aufrufen müsste, um den gezeichneten Kreis wieder zu "löschen", also den "ursprünglichen" Bildinhalt wiederherzustellen.
Dies würde zwar von der reinen Programmier-Logik her funktionieren (denk ich... ), aber da MouseDragged ja mehrmals pro Sekunde aufgerufen wird dürfte dies (gerade wenn das bestehende Bild aufwendig ist) zu massiven Performanceproblemen führen.
Dafür muss es doch irgendwie eine wesentlich elegantere Variante geben, nur komm ich momentan scheinabar nicht von alleine drauf.
Schonmal vielen Dank für jegliche Hilfestellung!
Gruß,
thousands
ich versuche derzeit in Java ein Paint-ähnliches Zeichenprogramm umzusetzen und bin dabei auf ein Problem gestoßen, bei dem ich aktuell nicht weiter komme. Bei meiner google-Recherche hab ich dieses Forum hier entdeckt und mir gedacht ich schildere mein Problem hier einfach mal, in der Hoffnung, dass mir evtl. jmd. weiterhelfen oder den ein oder anderen nützlichen Tipp geben kann.
Zu meinem Problem: Nach erfolgreicher Umsetzung des "Freihand"-Zeichnens widme ich mich momentan dem Zeichnen von Shapes wie Kreisen und Rechtecken.
Mir ist dabei bekannt, wie das grundsätzliche Erstellen und Einfügen der jeweiligen Shape funktioniert, das Problem ist das "dynamische" Zeichnen der Shape während der Benutzereingabe (also das "ziehen" der Kreis- oder Rechteckgröße per Maus).
Ein Beispiel: Der Benutzer will einen Kreis zeichnen. Das soll analog zu (z.B.) MS Paint funktionieren, der Benutzer klickt also auf den gewünschten Ausgangspunkt für den Kreis und "zieht" (=dragged) dann die Maus, wobei sich die Kreisgröße entsprechend anpasst. Bei mouse-release soll der Kreis dann (endgültig) auf die Zeichenfläche übernommen werden.
Die Realisierung habe ich mir folgendermaßen vorgestellt: bei jedem MouseDragged-Event zeichne ich einen Kreis entsprechend den aktuellen Koordinaten; sollte dies nicht der erste Kreis sein, so wird der vorherige entfernt (sonst zeichne ich ja eine "3D-Röhre" aus vielen Kreisen).
Das Problem dabei ist nun folgendes: es gibt scheinbar keine Möglichkeit von meiner Zeichenfläche (Canvas oder JPanel, beides bereits versucht) das jeweils zuletzt (per .draw()) gezeichnete Objekt (hier: der obsolete Kreis der des alten MouseDragged-Events) wieder zu löschen. Das gezeichnete Objekt "verschmilzt" gewissermaßen mit der Zeichenfläche und lässt sich nachträglich nicht removen. Das bedeutet, dass ich bei jedem MouseDragged-Event ein repaint() ohne die Kreise aufrufen müsste, um den gezeichneten Kreis wieder zu "löschen", also den "ursprünglichen" Bildinhalt wiederherzustellen.
Dies würde zwar von der reinen Programmier-Logik her funktionieren (denk ich... ), aber da MouseDragged ja mehrmals pro Sekunde aufgerufen wird dürfte dies (gerade wenn das bestehende Bild aufwendig ist) zu massiven Performanceproblemen führen.
Dafür muss es doch irgendwie eine wesentlich elegantere Variante geben, nur komm ich momentan scheinabar nicht von alleine drauf.
Schonmal vielen Dank für jegliche Hilfestellung!
Gruß,
thousands
Zuletzt bearbeitet: