# 2D animieren aber wie?



## dudu3k (12. Jun 2007)

Hallo!
ich möchte mein Projekt: ShockCfg
also ich möchte in der 2D Oberfläche Animationen in Java2D erstellen! ist das möglich? also ich nach dem thema gegoogelt hab, konnte ich bloss finden, wie man bilder läd, aber nicht wie man programmierte animationen, sich bewegen lässt!?
Danke!


----------



## The_S (12. Jun 2007)

kA was dein Programm macht, aber animierenen tut man normalerweiße mit hilfe von Timer oder Thread.


----------



## Evil-Devil (12. Jun 2007)

Öhm, eigentlich sind das alles einzelne Bilder die du nacheinander abspielst. Mehr ist das nicht. Du kannst die Bilder alle einzeln speichern oder in einem Bild wo du dann nur noch den entsprechenden Bildausschnitt anzeigen lassen musst.


----------



## g2610 (12. Jun 2007)

also, du zeichnest das bild und gibst es mit nem bestimmten algorythmus neue koordinaten. nach den neuen koordinaten repaintest du das panel, label, ... mit ner Thread.sleep Methode kannst du das dann etwas ausbremsen. Wenn du mehrere Animationen gleichzeitig machen willst, kannst du das auch in verschiedene Threads aufteilen.

PS: Nen Beispiel-Code wär nicht schlecht, um gezielt auf dein Problem einzugehen!  :meld:


----------



## Evil-Devil (12. Jun 2007)

Warum mehrere Threads? Dafür brauch man nur einen Thread und mehr nicht. Verkompliziert doch nicht alles so sehr...


----------



## dudu3k (14. Jun 2007)

Mein Programm setzt Werte in Textdateien.
Naja, mit mehreren Threads könnte man unterschiedliche Geschwindigkeiten realisieren! 
Also hier mein Code:

```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ShockCfg extends JFrame
{
    public static void main(final String args[])
    {
        UIMANAGER.put("TabbedPane.selected", Color.green);
        JDialog.setDefaultLookandFeelDecorated(true);
        JFrame vonbraun = new JFrame();
        vonbraun.setBackground(Color.black);
        vonbraun.setForeground(Color.green);
        JPanel vonbraun1 = new JPanel();
        vonbraun.getContentPane().add(vonbraun1);
        vonbraun1.setOpaque(true);
        new Rb();
        vonbraun.pack();
        vonbraun.setSize(566, 366);
        vonbraun.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        vonbraun.setVisible(true);
    }
}
```

das war die ShockCfg.java, nun die Rb.java:


```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class Rb
{
    public void Paint(Graphics g)
    {
        Graphics2D g2 = (Graphics2D) g;
        g2.setColor(Color.green);
        int x = 99;
        int y = 99;
        g2.drawRect(x, y, 9, 9);
        while(x<=99)
        {
            repaint();
            g2.drawRect(++x, ++y, 9, 9);
        }
    }
}
```

leider geht das repaint() bei mir nicht und gezeichtnet wird irgendwie auch nix.


----------



## Beni (14. Jun 2007)

Du erstellst mal ein Rb-Objekt, aber du verwendest es niergends...
Sollte das nicht "Rb extends JComponent" heissen, und wolltest du nicht "paint" anstelle von "Paint" schreiben? Ausserdem müsstest du die Rb-Component auch noch auf ein JFrame (oder Panel) add-en.

Mal ein bisschen Code, wie eine Animation gebaut werden kann:

```
// Panel das ein einzelnes Bild zeichnet:
public class Paint extends JComponent{
  private int z;
  public void setZ( int z ){
    this.z = z;
    repaint();
  }
  public void paintComponent( Graphics g ){
    g.setColor( Color.BLACK );
    g.fillRect( 0, 0, getWidth(), getHeight() );
    g.setColor( Color.RED );
    g.fillOval( z, getWidth()/2, 10, 10 );
  }
}
```


```
// Thread, der die Animation berechnet (in diesem Fall
// ist "z" die ganze Animation).
public class Animation extends Thead{
  private int z = 0;
  private long time = 0;
  private Paint paint;

  public Animation( Paint paint ){
    this.paint = paint;
  }

  public void start(){
    time = System.currentTimeMillis();
    super.start();
  }

  public void run(){
    while( !isInterrupted() ){
      long current = System.currentTimeMillis();
      int delta = (int)(current - time);
      
      z += delta;
      paint.setZ( z );

      time = current;
      try{
        Thread.sleep( 25 );
      }
      catch( InterruptedException ex ){
        interrupt();
      }
    }
  }
}
```

P.S. Ein Thread benötigt enorm viel Ressourcen, *ein* Thread für alle Animationen muss genügen (und ist im Endeffekt auch einfacher zu handhaben als 20...)!


----------



## dudu3k (14. Jun 2007)

Also ich zeichne nicht auf einem Component, sondern auf einem Frame und einem Panel, aber das kommt ja auf das gleiche raus. Wenn ich den Code für den Frame in die Rb aufnehme, dann wird gar nichts angezeigt, und das Programm beendet. Hier noch mal der korrigierte Code:

```
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class ShockCfg 
{ 
    public static void main(String args[]) 
    {
        Rb rb2 = new Rb();
    }
}
```


```
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

class Rb extends JFrame
{ 
    public Rb()
    {
        JFrame vonbraun = new JFrame(); 
        vonbraun.setBackground(Color.black); 
        vonbraun.setForeground(Color.green); 
        JPanel vonbraun1 = new JPanel(); 
        vonbraun.getContentPane().add(vonbraun1); 
        vonbraun1.setOpaque(true); 
        vonbraun.pack(); 
        vonbraun.setSize(566, 366); 
        vonbraun.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
        vonbraun.setVisible(true); 

    }
    public void Paint(Graphics g) 
    { 
        Graphics2D g2 = (Graphics2D) g; 
        g2.setColor(Color.green); 
        int x = 99; 
        int y = 99; 
        g2.drawRect(x, y, 9, 9); 
        while(x<=99) 
        { 
            repaint(); 
            g2.drawRect(++x, ++y, 9, 9); 
        } 
    } 
}
```

Kann mir jemand sagen, wo hier der Fehler liegt? Ich wollte es erst mal ohne Threads probieren, da das ein sehr schwieriges Thema ist, und ich nach drei mal lesen, aus dem Tutorial von Sun nicht schlau geworden bin!


----------



## Beni (14. Jun 2007)

Dein Fehler ist, dass du eine Methode "Paint" irgendwo hinwirfst, wo sie niemals eine Wirkung haben kann.

Überschreib die "paint" (kleingeschrieben!)-Methode einer Component (wie z.B. JPanel), und füge diese Component deinem Frame hinzu.


```
public class Rb extends JComponent{
  public void paint( Graphics g ){ ... }
}
```


```
JFrame frame = new JFrame();
frame.add( new Rb() );
frame.setVisible( true );
```


----------



## dudu3k (14. Jun 2007)

Da hast du teilweise recht, das extends stand in der falschen Datei, ich hab das oben mal korrigiert. Auf das Paint, kommt es grade aber gar nicht an, das Problem ist dass das Frame gar nicht angezeigt wird, und das Programm einfach so beendet, nach dem starten. Komisch ist auch, dass ich den Code nur aus meinem Projekt, wo er in der ShockCfg steht, kopiert habe, und es eigentlich so laufen sollte.
Einen Frame braucht man nicht zu adden, er wird alleine erstellt. Wenn dem nicht so wäre würde mein Projekt so nicht laufen, und das Javahandbuch wäre falsch geschrieben!  :lol:


----------



## The_S (14. Jun 2007)

Dein Frame musst du auch schon noch visible setzen ...


----------



## dudu3k (14. Jun 2007)

Mach ich ja in Zeile 19!


----------



## The_S (14. Jun 2007)

