probleme mit repaint

  • Themenstarter Themenstarter jens
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
J

jens

Gast
hi,
ich hab versucht ein eigenes drag&drop hinzukriegen, in dem ein image unter der Cursor erscheint. Soweit wars dann auch kein problem, doch damit immer nur ein image da ist verwendete ich die repaint-methode des frames in dem ich mich befinde und zeichne das image danach neu. Allerdings verschwindet das image, wenn ich es nicht die ganze Zeit über neu zeichen. Hätte jemand ne idee woran des liegt? (Die klasse wird einfach als MouseListener und als MouseMotionListener zum frame geaddet)

Code:
class Frame_jButton_mouseAdapter4 extends java.awt.event.MouseAdapter implements java.awt.event.MouseMotionListener
         {
           Frame_jButton_mouseAdapter4(Graphics adaptee,Image image,Frame1 v)
           {
             this.adaptee = adaptee;
             this.image = image;
             ico = new ImageIcon(this.image);
             this.v = v;
           }

           public void mouseMoved(MouseEvent e)
           {

           }

           public void mouseDragged(MouseEvent e)
           {
             x = e.getX();
             y = e.getY();
             if(a)
             {
               this.draw();
             }
           }

           private void draw()
           {
             synchronized(v){v.repaint();}
             ico.paintIcon(v,adaptee,x-20,y-20);
           }

           public void mousePressed(MouseEvent e)
           {
             a = true;
             x = e.getX();
             y = e.getY();
             this.draw();
           }

           public void mouseReleased(MouseEvent e)
           {
             a = false;
           }

           Graphics adaptee;
           Image image;
           ImageIcon ico;
           Frame v;
           int x,y;
           boolean a = false;
         }
 
Hi,

du speichert eine Referenz auf ein Graphics-Objekt in einer Instanzvariablen.
Bist du dir sicher, dass der Grafikkontext noch nicht freigegeben wurde?
Es gibt ja die paint-Methode, welche ein Graphics-Objekt übernimmt.
Dieses Objekt speicherst du so wie es aussieht in der Instanzvariablen.
Das ist nicht gut, weil die Klasse, die es erzeugt hat den Grafikkontext wieder
freigibt, sobald er nicht mehr gebraucht wird. Das bedeutet vereinfacht gesagt, wenn
die paint-Methode zurückkehrt. Davon, dass du eine Referenz speicherst, weiß die instanzierende
Klasse ja nichts.

Probier mal folgendes

Code:
           private void draw() 
           { 
             synchronized(v){v.repaint();} 
             ico.paintIcon(v, v.getGraphics() ,x-20,y-20); 
           }
 
lo

hat nicht wirklich was verändert, was mich auch wundern würde, da das image ja auch bei jedem neuen event gezeichnet wurde, sodass der grafikkontext wohl nicht gelöscht wird - habs allerdings so gelöst, indem ich anstatt repaint() - paintComponents() verwendet hab(seit dann funkt alles prima ^^) So wie sich mein programm verhalten hat würd ich meinen, dass repaint() einen Thread öffnet, der die ganze Zeit ein paintComponents() aufruft(was erklären würde warum das image gleich nach dem zeichnen wieder gelöscht werden würde), wenn irgendjemand was genaueres dazu weis würds mich interessieren - des hauptproblem is aber inzwischen gelöst 8)
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben