# viele Kreise zeichnen



## gomagu50 (28. Oktober 2007)

Guten Tag,  könnte mir bitte jemand sagen, wie ich den Programmcode noch besser 
schreiben kann 

Ich komme hier nicht wirklich weiter. Wie kann ich eine aus vielen Kreisen eine zusammengesetzte Röhre zeichnen.
Die Klasse Kreis habe ich schon programmiert.

Hier der  von mir erstellte Code:


```
import java.awt.*;
import java.applet.*;
import java.awt.Graphics;

public class vieleKreise1 extends java.applet.Applet
{
	Kreis kreis0;
	Kreis kreis1;
	Kreis kreis2;
	Kreis kreis3;
	Kreis kreis4;
	Kreis kreis5;
	Kreis kreis6;
	
	public static void main(String[] args)
	{	
		int i;
		for(i = 1; i <= 30; i++);	
	}	
	public void init()	
	{
        kreis0 = new Kreis(120,120,60); 
        kreis1 = new Kreis(140,140,62); 
        kreis2 = new Kreis(160,160,64);
        kreis3 = new Kreis(180,180,66); 
        kreis4 = new Kreis(200,200,68); 
        kreis5 = new Kreis(220,220,70);
        kreis6 = new Kreis(240,240,72);
	}
	public void paint(Graphics g)
	{
		kreis0.zeichne(g);
		kreis1.zeichne(g);
		kreis2.zeichne(g);
		kreis3.zeichne(g);
		kreis4.zeichne(g);
		kreis5.zeichne(g);
		kreis6.zeichne(g);	      
	}
}
```


Ich würde mich sehr über Eure Hilfe freuen.

Gruß und Dank
gomagu50


----------



## zeja (28. Oktober 2007)

Und wie sieht die Klasse Kreis aus?


----------



## gomagu50 (28. Oktober 2007)

Sorry, ich hatte nicht daran gedacht, die Klasse Kreis auch einzufügen.


```
/* Die Klasse Kreis  */
   
public class Kreis extends Object 
{
	public int x; 
	public int y; 
	public int radius; 
	public final double PI = 3.14159;
	public static int kreisZaehler = 0; 

	public Kreis () 
	{ 
        this(0, 0, 100); 
	} 
 	public Kreis (int x, int y, int radius) 
 	{ 
        this.x= x; 
        this.y= y; 
        this.radius = radius; 
        kreisZaehler++;
 	}
 	public int getX() 
 	{
 		return x;
 	}
 	public int getY()
 	{
 		return y;
 	}
 	public int getRadius()
 	{
 		return radius;
 	}
 	public double getFlaeche()
 	{
 		return radius * radius * PI;
 	}
 	public double getUmfang()
 	{
 		return 2 * radius * PI;
 	}	
 	public void  bewege(int deltaX, int deltaY) 
 	{ 
        x += deltaX; 
        y += deltaY; 
 	} 
 	public void skaliere (int deltaRadius) 
 	{ 
        radius += deltaRadius; 
 	} 
	public void zeichne(java.awt.Graphics g) 
	{ 
        g.drawOval(x-radius, y-radius, 2 * radius, 2*radius); 
	} 
}
```


----------



## zeja (28. Oktober 2007)

Du könntest statt drawOval fillOval benutzen. Aber richtig gut sieht das so auch nicht aus.


----------



## gomagu50 (28. Oktober 2007)

Hallo,
nicht die Klasse Kreis ist mein Problem, sondern das Applet von
public class vieleKreise1 extends java.applet.Applet.

Ich möchte wissen, wie ich den Code verändern muss, um eine Röhre oder einen
Schlauch (Beispiel Röhre siehe Code) auf einfachere Weise mit Java zeichnen kann, denn ich meine der Code sieht für mich unschön aus und ist einfach nur umständlich.
Evtl. mit einer for-Schleife, aber wie (dabei ist zu beachten,das die Methode der Klasse
"Kreis" genutzt wird) 

Für eine Antwort wäre ich sehr dankbar.

Viele Grüße
gugoma50


----------



## zeja (29. Oktober 2007)

Du könntest die Kreis-Objekte in eine Array oder eine Liste schreiben und dann darüber mit einer for-Schleife iterieren.


----------



## Laocoon (29. Oktober 2007)

Das initialisieren kannst du auch über ne schleife lösen. Definierst du 3 Konstanten DELTA_X, DELTA_Y und DELTA_R (Verschiebung und Änderung des Radius), speicherst aktuelle Position und aktuellen Radius und initialisierst das ganze dann, wie Zeja schon gesagt hat, in eine Liste oder ein Array. 
Was soll die Schleife in der main eigentlich bewirken?

Grüße
Daniel


----------



## gomagu50 (29. Oktober 2007)

Danke für die Antworten,
aber leider bin ich nur ein Anfänger und komme damit nicht klar. Könntet Ihr mir schreiben wie das geht?

Vielen dank
gomagu50


----------



## zeja (29. Oktober 2007)

Man lernt immer mehr wenn man es selber versucht. Schau mal ob du dort: http://www.galileocomputing.de/openbook/javainsel6/javainsel_03_009.htm#Xxx999775 dir das benötigte anlesen kannst.


----------



## gomagu50 (29. Oktober 2007)

Hallo,

habe mal was probiert. Daszählen klappt, aber Zeichnen nicht, was habe ich falsch
gemacht 

Hier der Code:

```
import java.awt.*;
import java.applet.*;
import java.awt.Graphics;

public class vieleKreise2 extends java.applet.Applet
{	
	public static void main(String[] args) 
	{
		int kr = 50;
    	        Kreis[] kreis = new Kreis[kr];
		for(int i=0; i<kr; i++)
                {
    	            kreis[i] = new Kreis(100,100,50);
                }
  
	//System.out.println(Kreis.kreisZaehler+"Kreisobjekte erzeugt");	
	
	public void paint (java.awt.Graphics g) 
	{
			kreis.zeichne(g);
	}
}
}
```


Wäre für eine Hilfe dankbar.

Viele rüße
gomagu50


----------



## kaMii (30. Oktober 2007)

Ist das dein ganzer Code?
Ich denke mal, das ohne einen Aufruf von  "paint(java.awt.Graphics g)"  nie etwas gezeichnet wird.

Gruss Ben


----------



## Tobias Köhler (30. Oktober 2007)

Eine Methode wird nicht aufgerufen, dadruch dass du sie geschrieben hast, sondern erst durch seinen Aufruf. Meintest du das so:

```
import java.awt.*;
import java.applet.*;
import java.awt.Graphics;

public class vieleKreise2 extends java.applet.Applet
{	
	public static void main(String[] args) 
	{
		int kr = 50;
                Graphics g;
    	        Kreis[] kreis = new Kreis[kr];
		for(int i=0; i<kr; i++)
                {
    	            kreis[i] = new Kreis(100,100,50);
                    kreis[i].zeichne(g);                    
                }

        }
  
	//System.out.println(Kreis.kreisZaehler+"Kreisobjekte erzeugt");	
}
```

Jetzt brauchst du nur noch eine zeichne Methode


----------



## zeja (30. Oktober 2007)

Lest euch doch zumindest den ganzen Thread durch. Die Methode zeichne gibt es in der Klasse Kreis und die funktioniert auch soweit.

So zu deinem Problem gomagu50: kreis ist jetzt kein Objekt mehr von der Klasse Kreis sondern ist ein Array, enthält also viele Kreise. Damit du dieses Array auch noch in deiner paint-Methode benutzen kannst musst du es noch als Feld deklarieren:


```
public class vieleKreise2 extends java.applet.Applet
{	
        Kreis[] kreis;
	public static void main(String[] args) 
	{
		int kr = 50;
    	        kreis = new Kreis[kr];
		for(int i=0; i<kr; i++)
                {
    	            kreis[i] = new Kreis(100,100,50);
                }
	}
....
}
```

In deiner paint Methode nimmst du nun wieder eine Schleife um alle Objekte aus dem Array durchzugehen. Da du hier die Zahl nicht mehr hast die angibt wieviele Objekte in deinem Array sind kannst du stattdessen kreis.length benutzen:


```
public void paint (java.awt.Graphics g) 
	{
               for(int i=0; i<kreis.length; i++){
			kreis[i].zeichne(g);
               }
	}
```


----------



## kaMii (30. Oktober 2007)

> Lest euch doch zumindest den ganzen Thread durch. Die Methode zeichne gibt es in der Klasse Kreis und die funktioniert auch soweit.



Ich Habe nie etwas gegenteiliges behauptet.



