Rechtecke usw mit Paint auf Panel zeichnen

Status
Nicht offen für weitere Antworten.

thomas.g

Bekanntes Mitglied
Hallo, Leute

Ich bräuchte ganz dringend einen Tipp,

Ich habe auf ein Panel ein event gelegt, dass wenn der User irgendwo klickt, dort ein Rechteck zeichnet, das geht auch, doch bisher habe ich das so gemacht:

Das Image zeichnen und an der gewünschten stelle ein Rechteck dazu (mit paintComponent) danach habe ich das neue Bild über das alte gespeichert (nicht in einer Datei sondern Image alt = neu)
Bei jedem Click wird also zuerst das alte gezeichnet und dann das Rechteck dazu.

Bei größeren Bilder dauert das aber und somit verzögert sich da alles und genau das möchte ich vermeiden!
Zeichnet man allerdings nur das Rechteck, so verschwindet dann das Bild und nur das Rechteck ist da.

Meine Frage also,

Wie kann man sachen auf ein Panel dazuzeichnen, ohne dass das vorherige dabei verloren geht?

Danke, Tholmas G
 
Da du mit einem Image arbeitest, kannst du eine Graphics herstellen lassen, welche direkt auf diesem Bild zeichnet:
Code:
Image image = ...
Graphics g = image.createGraphics();
g.drawIrgendwas(...);
g.dispose();
So kannst du jederzeit neue Elemente auf das Bild zeichnen.
 
Was muss ich jetzt also bei diesem Code ändern, damit ich das Bild nicht immer neu zeichnen muss


Code:
public class ImagePaneView extends JPanel
{
    
    /** Creates a new instance of ImagePanel */
    public Image image;
    public int drawSome = 0;
    public int x =0;
    public int y =0;
    public ImagePaneView(Image img)
    {
        this.image=img;
        
      addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
               
               drawSome = 1;
               x=evt.getX();
               y=evt.getY();
               repaint();
            }
            
            
        });
        
        
        
        
        
        
    }
    public void draw(int x, int y)
    {
        Graphics fg = null;
        super.paintComponent(fg);
        fg.drawOval(x, y, 10, 10);
    }
    public void paint(Graphics g)
    {
        // super.paint(g);
        
      Graphics2D g2d=(Graphics2D)g;
        super.paintComponent(g2d);
        if(drawSome==0)
        {
            g2d.drawImage(image,0,0,image.getWidth(this),image.getHeight(this),this);
              
        }
        
        if(drawSome==1)
        {
         
            g2d.drawOval(x,y, 20,20);
        }
       
        
        
    }
    
    
}
 
Du könntest die Objekte, die gezeichnet werden müssen in einer Collection speichern. Das Zeichen würde dann innerhalb der paintComponent-Methode mittels iteration über die Collection geschehen.

Ein Beispiel:
Gegeben sei die Klasse 'Rechteck':
Code:
class Rechteck {
  private Point startPoint;
  private int heigth;
  private int weight;

  public Rechteck( Point p, int h, int w ) {
    // Vars füllen
  }

  // Getter und setter dazu
}

Diese werden nun in eine Collection (z.B. ArrayList) gehangen:
Code:
//...
Collection c = new ArrayList();
//...
c.add( new Rechteck( ... ) );
//...

und innerhalb von Paint gezeichnet:
Code:
protected void paintComponent(Graphics g) {
  Iterator it = c.iterator();
  while (it.hasNext()) {
    Rechteck r = (Rechteck)it.next();
    g.drawRect( ... );
  }
}
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben