# canvas.draw zeichne ohne ausfüllen



## Cerveza1234 (15. Feb 2008)

Hi,

hab das untenstehende programm geschrieben und wollte mal fragen ob es auch eine möglichkeit gibt die kreise und quadrate dich ich zeichnen lasse nicht mit farbe auszufüllen.



```
import java.awt.Rectangle;
import java.awt.geom.Ellipse2D;

class Kreis {
	int radius;
	int x;
	int y;

	Kreis() {
		radius = 10;
		x = 0;
		y = 0;
		zeichne();
	}

	void verschiebeHorizontal(int eingabe) {
		x += eingabe;
		zeichne();
	}

	void verschiebeVertikal(int eingabe) {
		y += eingabe;
		zeichne();
	}

	void vergroessere(int newRadius) {
		radius = newRadius;
		zeichne();
	}

	int getX() {
		return x;
	}

	int getY() {
		return y;
	}

	void zeichne() {
		Canvas canvas = Canvas.getCanvas();
		canvas.draw(this, "red", new Ellipse2D.Double(x, y, radius, radius));
		canvas.wait(1000);
	}

}

class Quadrat {
	int seite;
	int x;
	int y;

	Quadrat() {
		seite = 50;
		x = 0;
		y = 0;
		zeichne();
	}

	void verschiebeNach(Kreis kreis) {
		x = kreis.x;
		y = kreis.y;
		zeichne();
	}

	void verschiebeHorizontal(int eingabe) {
		x += eingabe;
		zeichne();
	}

	void verschiebeVertikal(int eingabe) {
		y += eingabe;
		zeichne();
	}

	void vergroessere(int einheiten) {
		seite += einheiten;
		zeichne();
	}

	void zeichne() {
		Canvas canvas = Canvas.getCanvas();
		canvas.draw(this, "black", new Rectangle(x, y, seite, seite));
		canvas.wait(1000);
	}
}

public class KreiseTest {

	public static void main(String[] args) {

		Kreis k1 = new Kreis();
		k1.vergroessere(20);
		k1.verschiebeHorizontal(20);
		k1.verschiebeVertikal(50);

		Quadrat q1 = new Quadrat();
		q1.verschiebeHorizontal(30);
		q1.verschiebeVertikal(30);
		q1.vergroessere(-40);

		Kreis k2 = new Kreis();
		k2.vergroessere(40);
		k2.verschiebeHorizontal(70);
		k2.verschiebeVertikal(40);

		Quadrat q2 = new Quadrat();
		q2.verschiebeNach(k2);
		q2.verschiebeVertikal(10);
		q2.vergroessere(-30);
	}

}
```


----------



## L-ectron-X (15. Feb 2008)

Deinen Code kann ich nicht kompilieren. java.awt.Canvas kennt keine getCanvas()-Methode.


----------



## Cerveza1234 (18. Feb 2008)

Also bei mir klappt es... getCanvas() sieht so aus:



```
class Canvas {

	static Canvas canvasSingleton;

	static {
		canvasSingleton = new Canvas("Shapes", 500, 500, Color.white);
		canvasSingleton.setVisible(true);
	}
	static Canvas getCanvas() {
		return canvasSingleton;
	}
.
.
.
.
```


----------



## L-ectron-X (18. Feb 2008)

Du solltest in jedem Fall vermeiden, eigenen Klassen einen Namen zu geben, die in Sun's SDKs verwendet werden.
Auch wenn ohne große Probleme durch Packages möglich ist, kann es doch (wie man hier jetzt eben gesehen hat) zu Problemen oder Verwechslungen kommen, die die Fehlersuche unnötig erschweren.

Benenne mal dein Canvas um, bspw. in MyCanvas und lass mal MyCanvas von java.awt.Canvas erben.


----------



## SlaterB (18. Feb 2008)

Canvas hat auch keine draw-Operation,
woher soll man also wissen, wie du überhaupt die Figuren zeichest?


----------



## Cerveza1234 (18. Feb 2008)

ehrlich gesagt ist mir das erst aufgefallen nachdem du das geschrieben hast. Versuche halt gerade in die Welt des oo-programmierens einzutauchen und bin noch so ziemlich am anfang und hatte mir ein Bsp.-Code in mein Projekt gepackt wo die klasse canvas drin vorkam....

aber wenn wir jetzt mal von der standart klasse ausgehen ist es möglich die geometrischen figuren die man zeichnet auch unausgefüllt zu zeichnen? Ich möchte halt einen normalen Kreis haben o und keinen ausgefüllten[/img]


----------



## SlaterB (18. Feb 2008)

selbstverständlich ist alles denkbar,
siehe API, Lehrbuch!

http://java.sun.com/javase/6/docs/api/java/awt/Graphics.html

