Archief - [PROG][Java] Observer: meerdere notify's, bron achterhalen

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Messias.

Legacy Member
Ik zit met een probleempje wat betreft het Observer pattern. Ik heb verscheidene methoden in een Observable die notifyObservers() aanroepen. Nu is mijn probleem het volgende: ik zou moeten kunnen achterhalen van uit welke methode die notify kwam, om zo in m'n update van m'n Observer navenant te kunnen reageren. Want niet alle updates zijn hetzelfde.

PHP:
public class ProjectObservable extends Observable {
	// snippet

	public void insertProject(Project project) {
		this.projecten.add(project);
		projectMapper.addProject(project);
		
		setChanged();
		notifyObservers(project);
	}
	
	public void removeProject(Object project) {
		int index = this.projecten.indexOf(project);
		
		if (index >= 0) {
			projecten.remove(index);
			projectMapper.removeProject(((Project) project).getProjectId());
		
			setChanged();
			notifyObservers(project);
		}
	}
}

Het AbstractTableModel moet anders reageren bij een insert als bij een remove, dat lijkt me logisch. Zucht, wat haat ik Swing toch zo. :p


Alvast bedankt.

Bavo aka Joske

Legacy Member
Wel je kan uw argument dat je meegeeft aan notifyObject specifieker maken, zodat het metadata bevat. zoals een object ProjectEvent met daarin een Project en een String die de actie aangeeft. Je vraagt in de Observer de String op en behandelt het project in ProjectEvent naargelang.

Maar het probleem is niet dat Observer pattern niet dynamisch genoeg is, het probleem is dat jij hebt gekozen dat te gebruiken. Het zit in de Java API omdat ze 10 jaar geleden niet beter wisten wat te doen. Ondertussen hebben we al lang eventlisteners in Swing, die je niet verplichten uw inherentiestructuur/identiteit aan te passen voor functionaliteit en die betere typeren wat wordt meegegeven bij een Event.

Ik zou zeggen, kijk eens voor een eventlistener te implementeren ipv observer, en maak er een EventObject voor die een enum bevat die de actie uitlegt, en verder een project object bvb.

Zoals beschreven in http://www.javaworld.com/javaworld/javatips/jw-javatip35.html

Messias.

Legacy Member
Bedankt Bavo. Ik heb besloten het anders aan te pakken, bij een update wordt fireTableDataChanged() aangeroepen, en aldus heel de JTable ververst adhv de geupdate datacollectie.

Misschien minder performant, maar aangezien het gaat om kleine hoeveelheden data, niets om me zorgen over te maken. Toch bedankt, volgende keer tackle ik zo'n probleem met EventListeners.

Bavo aka Joske

Legacy Member
Je kan selectief data verversen in JTables afaik, door ergens een model mee te geven. Dat is trouwens een listener manier van werken, reeds voorzien door Swing :)
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan