2D animieren aber wie?

Status
Nicht offen für weitere Antworten.

dudu3k

Aktives Mitglied
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

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

Evil-Devil

Top Contributor
Ö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

Neues Mitglied
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

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

dudu3k

Aktives Mitglied
Mein Programm setzt Werte in Textdateien.
Naja, mit mehreren Threads könnte man unterschiedliche Geschwindigkeiten realisieren! :)
Also hier mein Code:
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:

Code:
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.
 
B

Beni

Gast
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:
Code:
// 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 );
  }
}
Code:
// 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

Aktives Mitglied
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:
Code:
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

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

Code:
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!
 
B

Beni

Gast
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.

Code:
public class Rb extends JComponent{
  public void paint( Graphics g ){ ... }
}
Code:
JFrame frame = new JFrame();
frame.add( new Rb() );
frame.setVisible( true );
 

dudu3k

Aktives Mitglied
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

Top Contributor
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"
 
B

Beni

Gast
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:
Code:
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

Aktives Mitglied
@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

Top Contributor
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

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

The_S

Top Contributor
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 ;) .

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

Code:
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

Top Contributor
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

Top Contributor
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

Top Contributor
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

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

Evil-Devil

Top Contributor
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

Top Contributor
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 :p
 

Evil-Devil

Top Contributor
Hobbit_Im_Blutrausch hat gesagt.:
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, ... ;)
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

Top Contributor
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

Aktives Mitglied
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:
Code:
public class SockCfg
{
    public static void main(String args[])
    {
        Rb rb = new Rb();
        rb.setVisible(true);
    }
}
Code:
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

Top Contributor
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

Top Contributor
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.
 
B

Beni

Gast
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

Aktives Mitglied
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

Top Contributor
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

Aktives Mitglied
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

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

The_S

Top Contributor
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

Aktives Mitglied
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

Top Contributor
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

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

dudu3k

Aktives Mitglied
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!
 

dudu3k

Aktives Mitglied
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!?


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

Code:
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

Aktives Mitglied
...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!
 

Templon

Bekanntes Mitglied
Also bei mir hat das ganze irgendwie net funktioniert :p 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:

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);
	}
}
 
G

Gast

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

dudu3k

Aktives Mitglied
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?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
U Blenderdatei mit JMoneyEngine animieren Spiele- und Multimedia-Programmierung 2
Z Objekte animieren mit Threads Spiele- und Multimedia-Programmierung 4
Luk10 (LWJGL) Aufwendiges Animieren von Texturen Spiele- und Multimedia-Programmierung 16
F LWJGL Smoother animieren lassen (wie bei JOGL = Animator) Spiele- und Multimedia-Programmierung 3
D Wasserstrahl animieren: ein Thread je Tropfen? Spiele- und Multimedia-Programmierung 7
M Schornstein: Rauch simulieren/animieren ? Spiele- und Multimedia-Programmierung 6
raptorrs Teile einer CAD-Assembly Gruppe in JAVA animieren? Spiele- und Multimedia-Programmierung 3
D Kollision funktioniert unten aber nicht oben Spiele- und Multimedia-Programmierung 4
B Programmieren wie der Befehl /ban in Minecraft geblockt wird aber nicht /ban mit einem Argument Spiele- und Multimedia-Programmierung 1
C 3d Engine : Fragment Shader , aber wie? Spiele- und Multimedia-Programmierung 17
C Eine eigene 3d Engine : Shader - aber wie ? Spiele- und Multimedia-Programmierung 2
F vlcj läuft nicht exportiert, aber in Eclipse Spiele- und Multimedia-Programmierung 2
S Draw Package - mehere Fenster will aber nur eins Spiele- und Multimedia-Programmierung 1
X LWJGL - Anklick baren Button erstellen aber wie? Spiele- und Multimedia-Programmierung 6
V Methoden werden zwar ausgeführt führen aber nicht zum Ergebnis Spiele- und Multimedia-Programmierung 5
T LWJGL VBO's funktionieren nicht, geben aber auch keinen Fehler Spiele- und Multimedia-Programmierung 0
G Sound-Sampling: Sinuston; kein Fehler, aber auch kein Ton :-( Spiele- und Multimedia-Programmierung 3
S Frage: NullPointer, aber warum? Spiele- und Multimedia-Programmierung 8
O A* funktioniert, aber zu langsam Spiele- und Multimedia-Programmierung 10
D VOte programm aber wie ?? Spiele- und Multimedia-Programmierung 8
F 2D Spiel mit verschiedenen Auflösungen aber gleichem Bildausschnitt? Spiele- und Multimedia-Programmierung 27
B Applet startet, aber führt den Thread nicht aus Spiele- und Multimedia-Programmierung 7
Developer_X Z-Buffering, ok, aber was ist mit X-Buffering und Y-Buffering? Spiele- und Multimedia-Programmierung 46
T Bekanntes Heli Spiel -> Aber Probleme damit Spiele- und Multimedia-Programmierung 30
T FMJ installieren - aber wie? Spiele- und Multimedia-Programmierung 3
T vier gewinnt programmieren - aber wie Spiele- und Multimedia-Programmierung 19
L Frame wird geöffnet es wird aber nix angezeigt Spiele- und Multimedia-Programmierung 2
D Spiele Wuerfel 3D aber wie Spiele- und Multimedia-Programmierung 6
P NPC zufällig laufen lassen, aber wie? Spiele- und Multimedia-Programmierung 2
M Tilemap, aber wie? (Ein Konzept) Spiele- und Multimedia-Programmierung 4
E Bounding Box Collision/intersection aber wie? Spiele- und Multimedia-Programmierung 10
D Focus richtig setzen? Aber wie ? Spiele- und Multimedia-Programmierung 2

Ähnliche Java Themen


Oben