Repaint()

Malta

Mitglied
Hallo Zusammen,

wir wollen einen Punkt auf einem Kreis laufen lassen. Hierzu haben wir eine Klasse abgeleitet von Canvas, als Membervariablen den x und y Wert unseres Punktes. Diesen setzen wir in der Methode animation() neu und rufen repaint() auf. Zum managen der Zeit verwenden wir Thread.sleep(200).
Nun ist es so, dass der Punkt zu Beginn des Programms gezeichent wir, sich nicht Bewegt und dann verschwindet. Die x und y Werte ändern sich jedoch. Woran kann das liegen???
Vielen Dank.
 

Malta

Mitglied
Java:
public class Kreis extends Canvas{
	
	private static final long serialVersionUID = 1L;
	int x =150;
	int y=0;
public Kreis(int w, int h)
	{
		super.setBounds(0,0,w,h);
}

public void paint(Graphics g)
	{
		g.translate(175, 175);
		g.setColor(Color.black);
		g.drawLine(0,175, 0, -175);
		g.drawLine(175, 0, -175, 0);
		g.drawOval(x, y, 8,8);
	}
public void animation(int i)
	{
		double dx;
		double dy;
		if(i<=180)
		{
			dx = Math.cos(i)*150;
			dy = Math.sin(i*Math.PI/180)*150;
		}
		else
		{
			dx = Math.cos(2*Math.PI-i*Math.PI/180)*150;
			dy = Math.sin(2*Math.PI-i*Math.PI/180)*150*(-1);	
		}
		x = (int) dx;
		y = (int) dy;
	}
}

animation wir in einer externen Klasse welche ein Objekt von Kreis enthält aufgerufen igeht von 0 bis 360.
 

Malta

Mitglied
Java:
Kreis k =new Kreis(300,300);
for(int i =0; i<=360; i++)
	{
		k.animation(i);
		try{ 
				Thread.sleep(200); 
				}
			catch (InterruptedException e)
			{}
						
	}
 

Malta

