# awt rechteck zeichnen



## Bastian (20. Nov 2007)

hallo,
ich will in swing mit einem "gummiband" ein rechteck zeichnen, welches dass beim loslassen mit einer farbe ausgefüllt wird. dis klappt und ist so realisiert:



```
public void mouseReleased(MouseEvent e) {
			x2 = e.getX();
			y2 = e.getY();
			fillRect(Color.black);
		}
....
....
....
		public void mouseDragged(MouseEvent evt) {
			paintRectangle(Color.white);
			x2 = evt.getX();
			y2 = evt.getY();
			paintRectangle(Color.black);
		}

		private void paintRectangle(Color color) {
			xPoints = new int[] { x1, x2, x2, x1 };
			yPoints = new int[] { y1, y1, y2, y2 };
			g2d.setColor(color);
			g2d.drawPolygon(xPoints, yPoints, 4);
			repaint();
		}
		private void fillRect(Color color) {
			xPoints = new int[] { x1, x2, x2, x1 };
			yPoints = new int[] { y1, y1, y2, y2 };
			g2d.setColor(color);
			g2d.fillPolygon(xPoints, yPoints, 4);
			repaint();
		}

...
...
...
```

das problem ist, dass bei "mouseDragged" immer das rechteck weiß vogezeichnet wird, sodass der gummiband effekt entsteht. befindet sich auf der zeichenfläche alleridngs schon ein ausgefülltes rechteck, so bleiben die weißen "zwischenzeichnungen" auf dem ausgefüllten rechteck zurück.:




wie lässt sich dies verhindern?

gruß
bastian


----------



## Leroy42 (20. Nov 2007)

Das hier verstehe ich nicht ganz:

```
g2d.fillPolygon(xPoints, yPoints, 4); 
  repaint();
```
Du zeichnest ein Polygon (g2d hast du dir wahrscheinlich via getGraphics() besorgt,
was von Haus aus schon _böse_ ist) und rufst *danach* repaint auf? ???:L 

Normalerweise muß ausschließlich die paint (paintComponent)-Methode
alle Zeichnungen ausführen (Was soll denn passieren, wenn du dein Fenster
ver- und dann wieder aufdeckst?) und die Methode fillRect nur die Bedingungen
vermerken (deine x2, y2 Koordinaten) und paintComponent (via repaint()) veranlassen,
die Zeichnung auszuführen.

Was soll denn passieren, wenn du mehrere Gummibänder aufziehst?
Soll dann nur das jeweils zuletzt aufgezogene Rechteck gefüllt werden
oder alle bisher aufgezogenen?

Wenn das letztere zutreffen sollte, mußt du in einer ArrayList alle
bisher aufgezogenen Rechtecke merken und diese dann in paintComponent
zeichnen.


----------



## Bastian (20. Nov 2007)

es kann ja nur ein gummiband aufgezogen werden (da auch nur eine maus)


----------



## Leroy42 (20. Nov 2007)

Erinnert mich an hat gesagt.:
			
		

> Bastian hat gesagt.:
> 
> 
> 
> ...



prinzipielle Vorgehensweise:

```
public class Gummiband extends JPanel implements MouseMotionListener {
  int x1, x2, y1, y2;
  boolean isSet = false;

  public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.setColor(Color.black);
    if (isSet) {
      // Umkreisung zeichnen zwischen (x1,y1) und (x2, y2) mittels drawRect(...)
    } else
      // Rechteck füllen zwischen (x1,y1) und (x2, y2) mittels fillRect(...)
  }
  public void mousePressed(MouseEvent e) {
    x1 = x2 = e.getX();
    y1 = y2 = e.getY();
    isSet = false;
    repaint();
  }
  public void mouseDragged(MouseEvent e) {
    x2 = e.getX();
    y2 = e.getY();
    repaint();
  }
  public void mouseReleased(MouseEvent e) {
    x2 = e.getX();
    y2 = e.getY();
    isSet = true;
    repaint();
  }
}
```


----------