achja stimmt ... da du von JFrame erbst und dann nochmal eines in einer Methode erstellst, war ich ein wenig verwirrt  .

1.) Variablen schreibt man klein
2.) Das final in der main ist unnötig
3.) Dass du von JFrame erbst ist auch unnötig, denke aber, dass es eher so gewollt ist, noch ein extra JFrame zu erzeugen
4.) Ein Konstruktor enthält kein "void"


----------



## Beni (14. Jun 2007)

Zum starten: rufst du die richtige main-Methode auf? Projekt ist frisch kompiliert? Kannst du alles mit einem geschickt gesetzten "System.out.println..." testen :wink:

Zum Code oben: Wenn du das so machen willst, wie du oben geschrieben hast, dann müsstest du sowas machen:

```
public class Rb extends JFrame{
  public static void main( String... args ){
    Rb frame = new Rb();
    frame.setVisible( true );
  }
}
```
... denn du willst ja ein Rb sehen, nicht irgendein beliebiges Frame.


----------



## dudu3k (14. Jun 2007)

@Hobbit im Blutrausch: Danke, hab das final und das void rausgenommen. die Variable korrigiert; und das extend brauch ich für das repaint!

@Beni: Ja, zum starten Ruf ich java ShockCfg auf. Testen kann ich dank Hobbit im Blutrausch jetzt auch so, denn das Fenster ist jetzt sichtbar!
Ja richtig, ich will Rb sehen, aber da ich in der main schon ein rb1 hab, muss ich mir über die Namensgebung noch mal gedanken machen, das kommt wie oop bei mir immer ganz zum Schluss!  :roll: 

Das Problem ist jetzt, dass Paint nicht malt, der Frame bleibt schwarz!  Ich glaub ich sollt noch mal drüber nen Mittagsschläfchen halten, ist wohl schon zu lang her dass ich java programmiert hab!


----------



## The_S (14. Jun 2007)

Das repaint wird dir aber nie was bringen, weil du dann immer auf dein Rb zugreifst, nciht aber auf das Frame, dass du in Rb erzeugst. Deswegen solltest du dir meinen 3. Vorschlag nochmal durchlesen, vorallem den 2. Teil  .


----------



## dudu3k (14. Jun 2007)

naja eigentlich will ich nur ein frame.  wie greife ich denn auf das vonbraun frame mit paint und repaint zu?


----------



## The_S (14. Jun 2007)

über vonbraun.repaint() !?


----------



## dudu3k (14. Jun 2007)

Nein, dann kommt ein cannot resolve symbol Fehler!


----------



## The_S (15. Jun 2007)

natürlich, wenn du keine Möglichkeit gibst von außen auf das JFrame zuzugreifen ... ich glaube das Beste wird sein, wenn man dir die normale vorgehensweiße mal an einem Beispiel zeigt, du programmierst hier nämlich nichts anderes als schmuh und ich hab so den Anschein, als ob du überhaupt nichts verstehst  .


```
public class ShockCfg
{
    public static void main(String args[])
    {
        Rb rb = new Rb();
        rb.setVisible(true);
    }
}
```


```
import java.awt.*;
import javax.swing.*;

public class Rb extends JFrame
{
	
    public Rb()
    {
        setSize(566, 366);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }
    
    public void paint(Graphics g)
    {
        g.setColor(Color.green);
        int x = 99;
        int y = 99;
        g.drawRect(x, y, 9, 9);
    }
}
```

Sobald du diesen Code verstanden hast, können wir übers animieren reden!


----------



## Evil-Devil (15. Jun 2007)

Wieso zeichnen eigentlich alle immer ins Frame?
Ein Canvas als Zeichenfläche das einem Frame hinzugefügt wird ist doch viel praktischer. Vorausgesetzt man nutzt keine oder wenig AWT/Swing GUI Elemente, was ich bei einem Spiel als Grundvoraussetzung seh.


----------



## The_S (15. Jun 2007)

Naja, ich zeichne normal nicht auf ein JFrame, aber sein Code war ja so aufgebaut, wollte ihn da nicht etwas komplett neues liefern.

In diesem Fall sollte es zu einem Problem kommen, wenn er auf ein Canvas zeichnet, da Canvas AWT und JFrame Swing ist  .


----------



## Evil-Devil (15. Jun 2007)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> In diesem Fall sollte es zu einem Problem kommen, wenn er auf ein Canvas zeichnet, da Canvas AWT und JFrame Swing ist  .


Hat sich bisher als sehr gut erwiesen und ich hatte nie Probleme damit. Natürlich muss man die Bufferstrategie und dergleichen selbst festlegen, das sind aber auch nur ~3 Zeilen Code zusätzlich.


----------



## The_S (15. Jun 2007)

Es geht mir nicht um Buffering oder ähnliches, sondern vielmehr um den Grundsatz, dass man AWT uns Swing nicht mischen soll!


----------



## Evil-Devil (15. Jun 2007)

Dann nimm doch ein reguläres Frame. Das fällt am Ende eh nicht auf, da das ganze ohne Rahmen etc dargestellt wird.

Spätestens wenn du JOGL/LWJGL nutzen willst, musst du AWT und Swing mischen. Und sei es nur die OpenGLAWTCanvas Komponente.


----------



## The_S (15. Jun 2007)

Evil-Devil hat gesagt.:
			
		

> Dann nimm doch ein reguläres Frame. Das fällt am Ende eh nicht auf, da das ganze ohne Rahmen etc dargestellt wird.



Oder anstelle von Canvas JComponent, JPanel, ... 



			
				Evil-Devil hat gesagt.:
			
		

> Spätestens wenn du JOGL/LWJGL nutzen willst, musst du AWT und Swing mischen. Und sei es nur die OpenGLAWTCanvas Komponente.



Ganz ehrlich, ich mag zu bezweifeln, dass ein Anfänger so etwas vor hat


----------



## Evil-Devil (15. Jun 2007)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> Evil-Devil hat gesagt.:
> 
> 
> 
> ...


Naja, ist eigentlich zuviel Extraballast. Vor allem wenn man beim 4K Contest mitmacht 

Es sind nur 2 Komponenten die man einsetzt und da kann man über all dieses "Never mix AWT and SWING" hinweg sehen, oder?


----------



## The_S (15. Jun 2007)

Logisch, wenn man weiß, was man macht, dann kann man das meistens übergehen. Aber gerade für Anfänger beharre ich doch auf die strikte Trennung von Swing und AWT  .


----------



## dudu3k (15. Jun 2007)

Leider geht dein code nicht! wenn ich ihn in mein programm einbaue, dann wird das programm sofort wieder beendet! und wenn ich ihn ohne etwas ausführe, dann bekomme ich ein graues fenster agezeigt!
hier noch mal der code: 

```
public class SockCfg
{
    public static void main(String args[])
    {
        Rb rb = new Rb();
        rb.setVisible(true);
    }
}
```


```
class Rb extends JFrame
{
    public Rb()
    {
        setBackground(Color.black);
        setForeground(Color.green);
        setSize(566, 366);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }

    public void Paint(Graphics g)
    {
        Graphics2D g2 =(Graphics2D) g;
        g2.setColor(Color.green);
        int x = 99;
        int y = 99;
        g2.drawRect(x, y, 9, 9);
        while(x<399)
        {
            repaint();
            g2.drawRect(++x, ++y, 9, 9);
        }
    }
}
```
vieleicht kannst du mal meinen code ausprobieren, und mir nicht bloss irgendwelche codefetzen hinwerfen, die nicht funktionieren wenn ich sie einbau, ich glaub, dann kommen wir schneller zum Ziel! ich such jetzt mal den fehler warum mein programm im vergleich zum testcode nicht das gleiche macht!


----------



## The_S (15. Jun 2007)

Hey, mach mal halblang. Wenn man keine Ahnung hat, einfach mal die Klappe halten!