```
abstract  void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle)
          Draws the outline of a circular or elliptical arc covering the specified rectangle. 
          
abstract  void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle)
          Fills a circular or elliptical arc covering the specified rectangle. 
          
          
abstract  void fillPolygon(int[] xPoints, int[] yPoints, int nPoints)
          Fills a closed polygon defined by arrays of x and y coordinates. 
 void fillPolygon(Polygon p) 
          Fills the polygon defined by the specified Polygon object with the graphics context's current color. 

abstract  void drawPolygon(int[] xPoints, int[] yPoints, int nPoints)
          Draws a closed polygon defined by arrays of x and y coordinates. 
 void drawPolygon(Polygon p) 
          Draws the outline of a polygon defined by the specified Polygon object. 
abstract  void drawPolyline(int[] xPoints, int[] yPoints, int nPoints) 
          Draws a sequence of connected lines defined by arrays of x and y coordinates.
```


----------



## L-ectron-X (18. Feb 2008)

Cerveza1234 hat gesagt.:
			
		

> Ich möchte halt einen normalen Kreis haben o und keinen ausgefüllten


Mit drawOval() aus java.awt.Graphics.


----------



## Cerveza1234 (18. Feb 2008)

hmm ok wenns auch keine Draw funktion hat ist das schonmal schlecht also meineCanvas sieht so aus:




```
class Canvas {

	static Canvas canvasSingleton;

	static {
		canvasSingleton = new Canvas("Shapes", 500, 500, Color.white);
		canvasSingleton.setVisible(true);
	}

	static Canvas getCanvas() {
		return canvasSingleton;
	}

	// ----- instance part -----

	JFrame frame;

	CanvasPane canvas;

	Graphics2D graphic;

	Color backgroundColour;

	Image canvasImage;

	List objects;

	HashMap shapes;

	Canvas(String title, int width, int height, Color bgColour) {
		frame = new JFrame();
		canvas = new CanvasPane();
		frame.setContentPane(canvas);
		frame.setTitle(title);
		canvas.setPreferredSize(new Dimension(width, height));
		backgroundColour = bgColour;
		frame.pack();
		objects = new ArrayList();
		shapes = new HashMap();
	}

	void setVisible(boolean visible) {
		if (graphic == null) {
			// first time: instantiate the offscreen image and fill it with
			// the background colour
			Dimension size = canvas.getSize();
			canvasImage = canvas.createImage(size.width, size.height);
			graphic = (Graphics2D) canvasImage.getGraphics();
			graphic.setColor(backgroundColour);
			graphic.fillRect(0, 0, size.width, size.height);
			graphic.setColor(Color.black);
		}
		frame.setVisible(visible);
	}

	void draw(Object referenceObject, String color, Shape shape) {
		objects.remove(referenceObject); // just in case it was already there
		objects.add(referenceObject); // add at the end
		shapes.put(referenceObject, new ShapeDescription(shape, color));
		redraw();
	}

	void erase(Object referenceObject) {
		objects.remove(referenceObject); // just in case it was already there
		shapes.remove(referenceObject);
		redraw();
	}

	void setForegroundColor(String colorString) {
		if (colorString.equals("red"))
			graphic.setColor(Color.red);
		else if (colorString.equals("black"))
			graphic.setColor(Color.black);
		else if (colorString.equals("blue"))
			graphic.setColor(Color.blue);
		else if (colorString.equals("yellow"))
			graphic.setColor(Color.yellow);
		else if (colorString.equals("green"))
			graphic.setColor(Color.green);
		else if (colorString.equals("magenta"))
			graphic.setColor(Color.magenta);
		else if (colorString.equals("white"))
			graphic.setColor(Color.white);
		else
			graphic.setColor(Color.black);
	}

	void wait(int milliseconds) {
		try {
			Thread.sleep(milliseconds);
		} catch (Exception e) {
			// ignoring exception at the moment
		}
	}

	void redraw() {
		erase();
		for (Iterator i = objects.iterator(); i.hasNext();) {
			((ShapeDescription) shapes.get(i.next())).draw(graphic);
		}
		canvas.repaint();
	}

	void erase() {
		Color original = graphic.getColor();
		graphic.setColor(backgroundColour);
		Dimension size = canvas.getSize();
		graphic.fill(new Rectangle(0, 0, size.width, size.height));
		graphic.setColor(original);
	}

	private class CanvasPane extends JPanel {
		public void paint(Graphics g) {
			g.drawImage(canvasImage, 0, 0, null);
		}
	}

	private class ShapeDescription {

		private Shape shape;

		private String colorString;

		ShapeDescription(Shape shape, String color) {
			this.shape = shape;
			colorString = color;
		}

		void draw(Graphics2D graphic) {
			setForegroundColor(colorString);
			graphic.fill(shape);
		}
	}

}
```


@L-ectron-X:    ich habe keine ahnung wie man vererbt und wozu es dient 

Also und zwar möchte ich folgendes lösen...
http://www.programmierkurs-java.de/

UE22 Aufgabe 5

da vorhher ein beispiel war mit der canvas von oben dachte ich das es ja damit möglich sein müsste diese aufgabe zu lösen


----------



## Guest (18. Feb 2008)

man irgendwie seit ihr zu schnell ok ich guck mir jetzt erstmal eure lösungsvorschläge an

danke


----------

