Umgang mit vielen PropertyChangeEvents innerhalb kurzer Zeit

FreakyM

Mitglied
Hallo an Alle,

ich habe ein Parent-Objekt mit vielen Child-Objekten (einer ArrayList von anderen Objekten).

Immer wenn sich die Position eines Child-Objekts verändert, schickt es ein PropertyChangeEvent mit dem PropertyName "position_changed" an das Parent-Objekt (und jedem anderen PropertyChangeListener).
Das Parent-Objekt passt daraufhin sein Umriss (Polygon) an...

Wenn ich jetzt viele Child-Objekte "gleichzeitig" verschiebe bekommt das Parent-Objekt viele Events innerhalb kurzer Zeit hintereinander und passt sein Umriss ganz ganz oft hintereinander an... Dieses Verhalten ist zwar korrekt, aber genau mein Problem!
Besser wäre es, wenn das Parent-Objekt erst seinen Umriss anpasst wenn alle Child-Objekte verschoben worden sind und nicht innerhalb kurzer Zeit ganz oft. Wie kann ich das machen?


Dieses Problem habe ich nicht nur beim anpassen des Umrisses, sondern auch beim Redraw und Ähnlichem.
Ich danke euch Allen schonmal im Vorraus...


Gruß
Dennis
 
Hi,

mir fallen da zwei Möglichkeiten ein:
1. wenn du weißt, dass mehr als ein change passiert, dann könntest du vor den Änderungen ein "setChanging" setzen und bei Beendigung diese Flag wieder auf false. Oder ein change_finished-Event feuern.
2. Beim Change-Event kurz warten, ob direkt danach noch einer passiert.. Da fände ich die 1. Variante aber schöner.

Gruß,
Martin
 
Das einzige was mir jetzt einfällt ist die alte ArrayList Zwischenzuspeichern die beiden ArrayListen (alt und neu) vergleichen beim ersten PropertyChanged und einen int Wert ablegen mit der Anzahl der Änderungen diesen dann mit herunterzählen und bei gleich 1 das eigentliche Event ausführen:

Jetzt kommt irgendwas zwischen Pseudo und Java Code ;):
Java:
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;

public class test {

	int numberOfChanges = 0;
	
	ArrayList<Object> arl_old = new ArrayList<Object>();
	ArrayList<Object> arl_new = new ArrayList<Object>();
	public test(){
		PropertyChangeListener pcl = new PropertyChangeListener(){

			@Override
			public void propertyChange(PropertyChangeEvent arg0) {
				if(numberOfChanges==0)
				{
					for (int i = 0; i < arl_old.size(); i++) {
						checkIfEqual(arl_old.get(i),arl_new.get(i));
					}
				}else if(numberOfChanges>1){
					numberOfChanges--;
				}
				if(numberOfChanges==1)
				{
					eigentlicheFunktion();
					numberOfChanges = 0;
				}
			}			
		};
	}
	private void checkIfEqual(Object old_value, Object new_value){
		//if(notEqual)
		numberOfChanges++;
	}
	private void eigentlicheFunktion() {
		// Das was du machen willst wenn alle porpertys gefeuert wurden
		
	}
}
 
Zurück