28. oktober 2003 - 20:17Der er
16 kommentarer og 1 løsning
Problemer med Observable og Observer
Hej Eksperter
Jeg har et problem med at få Observable og Observer til at virke.
Har to vinduer i min GUI som helst skal have besked om at repainte når der sker noget i min model. Her er den relevante kode i modellen.
public GemHent(Hovedvindue viewObjekt) { this.viewObjekt = viewObjekt; addObserver(viewObjekt); spillerArray = new ArrayList(); }
public ArrayList getResult() { return spillerArray; }
public void addSpiller(Spiller sp) { spillerArray.add(sp); setChanged(); // now I am changed notifyObservers(); // ... and therefore I notifiy my observers }
I det vindue der skal opdateres skal man blot tilføje metoden update(). Ser sådan ud
public void update(Observable o, Object arg){ // This view needs updating. Let us find out what happened in the model.
ArrayList al = gh.getResult(); Iterator it = gh.getSpillerArray().iterator(); int i = 0; while (it.hasNext()){ Spiller tmpS = (Spiller) it.next(); list1.add(tmpS.getName()); list1.select(i); i++; }
} Men det virker ikke - hvad er der galt??? 100 point for et godt svar
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
f.eks. Når update kaldes: System.out.println("update kaldes");
Og det er også ret relevant at vide om din GUI klasse bliver registreret som observer. F.eks. i din addSpiler metode: System.out.println(countObservers() + " antal observere på dette objekt");
Måske du skulle poste lidt mere kode ? Eller prøve at lave et hello "observer pattern" world program - hvor du kun fokuserer på at få observer/observable til at virke. Når det virker, så kan du også få det til at virke i din nuværende kode.
(Jeg er næsten på vej i seng, og får nok ikke kigget nærmere på koden foreløbig - men der er nok en anden der kan assistere dig)
Problemet må ligge i at der ikke er nogle observers tilkoblet. Men hvordan pokker sikrer jeg mig at de observers som jeg har bliver tilkoblet den bestemte observable
Jeg tror måske jeg har fundet fejlen. Jeg havde to konstruktører hvor jeg kaldte den uden parametre. Men desværre for jeg en fejl når jeg forsæger det andet. Poster lige noget kode Starten på den klasse som skal opdateres - hvor gh er modellen. I denne klasse ligger også update metoden public class Hovedvindue extends JFrame implements Observer {
public GemHent gh = new GemHent(this);
...}
I modellen har jeg følgende
public class GemHent extends Observable implements Serializable { private ArrayList spillerArray; private Hovedvindue hv;
public GemHent(Hovedvindue hv) { this.hv = hv; addObserver(hv); spillerArray = new ArrayList(); }
public ArrayList getResult() { return spillerArray; }
public void addSpiller(Spiller sp) { spillerArray.add(sp); setChanged(); // now I am changed notifyObservers(); // ... and therefore I notifiy my observers System.out.println("update kaldes"); System.out.println(countObservers() + " antal observere på dette objekt"); }
Alt dette går fint, men jeg vil jo gerne have liv i det, så jeg laver en run klasse som skal starte Hovedvinduet op public class test2 { private static Hovedvindue hv = new Hovedvindue(); private static GemHent gh = new GemHent(hv);
public static void main(String[] arg) { gh.load(); Hovedvindue hv = new Hovedvindue(); hv.setSize(800,600); hv.setVisible(true); } } Den kører også fint - det eneste problem med den er blot at den ikke henter noget ind i GUIen som den burde, med gh.load()
Nu har jeg prøve at fjene gh.load(), så ved jeg gosdt at GUIen ikke indeholder noget fra starten men den burde vel blive opdateret når der sker noget i modellen - ikke sandt???
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.