PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Java] repaint() plötzlich funktionslos!



Florian
03.04.2006, 11:25
Guten Morgen!
Seit gestern Abend versuche ich eine Animation mit einem Thread auf den Bildschirm zu zaubern, aber irgendwie wird die repaint-Methode nicht mehr ausgeführt, der Thread läuft aber vernünftig durch, wie mir println() zeigt!
Hier der Code:

1. Test_main.java -> Hauptklasse

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

public class Test_main
{
public Test_main()
{

}

public static void main(String[] args)
{
Test_under frame = new Test_under("Test");
}
}

2. Test_under.java -> geerbtes JFrame -> von hier aus wird der Thread gestartet

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

public class Test_under extends JFrame
{
public Test_under(String title)
{
super(title);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent evt)
{
System.exit(0);
}
});

Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int frameWidth = 250;
int frameHeight = 250;
setBounds(((d.width / 2) - (frameWidth / 2)) , ((d.height / 2) - (frameHeight / 2)) , frameWidth , frameHeight);

Container cp = getContentPane();
cp.setLayout(null);

Test_panel panel = new Test_panel();
cp.add(panel);

setResizable(false);
setVisible(true);

Test_panel.startIntro();
}
}

3. Test_panel.java -> geerbtes JPanel -> hier ist der Thread mit der repaint()-Funktion

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

public class Test_panel extends JPanel implements Runnable
{
int x = 0;
int y = 0;

public Test_panel()
{
setBounds(0 , 0 , 244 , 218);
setBackground(Color.WHITE);
setVisible(true);
}

public static void startIntro()
{
Thread intro = new Thread(new Test_panel());
intro.start();
}

public void run()
{
for(int i = 0 ; i <= 100 ; i++)
{
x = i;
y = (i / 2);

repaint();

System.out.println(i);

try
{
Thread.sleep(100);
}
catch (InterruptedException e){}
}
}

public void paint(Graphics g)
{
super.paint(g);

g.drawRect(((244 / 2) - (x / 2)) , ((218 / 2) - (y / 2)) , x , y);
}
}


Vielleicht kann mir ja jemand weiterhelfen!?

Danke für eure Mühe!
Viele Grüße
Florian

ogni42
03.04.2006, 11:40
Du erzeugst ein anderes TestPanel in startIntro, als das was Du in Test_under verwendest.

Ich nehme an Du meinst in startIntro:

new Thread(this);

voidpointer
03.04.2006, 12:07
Hallo,

new Thread(this) geht leider nicht in einer statischen Methode.

Meine Empfehlung:
- startIntro ersatzlos streichen
- in Test_under (new Thread(panel)).start() aufrufen
- paintComponent() anstelle von paint() überschreiben
- vor dem Zeichnen des Rechtecks die Farbe setzen

Gruß, Achim.

ogni42
03.04.2006, 12:23
Simmt, aber die muss aber auch nicht static sein.

Stattdessen


Test_panel panel = new Test_panel();
cp.add(panel);

setResizable(false);
setVisible(true);

panel.startIntro();


und



public void startIntro()
{
Thread intro = new Thread(this);
intro.start();
}


Dann läuft's bei mir.

Florian
03.04.2006, 12:31
Hallo ihr beiden! :o)
Danke erstmal für eure Hilfe, ich habe mich damit nämlich gestern abend totprobiert! ;o)
Jetzt funktioniert es und ich bin glücklich!
Als nächstes muss ich diese Funktionen nur noch in mein großes Programm übernehmen, das dürfte die nächste Hürde sein, bei 1500 Zeilen Code verliere ich langsam den Überblick! ;o)


paintComponent() anstelle von paint() überschreiben
vor dem Zeichnen des Rechtecks die Farbe setzenTue ich normalerweise auch, vor allem wegen der Rendering-Funktionen!
Und die Farben nutze ich normalerweise auch sehr gerne! ;o)

Nunja, danke nochmal für eure Hilfe! :o)

Viele Grüße
Florian