1.) Du sollst meinen Code nicht verändern, sondern ersteinmal nur übernehmen
2.) Es soll auch nur ein Fenster angezeigt werden, da du es bis dato noch nicht mal auf die Reihe gebracht hast ein einfaches Fenster sichtbar zu machen
3.) Bei genaueren hinsehen wird kein graues Fenster angezeigt, sondern ein graues Fenster mit einem grünen Rechteck (unausgefüllt)
4.) Ich poste keine code-fetzen, sondern vollständig und ohne änderungen ausführbare programme
5.) Wenn du meinst, du musst an meinen Beispielen etwas ändern und es dann nicht mehr geht, kann ich auch nix dafür
6.) Dein Programm beendet sich nicht, sondern läuft unendlich weiter ohne etwas anzuzeigen. Da du pro aufruf von paint, selbige Methode wieder 300mal aufrufst! Zumindest wenn du endlich mal Paint klein schreiben würdest
7.) Denk das nächste mal nach, bevor du dich zum Affen machst!
8.) Methoden schreibt man klein
9.) Variablen schreibt man klein

[edit] Sorry, aber bei solchen Überheblichkeiten platzt mir einfach die Hutschnur!


----------



## Evil-Devil (15. Jun 2007)

Weil du die paint Methode noch immer groß angefangen hast. DIe muss klein geschrieben werden. Java ist CaSeSenSiTiVe. Es gibt einfach keine *Paint(Graphics g)* MEthode.


----------



## Beni (15. Jun 2007)

Hobbits Code funktioniert bei mir einwandfrei. Mir fallen spontan zwei Gründe ein, wieso das bei dir nicht funktionieren könnte:
- Du benutzt eine seltsame Version von Java. Benutzt du eine offizielle Version von Sun?
- Du hast den Code von Hobbit nicht korrekt kopiert, aber dann ist dir auch nicht mehr zu helfen :wink:

Bei deinem Code könntest du endlich mal "Paint" klein schreiben, dann würde zumindest die Möglichkeit bestehen, dass die Methode überhaupt aufgerufen wird. :bae:


----------



## dudu3k (15. Jun 2007)

tut mir leid, ich wollt dich nicht provuzieren, sondern schlichten weil du mich zum affen gemacht hast! ich probier die ganze zeit aus eurem code, meinen fehler im programm zu erkennen! wenn ihr mir sagt wie ich es auch machen könnte bringt mir das nichts, weil dann muss ich mein programm ganz neu schreiben! ich muss leider wissen wo in meinem programm der fehler steckt und warum es nicht arbeitet wie es soll! ich bin kein anfänger, den fehler in meinem programm, den ich im vorigen post beschrieben hab hab ich nun im handumdrehen beseitigt! normalerweise finde ich fehler auch sehr schnell, nun weiss ich aber nicht wo in deinem programm wenn ich es mit deinem mixe der fehler steckt! ich hoffe wir können uns auf meinen code einigen! 
also, ich hab mir deinen code zu herzen genommen, und close, und size in rb, was auch richtig ist, da es ja zum objekt gehört! gewundert hab ich mich, dass du setVisible... in die main funktion auslagerst! muss man das so machen? passt nicht zum oop :/
naja ok, dass ich schlichten wollt e stimmt nicht, es hat mich schon aufgeregt dass du mich als schmuproduzenten betitelt hast! aber streiten bringt nix! also lasst uns eine friedenspfeiffe rauchen


----------



## The_S (15. Jun 2007)

Wo hab ich dich zum Affen gemacht? Dein Code war so schlichtweg falsch! 

Die Auslagerung von setVisible ist geschmackssache, generell würde ich aber eher dazu tendieren sie Auszulagern, weil eine View nicht selbst bestimmen sollte, wann sie sichtbar ist und wann nicht.

