Threading zum Neuzeichnen

Der Wolf

Erfahrenes Mitglied
Hallo Leute,

ich bin gerade dabei, mir ein Programm zusammen zu basteln um mir Daten (Laserscans) zu visualisieren, wo die Werte mir über einen XcfStream von aussen an
das Programm geliefert werden. Zum Anzeigen hab ich mir eine Klasse geschrieben, die von JPanel erbt und auf der ich dann zeichne. Ab und zu klappt das
und die Daten werden in Real-Time neu gezeichnet, aber meist, wird nur das erste mal was gezeichnet und dann nicht mehr, Wenn man debugging Augaben
mit rein nimmt, sieht man, dass die update Methode die ein repaint() meiner Klasse aufruft zwar aufgerufen wird, der call aber nicht bis zur paintComponent()
Methode durchgereicht wird. Hat jemand eine Ahnung woran das liegen könnte?
Ich habe den source Code mal angehängt. Kann das damit zusammen hängen, dass die Benachrichtgung von aussen zu schnell geschieht? Allerdings hab ich
ein anderes Programm, dass die Daten ebenfalls anzeigt, allerdings in einem JComponent und da passieren die Hänger nicht.

Gruß
Der Wolf
 

Anhänge

Hi,

ohne mir jetzt deinen Code angeschaut zu haben:
möglicherweise wird das JPanel, auf dem du dich bewegst nicht als dirty region anerkannt und wird daher nicht neu gezeichnet (Java will ja optimieren...).

Vielleicht hilft dir ja paintImmediately(Rectangle) weiter...
Zwar wartet Java dann nicht auf mehrfache Aufrufe zum Neuzeichnen, aber das scheint ja bei dir offenbar sowieso nicht der Fall zu sein. ;)

Die eigentliche repaint()-Methode stammt ja noch aus dem AWT-Unterbau der Component. repaint(java.awt.Rectangle) ist dagegen aus der JComponent und erfüllt den Zweck eventuell auch schon besser.



Grüße
Carron
 
Hallo,

sorry, das ich bisher erst so spät geantwortet habe. Ich war die letzten Tage in Signapur
und wir hatten da kein Internet zur Verfügung.
Also ich hab es jetzt mal mit der repaint(Rectangle ..) Methode versucht, aber das bringt
auch keinen Unterschied. Manchmal malt das Programm einwandfrei und dann wieder
hängt es nach der ersten Benachrichtigung.

Gruß
Der Wolf
 
Hallo hallo,
ich scheine das Problem gefunden zu haben. Ich habe einige Singleton-Klassen implementiert. Unter
anderem auch die Klasse die das Main-frame des Programms implementiert. Da ich auf einen
XCF Stream höre, wurde durch verschiedene Threads, trotz Singleton Implementierung der Konstruktor
der Klasse für das Main-frame und alle anderen singleton klassen zweimal aufgerufen. Das scheint
die Probleme beim Zeichnen hervorgerufen zu haben. Jetzt reicht es, die repaint() Methode aufzurufen.

Gruß
Der Wolf
 
Wenn man das Singleton-Pattern verwendet, dann macht man in der Regel den Getter der Instanz synchronized, damit eben nicht mehrere Instanzen gebildet werden können, also Thread-save. Aber gut, dass du das erwähnst, dann weiß ich umso besser, warum ich das immer synchronized mache ^^
Java:
public class MySingleton {
	private static MySingleton instance;
	
	public static synchronized MySingleton getInstance() {
		if(instance == null) {
			instance = new MySingleton();
		}
		
		return instance;
	}
	
	private MySingleton() {}
}
 
Zurück