Mitglied
Java:
Kreis k= Kreis(300,300);
public void actionPerformed(ActionEvent e)
			{
				String label = e.getActionCommand();
				if(label.equals("Start"))
				{
					for(int i=0; i<360; i++)
                                         {k.animation();
                                           k.repaint();
                                        try{ 
                                                Thread.sleep(200); 
                                             }
                                       catch (InterruptedException e)
                                      {}
                                      }
					
			}

so?
wir haben hier gerade ein bisschen ein durcheinader produzier, tut mir leid...
 
Zuletzt bearbeitet:
G

Gast2

Gast
Wie oben schon erwähnt blockierst du dir den EDT. Langwierige Aktionen immer in nem separaten Thread ausführen.
 

Volvagia

Top Contributor
Genau. Hier liegt das Problem. Zeichenvorgänge werden in den so genannten Event Dispatcher Thread ausgeführt. Dieser besitzt eine Warteschlange in die Vorgänge hauptsächlich von anderen Threads eingereiht werden und er abreitet sie der Reihe nach ab. So weit kein Problem, Events werden aber ebenfalls im EDT abgearbeitet. Kann einfach geprüft werden:

Java:
System.out.println(EventQueue.isDispatchThread());

Wenn du jetzt auf eine Taste drückst (ich nehme an der Auslöser ist ein Button) beginnt der EDT den ActionListener abzuarbeiten. Jedes mal, wenn er ein repaint aufruft schickt er die Anweißungen zum Zeichnen an die Warteschlange. (EventQueue) Da der EDT in der Abarbeitung des Listeners steckt stauen sich die Anweißungen bis die Schleife abgearbeitet ist, und erst am Ende kann neu gezeichnet werden.

Java:
Kreis k= Kreis(300,300);
public void actionPerformed(ActionEvent e)
{
	String label = e.getActionCommand();
	if(label.equals("Start"))
	{
		new Thread() {
			public void run() {
				for(int i =0; i<=360; i++) {
					k.animation();
					
					try { 
						Thread.sleep(200); 
					}
					catch (InterruptedException e)
					{}
				}
			}
		}.start();
	}
}

Das sollte dein Problem beheben. Damit startet der EDT nur kurz einen neuen Thread und hat dann beide Hände frei neu zu zeichnen, da er nicht ständig blockiert ist.
 

GUI-Programmer

Top Contributor
Nur würde ich für diesen speziellen Fall nicht mit der Klasse Thread arbeiten, sondern mit SwingWorker, da der repaint()-Aufruf ja schließlich auch erfolgen muss, und zwar auf dem EDT. Oder den Aufruf von EventQueue.invokeLater mit einbauen:

Java:
Kreis k= Kreis(300,300);
public void actionPerformed(ActionEvent e)
{
    String label = e.getActionCommand();
    if(label.equals("Start"))
    {
        new Thread() {
            public void run() {
                for(int i =0; i<=360; i++) {
                    k.animation();
                    // HIER der Teil der auf dem EDT ausgeführt wird:
                    EventQueue.invokeLater(new Runnable() {
                        public void run() {
                            k.repaint();
                        )
                    });
                    ///////////////////////////////////////////////////////////
                    try { 
                        Thread.sleep(200); 
                    }
                    catch (InterruptedException e)
                    {}
                }
            }
        }.start();
    }
}
 

Volvagia

Top Contributor
Threads and Swing

The following JComponent methods are safe to call from any thread: repaint(), revalidate(), and invalidate(). The repaint() and revalidate() methods queue requests for the event-dispatching thread to call paint() and validate(), respectively. The invalidate() method just marks a component and all of its direct ancestors as requiring validation.
 

GUI-Programmer

Top Contributor
Ups, da hab ich mich wohl etwas vertan. Ok, rapaint() und desgleichen sind threadsave. Allerdings Methoden, die eine Komponente andersartig verändern, wie etwa setText() (z.B. bei einem JLabel) sind nicht threadsave und sollten daher vom EDT aufgerufen werden.

Spacerat hat gesagt.:
Mal ganz am Rande. Der TO verwendet einen Canvas, also AWT. Funktionieren da SwingWorker überhaupt?

Ok, stimmt wohl, dennoch sollte man schließlich möglichst bald (nach dem Einstieg in die Grafik-Programmierung) möglichst bald Swing verwenden. Und da lohnt sich die Klasse SwingWorker dann doch!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Repaint Funktioniert nicht AWT, Swing, JavaFX & SWT 2
D JUNG Repaint function does not work AWT, Swing, JavaFX & SWT 2
E repaint Probleme AWT, Swing, JavaFX & SWT 13
G listener repaint() - verschiedene Darstellung AWT, Swing, JavaFX & SWT 24
ExceptionOfExpectation Textdarstellung auf einem Canvas mit Hilfe von repaint(); AWT, Swing, JavaFX & SWT 6
J actionperformed wird nicht aufgerufen/ repaint() AWT, Swing, JavaFX & SWT 6
L Swing repaint() ruft paintComponent(g1d) nicht auf AWT, Swing, JavaFX & SWT 12
G Repaint wird nicht durchgeführt AWT, Swing, JavaFX & SWT 8
I Swing Verhindern, dass repaint() kaskadiert AWT, Swing, JavaFX & SWT 6
ms_cikar Update swingUtilities Repaint in der Schleife AWT, Swing, JavaFX & SWT 3
T Swing Probleme mit repaint() bzw. JScrollPane AWT, Swing, JavaFX & SWT 7
N Swing JButtons werden nach repaint() doppelt dargestellt AWT, Swing, JavaFX & SWT 12
K Methode repaint() AWT, Swing, JavaFX & SWT 1
B Swing Wann brauche ich repaint() ? AWT, Swing, JavaFX & SWT 1
javampir Swing repaint in JavaFX Anwendung AWT, Swing, JavaFX & SWT 3
A repaint(); AWT, Swing, JavaFX & SWT 9
J Swing ungewünschter Nebeneffekt bei der repaint() Methode AWT, Swing, JavaFX & SWT 3
A Problem: repaint() - Schleife AWT, Swing, JavaFX & SWT 3
S 2D-Grafik repaint()-Aufruf. Und nichts geschieht. AWT, Swing, JavaFX & SWT 5
Joew0815 JDialog repaint() funktioniert nicht wie gewünscht. AWT, Swing, JavaFX & SWT 2
P JPanel und Repaint AWT, Swing, JavaFX & SWT 5
J JavaFX Automatisches Neuzeichnen ("Repaint") abstellen. AWT, Swing, JavaFX & SWT 10
F JTable Repaint Issue AWT, Swing, JavaFX & SWT 1
N Observer: update ruft nicht repaint auf AWT, Swing, JavaFX & SWT 0
C Repaint() funktioniert nicht in TabbedPanel AWT, Swing, JavaFX & SWT 5
S JList repaint AWT, Swing, JavaFX & SWT 1
L NullpointerException und Probleme mit repaint() AWT, Swing, JavaFX & SWT 11
M Repaint mittels Button richtig aufrufen klappt nicht AWT, Swing, JavaFX & SWT 1
B Repaint auf JFrame, JLabel und ImageIcon AWT, Swing, JavaFX & SWT 4
K 2D-Grafik Paint - Wie binde ich repaint ein? AWT, Swing, JavaFX & SWT 8
D repaint() klappt anders als vorgestellt AWT, Swing, JavaFX & SWT 15
R Repaint() in Schleifen, Threads AWT, Swing, JavaFX & SWT 13
B Swing Repaint Problem - mal wieder AWT, Swing, JavaFX & SWT 5
P 2D-Grafik Gezielter Repaint einzelner Frames in Java-Game AWT, Swing, JavaFX & SWT 6
javampir Bei repaint nix los AWT, Swing, JavaFX & SWT 2
B Swing repaint() AWT, Swing, JavaFX & SWT 3
Ernesto95 AnimationLoop - Problem bei Aufruf von repaint AWT, Swing, JavaFX & SWT 6
P 2D-Grafik repaint(); steigender RAM Verbauch AWT, Swing, JavaFX & SWT 6
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
S Applet Repaint AWT, Swing, JavaFX & SWT 3
M Programm hängt sich auf nachdem repaint() benutzt wurde AWT, Swing, JavaFX & SWT 2
R Swing Grafikfehler bei repaint AWT, Swing, JavaFX & SWT 2
N repaint() blockieren AWT, Swing, JavaFX & SWT 6
K canvas zeig nach repaint nichts an AWT, Swing, JavaFX & SWT 8
J Swing repaint, repaint, repaint AWT, Swing, JavaFX & SWT 8
M Applet repaint() verlangsamen AWT, Swing, JavaFX & SWT 7
R paintComponent malt bei repaint() Rahmen um Panel AWT, Swing, JavaFX & SWT 7
P EDT Problem? Kein Aufruf der repaint Methode AWT, Swing, JavaFX & SWT 6
V Applet JApplet Flackern durch Repaint AWT, Swing, JavaFX & SWT 11
kodela Problem mit repaint() AWT, Swing, JavaFX & SWT 3
N Swing Funktion repaint() updated nicht AWT, Swing, JavaFX & SWT 5
F repaint reagiert nicht AWT, Swing, JavaFX & SWT 8
S AWT Probleme mit repaint() AWT, Swing, JavaFX & SWT 2
D Repaint()? Oder was??? AWT, Swing, JavaFX & SWT 5
M Eine nicht korrekte Darstellung bei repaint() warum? AWT, Swing, JavaFX & SWT 4
T 2D-Grafik Kreis "von Hand" zeichnen -> jedesmal repaint()? AWT, Swing, JavaFX & SWT 6
R validate(), repaint funktionieren nicht! AWT, Swing, JavaFX & SWT 7
B AWT Canvas überdeckt nach repaint() JComboBox-Optionen AWT, Swing, JavaFX & SWT 2
B Swing verschachteltes GUI: repaint() ändert mehr als nur gewünschte Component AWT, Swing, JavaFX & SWT 4
S validate(), invalidate(), repaint(),... Was kommt wann? AWT, Swing, JavaFX & SWT 5
M 2D-Grafik repaint() löscht altes Bild nicht AWT, Swing, JavaFX & SWT 2
J repaint() nicht richtig? AWT, Swing, JavaFX & SWT 6
R repaint erzwingen AWT, Swing, JavaFX & SWT 3
Zettelkasten repaint() von anderen Klassen aufrufen AWT, Swing, JavaFX & SWT 4
H repaint()-Problem - 50% CPU-Auslastung AWT, Swing, JavaFX & SWT 4
P repaint während Thread läuft AWT, Swing, JavaFX & SWT 9
D Repaint Frage, Design Frage AWT, Swing, JavaFX & SWT 2
N Swing MainWindow(JFrame) aktualisieren(neuzeichnen) repaint AWT, Swing, JavaFX & SWT 4
T repaint() Problem AWT, Swing, JavaFX & SWT 2
A 2D-Grafik Repaint - Alternative? AWT, Swing, JavaFX & SWT 3
C JLabel, JTextArea, JScrollPane. repaint(); ? AWT, Swing, JavaFX & SWT 6
N Swing repaint() funktioniert nicht AWT, Swing, JavaFX & SWT 5
T Swing repaint funktioniert nur manchmal? AWT, Swing, JavaFX & SWT 6
K Jpanel repaint problem (Fullscreen) AWT, Swing, JavaFX & SWT 5
V Swing Bei repaint() tut sich nichts AWT, Swing, JavaFX & SWT 7
G ColorReader, bei Fadenkreuz zeichnen mit repaint() flackern AWT, Swing, JavaFX & SWT 19
I Canvas Repaint Probleme AWT, Swing, JavaFX & SWT 2
D Swing Actionlistener verhindert repaint?! AWT, Swing, JavaFX & SWT 2
S JLabel repaint AWT, Swing, JavaFX & SWT 8
C Swing Linux mag mein Swing-repaint() nicht... AWT, Swing, JavaFX & SWT 7
J Swing paintComponent() - repaint() - BufferedImage anzeigen AWT, Swing, JavaFX & SWT 5
Luk10 repaint() auch in anderen Klassen! AWT, Swing, JavaFX & SWT 6
A repaint() zu langsam, bitte um alternativen AWT, Swing, JavaFX & SWT 5
T Überlappende Transparenz und repaint() AWT, Swing, JavaFX & SWT 10
E EINFACHE Verständnisfrage zu repaint(), paintComponent(), usw. AWT, Swing, JavaFX & SWT 16
O Girdbag Formatierung nach repaint verloren AWT, Swing, JavaFX & SWT 2
E Swing - repaint() AWT, Swing, JavaFX & SWT 6
T Image wird nicht angezeigt?! - MediaTracker/repaint AWT, Swing, JavaFX & SWT 9
E AWT Problem mit Repaint (in Loop oder Timer) AWT, Swing, JavaFX & SWT 3
O Exception bei repaint AWT, Swing, JavaFX & SWT 3
D Fragen zu Swing, paintComponent() und repaint AWT, Swing, JavaFX & SWT 6
Dit_ Zeilenmarkierung verschwindet nach repaint() AWT, Swing, JavaFX & SWT 12
A Swing Infinite repaint loop unterbrechen AWT, Swing, JavaFX & SWT 7
hdi Swing EDT macht kein repaint() AWT, Swing, JavaFX & SWT 2
F "Verrutschen" von Komponenten bei repaint() AWT, Swing, JavaFX & SWT 9
Junker Fensterinhalt vor ausführen von repaint komplett löschen. AWT, Swing, JavaFX & SWT 2
T Fenster wird trotz repaint() und revalidate() nicht sofort neu gezeichnet AWT, Swing, JavaFX & SWT 6
E Graphics2D: altes Objekt löschen, wenn repaint aufgerufen wird AWT, Swing, JavaFX & SWT 7
J Swing Verständnis-Problem repaint(int x,int y,int width,int height) AWT, Swing, JavaFX & SWT 3
C Frame repaint hat keine Wirkung AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben