# In einem Java-Fenster zeichnen



## paladin240679 (17. Okt 2011)

Hallo Zusammen,

erstmal würde ich gerne das Forum begrüssen. Habe mich gerade eben angemeldet und habe auch schon die erste Frage:

Es geht um ein kleines Java Programm mit dem ich in ein Fenster etwas Zeichnen möchte. Ich habe zwei Beispielcodes angefügt (Zeichnen und Zeichnen2).

Bei Zeichnen geht nur das Fenster auf, es wird aber nichts gezeichnet.

Bei Zeichnen2 funktioniert das Zeichnen Problemlos.

Wieso ist das so? Und was ist der Unterschied zwischen den beiden Codes? Ich würde eigentlich den Code in "Zeichnen" bevorzugen.


Vielen Dank für eure Hilfe




p.s. Da es mir darum geht die Basics zu lernen, möchte ich auch genau wissen was ich da programmiert habe und wo genau de Fehler sind.


```
import java.awt.*;




public class Zeichnen 
{
	public static void main(String str[])
	{
		Frame wnd = new Frame();
		wnd.addWindowListener(new WindowClosingAdapter(true));
		wnd.setBackground(Color.lightGray);
		wnd.setSize(500,500);
		wnd.setVisible(true);
		
	}
		
		
		
				
	public void paint(Graphics g)
	{
		
		g.setColor(Color.red);
		g.drawRect(100,30,100,30);
		g.fillRect(100,30,100,30);
				
		
	}
	}
```


```
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;




public class Zeichnen2 extends Frame
{
	public static void main(String str[])
	{
		
		Zeichnen2 wnd = new Zeichnen2();
	}
		
		
		public Zeichnen2()
		{
			
			addWindowListener(new WindowClosingAdapter(true));
			setBackground(Color.lightGray);
			setSize(500,500);
			setVisible(true);
		
		}
				
	public void paint(Graphics g)
	{
		
		g.setColor(Color.red);
		g.drawRect(100,30,100,30);
		g.fillRect(100,30,100,30);
				
		
	}
	}
```


----------



## jgh (17. Okt 2011)

im der 
	
	
	
	





```
Zeichnen
```
-Klasse machst du einen neuen Frame

```
Frame wnd = new Frame();
```
das du anschließend die paintMethode definierst ist egal, weil du nicht einen Zeichnen-Frame öffnest, sondern einen Frame.

In Zeichnen2 öffnest du halt den Zeichnen2-Frame, also deine Klasse die von Frame erbt und somit überschreibst du die paint-Methode und dein Rechteck wird angezeigt.

Edit:

```
class Zeichnen2 extends Frame {
	public static void main(String str[]) {

		Zeichnen2 wnd = new Zeichnen2();
		wnd.addWindowListener(new WindowClosingAdapter(true));
		wnd.setBackground(Color.lightGray);
		wnd.setSize(500, 500);
		wnd.setVisible(true);
	}

	public void paint(Graphics g) {

		g.setColor(Color.red);
		g.drawRect(100, 30, 100, 30);
		g.fillRect(100, 30, 100, 30);

	}
}
```


----------



## Picus (17. Okt 2011)

Vielleicht in der Klasse zwei die [c] // [/c] bei [c]extends frame[/c] weglassen.

Gruss 
P.


----------



## paladin240679 (17. Okt 2011)

Erstmal vielen Dank für die rasche Antwort.

Etwas ist mir noch unklar:


Warum genau funktioniert der erste Code nicht ("Zeichnen")? Kann man das so erklären, dass die Paint-Methode nicht weiß wo sie zeichnen soll (oder kein Frame findet), da ich ein Frame erstellt habe aber ein Zeichnen-Frame?


----------



## Gast2 (17. Okt 2011)

> Warum genau funktioniert der erste Code nicht ("Zeichnen")? Kann man das so erklären, dass die Paint-Methode nicht weiß wo sie zeichnen soll (oder kein Frame findet), da ich ein Frame erstellt habe aber ein Zeichnen-Frame?


Nein, die wird schlichtweg einfach nicht aufrufen..

Man sollte sich auch nicht unbedingt in den Zeichenvorgang von Frames einmischen. Überschreib lieber die paint/paintComponent Methode eines Panels/JPanels.


----------



## paladin240679 (17. Okt 2011)

OK, also nicht auf dem Frame zeichnen, sondern vorher ein Panel erstellen.
Obwohl das im Java Handbuch wie in "Zeichnen2" gezeigt wird.

Wie sieht das mit dem Aufruf "Zeichnen2 wnd = new Zeichnen2();" aus. Es wird "wnd" gelb unterstrichen, also Variable wird nicht benutzt.

Ausserdem wird Zeichnen2 in "public class Zeichnen2 extends Frame
" gelb unterstrichen mit der Meldung:The serializable class Zeichnen2 does not declare a static final serialVersionUID field of type long

D.h. irgendwas ist nicht sauber programmiert...hat jemand ne Idee?


----------



## Gast2 (17. Okt 2011)

> OK, also nicht auf dem Frame zeichnen, sondern vorher ein Panel erstellen.


Ja, das ist sauberer.



> Wie sieht das mit dem Aufruf "Zeichnen2 wnd = new Zeichnen2();" aus. Es wird "wnd" gelb unterstrichen, also Variable wird nicht benutzt.


Richtig, da warnt eclipse dich, weil das in der Regel nicht gewollt ist. Du kannst das umgehen indem du nur 
	
	
	
	





```
new Zeichnen2();
```
 schreibst.



> Ausserdem wird Zeichnen2 in "public class Zeichnen2 extends Frame
> " gelb unterstrichen mit der Meldung:The serializable class Zeichnen2 does not declare a static final serialVersionUID field of type long


Java möchte gerne dass jede Klasse die das Interface Serializable implementiert diese serialVersionUID angeben. Näheres zu der Konstanten findest du bei Google.


----------



## paladin240679 (18. Okt 2011)

> Man sollte sich auch nicht unbedingt in den Zeichenvorgang von Frames einmischen. Überschreib lieber die paint/paintComponent Methode eines Panels/JPanels.



Zum allgemeinen Verständniss:

Ich sollte also beim Zeichnen nicht in Ebenen denken (wie z.B.HTML oder Photoshop), sondern dass bei einem Zeichnen-Vorgang die Ursprüngliche (Frame) Zeichnung überschrieben (also geändert) wird.

Mit anderen Worten: Ein Frame (oder Panel etc.) ist schon eine Zeichnung, die ich mit der Methode Paint überschreibe, also abändere. Ist das richtig?


----------



## jgh (18. Okt 2011)

na ja so halbwegs:

Ein (J)Frame, (J)Panel etc. haben mehrere Methoden wie sie sich zeichnen.
Du kannst diese Methoden überschreiben, grundsätzlich ist es egal, ob du die Methode in einem JPanel, oder einem JFrame überschreibst..aber da logischerweise der JFrame viel komplexer als ein JPanel ist, überschreibt man eher die Methode eines JPanels und packt diesen dann in den Frame.

Das mit den Ebenen passt eigentlich imho auch...


----------



## paladin240679 (18. Okt 2011)

> Das mit den Ebenen passt eigentlich imho auch...



du meinst also nicht in Ebenen denken, sondern eher in Überzeichnen denken, oder?


----------



## jgh (18. Okt 2011)

mmmh, in Ebenen denken wie bei Photoshop passt auch, da du auch in Swing, oder mit AWT auch Panels übereinander legen kannst. Nur -wie du schon sagst- kannst du jede Ebene in seinem Zeichenvorgang verändern.


----------

