# Dynamisch Objekte in Canvas zeichnen



## lanfire (18. Okt 2010)

Hallo,

ich versuche jetzt schon eine ganze Zeit erstmal einfach Linien auf mein Canvas zu zeichnen.
Ich denke das bei mir momentan ein grundsätzliches Verständnisproblem vorhanden ist.


Also im Prinzip hänge ich hier:

```
public class ZeichenFlaeche extends Canvas
{
  private Canvas ZeichenflaecheCanvas = new Canvas();
  Graphics g;
  @Override public void paint(Graphics g)
  {
    g.drawLine(10,100,10,10);
  }
}
```

Also eine Linie bekomme ich so schonmal angezeigt, allerdings weiß ich vorher noch nicht was ich für Linien haben will. Dass soll durch drücken von Buttons passieren.

Wie krieg ich diese Paint methode jetzt soweit das ich ihr während der Laufzeit noch weiter Objekte hinzufügen kann? Also ich möchte Beispielsweise ein Rechteck hinzufügen. Da ich jedoch noch nicht weiß, wo diese hin sollen und wie viele es sein werden, kann ich es nicht fest zeichnen.

Wie kriege ich also in meinem Canvas etwas "dynamisch" gezeichnet? Es soll halt aus meinen Action Events herraus passieren.

Kann mir jemand erklären wie ich das machen muss? Mein Buch (JAva Insel) hilft mir nur unwesentlich weiter.

Danke


----------



## SlaterB (18. Okt 2010)

du musst dir irgendeine Art der Informations-Konservierung/Ablage ausdenken,
die 2 bis 4 Punkte des Rechtecks in einen String, ein int[] oder am schönsten in einer extra Rechteck-Klasse,

diese Daten erstellt irgendjemand, wenn das klappt, dann in einem einzelnen Klassenattribut oder einer Liste ablegen
und bei jedem paint diese gemerkten Daten abfragen und verarbeiten

schau dir Tutorials hiervon an:
http://www.java-forum.org/spiele-multimedia-programmierung/6529-tutorials.html


----------



## lanfire (19. Okt 2010)

Vielen Dank! Hat funktioniert!
Habe das jetzt über eine Klasse gelöst wie du vorgeschlagen hast!


----------



## snowsaw (30. Dez 2012)

Hallo

Ich habe dasselbe Problem. Leider hat mir der Link nicht weitergeholfen.

Ich habe das "Hauptprogramm"

```
public class hauptProgramm{
	public static void main(String[] args) {
		dateiEinlesen datei1 = new dateiEinlesen();
		gui gui1 = new gui();
	
		gui1.setTitle("My AWT Frame");
		gui1.setVisible(true);

		
		System.out.println("FERTIG");
	}

}
```

Nun habe ich sämtliche Informationen zu den Zeichnungsobjekten in "datei1".

Wie greiffe ich nun auf die Instanz "datei1" in folgendem Code zu?


```
import java.awt.*;
import java.awt.event.*;
import java.util.Vector;


@SuppressWarnings("serial")
public class gui extends Frame {

	public gui() {
		setSize(500, 500);
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent ev) {
				dispose();
				System.exit(0);
			}
		});
	}

	public void paint(Graphics g) {
		Insets insts = getInsets();
		g.translate((getSize().width-insts.left-insts.right)/2+insts.left, 
				(getSize().height-insts.top-insts.bottom)/2+insts.top);

		g.setColor(Color.blue);
		g.drawRect(-200,-200,400,400);
	}
}
```

Vielen Dank


----------



## L-ectron-X (30. Dez 2012)

Bspw. indem du eine Referenz auf das dateiEinlesen-Objekt deiner gui-Referenz übergibst und die Informationen dann über die entsprechenden Methoden ausliest.

Dazu könnet das hier helfen: http://www.java-forum.org/einfuehrungen-erste-schritte/14159-zugriff-objekt-anderen.html

[OT]BTW: Halte dich bitte an die Java Coding Conventions.
Klassennamen beginnen demnach mit einem Großbuchstaben. Variablen- und Methodennamen beginnen mit einem Kleinbuchstaben. 
Innerhalb der jeweiligen Bezeichner ist dann CamelCase zu schreiben, um die Lesbarkeit zu verbessern.
Konstanten werden durchgängig groß geschrieben.

Schau dir dazu am besten die Schreibweisen der Klassen der Java-API ab.[/OT]


----------



## snowsaw (30. Dez 2012)

Vielen Dank für die rasche Antwort und den Denkanstoss. Das geht ja razfaz. Ist mein erster Forumseintrag  Mit ein bischen überlegen hat man :idea:.

Sieht nun so aus:


```
public class Gui extends Frame {

	private DateiEinlesen daten;
	
	public Gui(DateiEinlesen datei1) {
		daten = datei1;
		setSize(500, 500);
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent ev) {
				dispose();
				System.exit(0);
			}
		});
	}
........
```

und 


```
public class HauptProgramm{



	public static void main(String[] args) {
		DateiEinlesen datei1 = new DateiEinlesen();
		Gui gui1 = new Gui(datei1);
	
		gui1.setTitle("My AWT Frame");
		gui1.setVisible(true);

		
		System.out.println("FERTIG");
	}

}
```


----------