Dein Code ist nicht anders als meiner, nur dass du noch eine Schleife drin hast. Die Schleife wird so aber nicht funktionieren, da du so die paint-Methode immer und immer wieder aufruft, da ein repaint u. a. auch wieder eben diese paint-methode aufruft. Deshalb muss die schleife außerhalb der paint-Methode. Außerdem brauchst du noch zwingend einen Thread oder einen Timer, der eine klassenvariable in gewissen intervallen ändert, anhand deren dann die paint Methode deine Zeichnung anpasst. Ohne Thread würde deine GUI nämlich geblockt. Um Zeichnungen zu aktualisieren bietet sich außerdem noch SwingUtilities.invokeLater an.

Ob du Anfänger bist oder nicht, sei mal dahingestellt. Ich selbst hab mich erst ca. nach 1,5 Jahren Java nicht mehr als Anfänger sondern als Fortgeschritten gesehen. Was ich übrigens momentan (nach fast 1,5 weiteren Jahren) immernoch tue.


----------



## dudu3k (15. Jun 2007)

sorry, ich war heut morgen im stress, aber jetzt gehts wieder! wie gesagt, du hast gemneint, dass ich schnu geschrieben hab, was auch immer das bedeuted 
dass ich einen thread brauch ist mir klar, den mach ich aber als letztes!
es wäre toll, wenn meine falsche grafik angezeigt werden würde, ich also wüsste, warum der hintergrund schwarz ist! 
dass ich so einen müll code, liegt wohl am javahandbuch, da ist das so drin! ich hatte den code aus meiner grafik, die auch auf meiner homepage www.nixphoe.com ist.


----------



## dudu3k (15. Jun 2007)

juhu es geht!  :lol: es lag wirklich am gross geschriebenen paint! 
danke, ich werde euch ehrenhaft im change.log erwähnen


----------



## The_S (15. Jun 2007)

ohne einen Thread oder ähnlichem gibts aber keine Animation  . Also so richtig überhaupt keine Animation!

Mit "schmuh" meinte ich, dass du da n paar Fehler drin hast, ist bei uns in Unterfranken ein gebräuchlicher Begriff  .

Ich würde vorschlagen wir fangen "nochmal von vorne an" (ich blick nämlich auch immer weniger, was du jetzt willst und wo wir momentan stehen) und du erklärst nochmal in aller Ruhe was du haben möchtest und wie weit du bis jetzt bist  !?

[edit] Wenn du mir jetzt noch ne Erklärung gibst, warum das paint klein geschrieben werden muss, geb ich mich zufrieden und du wirst ehrenhat entlassen  .


----------



## dudu3k (20. Jun 2007)

ja, am thread probier ich mich dann mal, wenn ich aber keine verbindung zu mausaktionen herstellen kann, bringt mir das nichts, und dann war alles umsonst! also ich poste dann mal morgen was ich hab mit thread.
ich denke, schmuh heisst schmutz, und das ist nicht net, bin halt kein franke! 
warum das paint klein geschrieben wird, weiss ich nicht, normal werden ja methoden gross geschrieben und nur variablen klein!


----------



## The_S (20. Jun 2007)

Wer hat dir denn das erzählt? Methoden UND Variablen werden klein geschrieben, nur Klassen werden groß geschrieben. Dadurch, dass du paint klein schreibst, überschreibst du die entsprechende Methode in deiner Super-Klasse.


----------



## dudu3k (22. Jun 2007)

ja stimmt, hab es verwechselt!
das mit dem thread mach ich mal übers wochenende, bin grad noch ein buch über oop am lesen.


----------



## dudu3k (23. Jun 2007)

hm also ich hab mehrere beispiele für animation und thread, werd mir die mal heute und morgen anschauen. mich würde halt das spartanischste beispiel interessieren. und dann noch die andere möglichkeit die einer von euch erwähnt hat! wäre nicht schlecht wenn das funktioniert, weil ohne thread wäre ja wirklich besser!


----------



## Evil-Devil (23. Jun 2007)

Hier, was ganz einfaches. Space Invaders.
http://www.cokeandcode.com/spaceinvaderstutorial


----------



## dudu3k (21. Aug 2007)

hallo,
ich hab es jetzt mal probiert. leider ist der thread nicht animiert. kann mir jemand sagen was ich falsch gemacht hab?

Edit: hoppla, waren zwei fehler im code! hab sie korrigiert, jetzt läuft das programm, fragt sich nur noch warum nicht richtig!?



```
public class Test
{
public static void main(String[] args)
{Rickenbacker Rick = new Rickenbacker();
			Rick.setVisible(true);
			Thread Ricker = new Thread();
			Ricker.start();
}
}
```


```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class Rickenbacker extends JFrame implements Runnable
{

	public Rickenbacker()
	{
		//fenster erstellen
		//super("ShockCfg" + ShockCfg.version);
		setBackground(Color.black);
		setForeground(Color.green);
		setSize(566,366);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);	//EXIT_ON_CLOSE?
	}

	public void run()
	{
		;
	}

	public void paint(Graphics g)
	{
		Graphics2D g2 = (Graphics2D)g;
		g2.setColor(Color.green);
		int x = 66;
		int y = 66;
		g2.drawRect(x, y, 9, 9);
		while(y<361)
		{
			this.repaint();
			g2.drawRect(++x, ++y, 9, 9);
			try
			{
				wait(366);
			}
			catch(InterruptedException e)
			{
				System.out.println("Error: You hacked yourself!");
			}
		}

	}
}
```


----------



## dudu3k (23. Aug 2007)

...findet niemand den fehler? ich glaub er ist in der main datei, in der art wie das frame und der thread initallisiert wird!?
danke im vorraus!


----------



## dudu3k (27. Aug 2007)

also nach meiner meinung ist alles richtig! woran kann das liegen????


----------



## Templon (27. Aug 2007)

Also bei mir hat das ganze irgendwie net funktioniert  wurde immer irgendeine Exception geworfen...

Hab mal das ganze so gemacht das es funktionieren sollte (Hab net den ganzen Thread gelesen, aber ich glaube du möchtest das dieses Vierreck irgendwo hin fährt...)

Waren noch ein paar kleine Fehler drin. z.B. sollte man die Methode paintComponent() und nicht die paint overriden (Bin mir nicht 100%ig sicher ob man nicht es nicht auch mit paint() machen kann). Und in deiner run() Funktion machst du ja gar nichts?  :wink: Und das repaint gehört nicht in die paint() Funktion... 

Hier mal den Code:


```
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JFrame;
import javax.swing.JPanel;

class Rickenbacker extends JFrame {
	
	JPanel panel;
	MyThread thread;
	
	public Rickenbacker() {
		
		setBackground(Color.black);
		setForeground(Color.green);
		setSize(566, 366);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setLayout(new BorderLayout());
		
		panel = new JPanel() {
			
			int x = 0;
			int y = 0;
			
			@Override
			public void paintComponent(Graphics g) {
				super.paintComponent(g);
				Graphics2D g2 = (Graphics2D) g;
				g2.setColor(Color.green);
				g2.drawRect(++x, ++y, 9, 9);
			}
		};
		thread = new MyThread();
		thread.start();
		add(panel, BorderLayout.CENTER);
	}
	
	class MyThread extends Thread {
		@Override
		public void run() {
			while (true) {
				try {
					Thread.sleep(20);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				panel.repaint();
			}
		}
	}

	public static void main(String[] args) {
		Rickenbacker Rick = new Rickenbacker();
		Rick.setVisible(true);
	}
}
```


----------



## Gast (24. Sep 2007)

Kann jemand kurz erklären wie man jetzt die obige Animation wieder stoppen kann?


----------



## Xams (30. Sep 2007)

ersetzt while(true) durch while(running) und zum stoppen machst du nur running = false


----------



## dudu3k (15. Dez 2007)

Danke Templon ich bekam schon hilfe auf forums.java.sun.com von crwood aber ich kann den thread leider nicht mehr finden.
die lösung ist in meinem program in der datei rickenbacker.java
ich find sie einfacher und ich verstehe auch nicht was dieses @ bedeuted?


----------