> In deiner paint Methode nimmst du nun wieder eine Schleife um alle Objekte aus dem Array durchzugehen. Da du hier die Zahl nicht mehr hast die angibt wieviele Objekte in deinem Array sind kannst du stattdessen kreis.length benutzen:
> 
> 
> ```
> ...



@zeja: Dennoch wird in seinem Code kein einziges mal die Methoder "paint" aufgerufen.
Ich bin zwar kein Profi in Java, aber so wird er immer noch keine Kreise sehen, außer die Methode wird implizit irgendwo aufgerufen!

Gruß Ben


----------



## zeja (30. Oktober 2007)

kaMii hat gesagt.:


> Ich Habe nie etwas gegenteiliges behauptet.



Sorry, es hätte du mit Bezug auf Tobias heissen sollen 



kaMii hat gesagt.:


> @zeja: Dennoch wird in seinem Code kein einziges mal die Methoder "paint" aufgerufen.
> Ich bin zwar kein Profi in Java, aber so wird er immer noch keine Kreise sehen, außer die Methode wird implizit irgendwo aufgerufen!



Nun dann lass dir sagen dass Applet von Container ableitet und Container die Methode Paint besitzt die bei der Anzeige des Containers aufgerufen wird um dessen Inhalt darzustellen. Diese Methode ist nun überschrieben um die Kreise zu zeichnen.

Man muss nicht jede Methode in Java explizit selber aufrufen..

Sprich: Wenn du nicht so viel Ahnung von Java hast dann probiere den Sourcecode doch zumindest einmal aus bevor du einen Kommentar abgibst, denn dann hättest du gesehen dass dieser funktioniert. Das ist nicht böse gemeint, jedoch würde es halt Verwirrung in einem Thread vermeiden.

@gomagu50: Darauf angesprochen fällt mir ein dass du statt paint() besser paintComponents() nutzen solltest damit der eigentliche Container auch noch eine Chance hat sich zu zeichnen.


----------



## Tobias Köhler (30. Oktober 2007)

@zeja: tut mir ja leid, aber ich dachte, ich wäre am Anfang des Themas^^
Manchmal vergess ich eben, dass gleich zur neusten Antwort gesprungen wird... War eben ganz überrascht, dass das Thema schon mehr Einträge hat als ich dachte


----------



## kaMii (30. Oktober 2007)

zeja hat gesagt.:


> Nun dann lass dir sagen dass Applet von Container ableitet und Container die Methode Paint besitzt die bei der Anzeige des Containers aufgerufen wird um dessen Inhalt darzustellen. Diese Methode ist nun überschrieben um die Kreise zu zeichnen.
> 
> Man muss nicht jede Methode in Java explizit selber aufrufen..
> 
> Sprich: Wenn du nicht so viel Ahnung von Java hast dann probiere den Sourcecode doch zumindest einmal aus bevor du einen Kommentar abgibst, denn dann hättest du gesehen dass dieser funktioniert. Das ist nicht böse gemeint, jedoch würde es halt Verwirrung in einem Thread vermeiden.



Dachte mir so etwas schon fast, hab hier neben mir sogar ein Buch liegen rtfm: sollte man meinen) in dem Java-Applets beschrieben sind war aber etwas zu faul das ganze auszuprobieren oder nachzuschlagen. In diesem Sinne tut mir das ganze auch etwas Leid, war unqualifiziert von mir. Das nächste mal probiere ich das ganze erst aus, bevor ich Vermutungen anstelle.

Gruss Ben


----------



## gomagu50 (30. Oktober 2007)

Hallo zeja, erst einmal danke für Deine Nachrchten.Ich habe die Codes so geschreiben, wie  Du. 


```
import java.awt.*;
import java.applet.*;
import java.awt.Graphics;

public class vieleKreise2 extends java.applet.Applet
{	
		Kreis[] kreis;
	public static void main(String[] args) 
	{
		int kr = 50;
    	         kreis = new Kreis[kr];
		for(int i=0; i<kr; i++)
                {
    	          kreis[i] = new Kreis(100,100,50);
                }
    }	
	public void paintComponents (java.awt.Graphics g) 
	{
		for(int i=0; i<kreis.length; i++)
		{	
			kreis[i].zeichne(g);
		}
	}
}
```



Beim Compilieren meldet mein Compiler dann aber  folgende Fehler:

```
C:\ Java Beispiele2\vieleKreise2.java:11: non-static variable kreis cannot be referenced from a static context 
    	         kreis = new Kreis[kr]; 
    	         ^
C:\ Java Beispiele2\vieleKreise2.java:14: non-static variable kreis cannot be referenced from a static context 
    	           kreis[i] = new Kreis(100,100,50); 
    	            ^ 
2  errors
```
Ich weiß eifach nicht mehr weiter.  Was mache ich denn hier schon wieder falsch?

Viele Grüße
gomagu50


----------



## gomagu50 (30. Oktober 2007)

Hallo,

ich habe den Code etwas verändert, so dass ich jetzt keine Fehlermeldung mehr vom
Compiler erhalte, aber die Kreise zeichnet er nach wie vor nicht, warum 


```
import java.awt.*;
import java.applet.*;
import java.awt.Graphics;

public class vieleKreise2 extends java.applet.Applet
{	
		Kreis[] kreis;
	public static void main(String[] args) 
	{
		int kr = 50;
    	Kreis[] kreis = new Kreis[kr];
		for(int i=0; i<kr; i++)
                {
    	            kreis[i] = new Kreis(100,100,50);
                }
    }	
	public void paint (java.awt.Graphics g) 
	{
		for(int i=0; i<kreis.length; i++)
		{	
			kreis[i].zeichne(g);
			}
}
}
```

Vielleicht habt Ihr ja eine Idee, was ich falsch mache.

Viele Grüße und Danke schon mal für Eure Hilfe
gomagu50


----------



## zeja (31. Oktober 2007)

Der code im vorletzten Post war schon okay.

Die main ist eine statische Methode (static) also keine die eine direkte Verbindung zum Objekt der Klasse hat (denn das existiert ja auch noch nicht wenn man in der main ist).

Aus diesem Grund können keine normalen Felder der Klasse benutzt werden, da diese erst existieren wenn ein Objekt existiert (und nur über das Objekt aufgerufen werden können). Somit ist es nötig Felder die von der main benutzt werden auch als statisch zu markieren.

Also

```
static Kreis[] kreis;
```

Dann sollte es klappen. 

Ich denke du solltest noch sehr viel durchlesen z.B in "Java ist auch eine Insel". Leider erfordert das erlernen einer Sprache auch sehr viel Eigeninitiative und man muss einiges lesen


----------



## gomagu50 (1. November 2007)

Guten Tag,

jetzt habe ich den Code entsprechend geändert, aber die Kreise werden immer noch nicht im Applet angezeigt 
Die Applet-Ansicht öffnet sich, das Applet wird gestartet, aber es werden
keine Kreise gezeichnet. 


```
import java.awt.*;
import java.applet.*;
import java.awt.Graphics;

public class vieleKreise2 extends java.applet.Applet
{	
		static Kreis[] kreis;
	public static void main(String[] args) 
	{
		int kr = 50;
    	         kreis = new Kreis[kr];
		for(int i=0; i<kr; i++)
                {
    	          kreis[i] = new Kreis(100,100,50);
                }
    }	
	public void paintComponents (java.awt.Graphics g) 
	{
		for(int i=0; i<kreis.length; i++)
		{	
			kreis[i].zeichne(g);
		}
	}
}
```

Was muss  ich machen?

Da ich mit Java erst am Anfang stehe, bitte ich meine Hilflosigkeit zu entschuldigen.
Ich lerne täglich dazu.

Vielen Dank
gomagu50


----------



## zeja (1. November 2007)

Sorry..... hab nicht richtig auf deinen Code geschaut. Das mit dem Array etc muss in die Methode Init. Und das paintComponents scheint bei einem Applet auch nicht so recht was zu tun.....


```
public class vieleKreise2 extends java.applet.Applet {

	private Kreis[] kreis;

	@Override
	public void init() {
		int kr = 50;
		kreis = new Kreis[kr];
		for (int i = 0; i < kr; i++) {
			kreis[i] = new Kreis(100, 100, 50);
		}
	}

	@Override
	public void paint(java.awt.Graphics g) {
		super.paint(g);
		for (int i = 0; i < kreis.length; i++) {
			kreis[i].zeichne(g);
		}
	}
}
```


----------



## gomagu50 (1. November 2007)

Hallo zeja,
herzlichen Dank , mit einer kleinen Änderung funktioniert es jetzt. Hier der abgeänderte Code:


```
public class vieleKreise2 extends java.applet.Applet
{	
	private Kreis[] kreis;
	public void init() 
	{
		int kr = 50;
    	kreis = new Kreis[kr];
		for(int i=0; i<kr; i++)
                {
    	          kreis[i] = new Kreis(5*i,100,50);
                }
    }	
	public void paint(java.awt.Graphics g) 
	{
		super.paint(g);
		for(int i=0; i<kreis.length; i++)
		{				
			kreis[i].zeichne(g);
		}
	}
}
```


Jetzt werden die Kreise im Applet ausgegeben.

Vielen Dank nochmals
Gruß
gomagu50


----------

