Hallo zusammen,
folgende Problematik besteht bei mir: Ich zeichne verschiedene Objekte auf ein Panel über die paintComponent()-Methode. Dabei kann das Panel ziemlich groß werden, deswegen wird es in einer JScrollPane untergebracht. Das Ganze ist übrigens ähnlich der Zeichenfläche in einem Grafikprogramm, durch die Scrollpane kann man einen anderen Auschnitt einer Zeichnung betrachten.
Nun ist es so, dass bei einer Änderung (Verschieben von Grafikelementen, Verschieben des Bildausschnitts) das Panel neu gezeichnet werden müsste. Wenn aber beim Verschieben eines Elements mit ein paar Pixeln Größe jedes Mal das komplette Panel neu gezeichnet wird, sinkt die Performance ziemlich in den Keller.
Gut, nun kann man der repaint-Methode Koordinaten mitgeben, die neu gezeichnet werden sollen.
Allerdings: Bezieht sich das auf die Koordinaten des Panels, auf dem gezeichnet wird, oder auf die Koordinaten des sichtbaren Bildausschnitts der Scrollpane?
Das weitere Problem ist, dass mein Koordinatensystem nicht links oben mit (0,0) beginnt, sondern links unten. Um das zu erreichen, wird das Graphics-Objekt in der paintComponent-Methode mit
gespiegelt.
Beziehen sich jetzt die Koordinaten für repaint() auf die Bildschirmkoordinaten, oder werden die durch die Transformation auch gleich mit umgerechnet? Ich habe zwar versucht, mir den repaint-Bereich einzeichnen zu lassen, aber da kam nur Müll dabei raus...
Und zu guter Letzt: Wird nur ein Bereich per repaint neu gezeichnet, muss ich den in der paintComponent()-Methode abfragen und dann nur die Elemente neu zeichnen, die in diesen Bereich hineinragen, sehe ich das richtig?
Und wenn der Ausschnitt der Scrollpane verschoben wird, muss ich dann auch dafür sorgen, dass der neue sichtbare Ausschnitt neu gezeichnet wird? Oder wird da ein bereits erzeugtes Graphics-Objekt von Swing intern verwendet und nur der neue Ausschnitt angezeigt? Irgendwas mache ich da wohl noch falsch, denn beim Verschieben entstehen einige Grafikfehler...
Mit den ganzen Paint-Geschichten blicke ich leider noch nicht so durch, ich habe mir zwar die Paint-Tutorials von Sun durchgelesen, aber die beantworten leider noch nicht alle Fragen - wenn Ihr Tips für mich habt, bin ich Euch sehr dankbar!
folgende Problematik besteht bei mir: Ich zeichne verschiedene Objekte auf ein Panel über die paintComponent()-Methode. Dabei kann das Panel ziemlich groß werden, deswegen wird es in einer JScrollPane untergebracht. Das Ganze ist übrigens ähnlich der Zeichenfläche in einem Grafikprogramm, durch die Scrollpane kann man einen anderen Auschnitt einer Zeichnung betrachten.
Nun ist es so, dass bei einer Änderung (Verschieben von Grafikelementen, Verschieben des Bildausschnitts) das Panel neu gezeichnet werden müsste. Wenn aber beim Verschieben eines Elements mit ein paar Pixeln Größe jedes Mal das komplette Panel neu gezeichnet wird, sinkt die Performance ziemlich in den Keller.
Gut, nun kann man der repaint-Methode Koordinaten mitgeben, die neu gezeichnet werden sollen.
Allerdings: Bezieht sich das auf die Koordinaten des Panels, auf dem gezeichnet wird, oder auf die Koordinaten des sichtbaren Bildausschnitts der Scrollpane?
Das weitere Problem ist, dass mein Koordinatensystem nicht links oben mit (0,0) beginnt, sondern links unten. Um das zu erreichen, wird das Graphics-Objekt in der paintComponent-Methode mit
Code:
AffineTransform trafo = new AffineTransform();
trafo.scale(1.0, -1.0);
trafo.translate(-scrollpane.getViewport().getViewPosition().getX(), -panel.getHeight() + scrollpane.getViewport().getViewPosition().getY());
g2d.setTransform(trafo);
gespiegelt.
Beziehen sich jetzt die Koordinaten für repaint() auf die Bildschirmkoordinaten, oder werden die durch die Transformation auch gleich mit umgerechnet? Ich habe zwar versucht, mir den repaint-Bereich einzeichnen zu lassen, aber da kam nur Müll dabei raus...
Und zu guter Letzt: Wird nur ein Bereich per repaint neu gezeichnet, muss ich den in der paintComponent()-Methode abfragen und dann nur die Elemente neu zeichnen, die in diesen Bereich hineinragen, sehe ich das richtig?
Und wenn der Ausschnitt der Scrollpane verschoben wird, muss ich dann auch dafür sorgen, dass der neue sichtbare Ausschnitt neu gezeichnet wird? Oder wird da ein bereits erzeugtes Graphics-Objekt von Swing intern verwendet und nur der neue Ausschnitt angezeigt? Irgendwas mache ich da wohl noch falsch, denn beim Verschieben entstehen einige Grafikfehler...
Mit den ganzen Paint-Geschichten blicke ich leider noch nicht so durch, ich habe mir zwar die Paint-Tutorials von Sun durchgelesen, aber die beantworten leider noch nicht alle Fragen - wenn Ihr Tips für mich habt, bin ich Euch sehr dankbar!