Avatar billede tendal Nybegynder
28. oktober 2003 - 20:17 Der 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
Avatar billede soreno Praktikant
28. oktober 2003 - 20:24 #1
Kald
repaint();

når du har lavet de ændringer du ønsker.

Dvs. til sidst i update metoden.
Avatar billede tendal Nybegynder
28. oktober 2003 - 20:26 #2
Har jeg prøvet - det virker ikke
Avatar billede tendal Nybegynder
28. oktober 2003 - 20:28 #3
Det er som om at GUI elementerne ikke bliver notified
Avatar billede soreno Praktikant
28. oktober 2003 - 20:28 #4
Hvad er list1 for'n fætter - en JList ?

Og hvad bruger du al til ?
Avatar billede soreno Praktikant
28. oktober 2003 - 20:31 #5
Så lav nogle debug output.

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");
Avatar billede tendal Nybegynder
28. oktober 2003 - 20:56 #6
Ja der kan være noget der - countObservers() = 0 i addSpiller(), men hvor går det galt?
Avatar billede soreno Praktikant
28. oktober 2003 - 20:58 #7
Klassen Hovedvindue - implementerer den observer interfacet ?

Altså ala:
public class Hovedvindue implements Observer
Avatar billede tendal Nybegynder
28. oktober 2003 - 21:00 #8
Jeps - men jeg tænkte på om det måske kan være fordi mine ActionListeners er anonyme klasser i mine GUI vinduer
Avatar billede soreno Praktikant
28. oktober 2003 - 21:12 #9
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)
Avatar billede tendal Nybegynder
28. oktober 2003 - 21:37 #10
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
Avatar billede soreno Praktikant
28. oktober 2003 - 21:39 #11
Den klasse i modellen - arver den fra Observable ?

Altså:
public class Foo extends Observable
Avatar billede tendal Nybegynder
28. oktober 2003 - 21:41 #12
Jeps
Avatar billede tendal Nybegynder
28. oktober 2003 - 22:19 #13
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()
Avatar billede tendal Nybegynder
29. oktober 2003 - 14:55 #14
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???
Avatar billede soreno Praktikant
29. oktober 2003 - 16:54 #15
Princippet er at observer bliver notificeret når setChanged() og notifyObservers() kaldes.
Avatar billede tendal Nybegynder
30. oktober 2003 - 13:08 #16
Ja det ved jeg godt - men jag kan bare ikke få lortet til at virke
Avatar billede tendal Nybegynder
13. november 2003 - 15:51 #17
Tager den selv - for jeg har fundet ud af det :o)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester