Avatar billede iceyblue Nybegynder
11. december 2002 - 18:42 Der er 12 kommentarer og
1 løsning

ObserverPattern Eks. - Simpelt spørgsmål!!

Hej, jeg har lavet et lille eksempel med brug af Observer Patterne, for at få en forståelse af det. Det benytter disse klasser:

StartApp.java - Starter programmet med at indlæse en int.
ObserverIF.java -Interface, giver Frame1 besked!
Sale.java - indeholder variabel og instans af interfacet
Frame1.java - Viser indhold af int total fra Sale-klassen

Problemet er at jeg får følgende fejl, når jeg indlæser et tal:

Exception in thread "main" java.lang.NullPointerException
        at Sale.publishPropertyEvent(Sale.java:13)
        at Sale.setTotal(Sale.java:19)
        at StartApp.main(StartApp.java:13)
Press any key to continue...

Herunder er klasserne:
----------------------------------------------------------
import java.io.*;
public class StartApp
{
  public static void main(String[]args) throws IOException
  {
    Sale s = new Sale();
    int variabel = 1;

    InputStreamReader tegnLaeser = new InputStreamReader(System.in);
    BufferedReader ind = new BufferedReader(tegnLaeser);

    s.setTotal(variabel = Integer.parseInt(ind.readLine()) );
    System.out.println("Du skrev: "+variabel);
  }
}

----------------------------------------------------------
public interface ObserverIF
{
  public void notify(int o);
}
----------------------------------------------------------
public class Sale
{
  ObserverIF of;
  int total = 4;

  public Sale()
  {
  }

  public void publishPropertyEvent(int total)
  {
    of.notify(total);
  }

  public void setTotal(int total)
  {
    this.total = total;
    publishPropertyEvent(total);
  }
}
----------------------------------------------------------
import javax.swing.*;
import java.awt.*;

public class Frame1 extends JFrame implements ObserverIF
{
  BorderLayout borderLayout1 = new BorderLayout();
  JPanel jPanel1 = new JPanel();
  JLabel jLabel1 = new JLabel();
  JLabel jLabel2 = new JLabel();

  public Frame1()
  {
    super();

    try
    {
      jbInit();
    }

    catch (Exception e)
    {
      e.printStackTrace();
    }
  }

  private void jbInit() throws Exception
  {
    this.getContentPane().setLayout(borderLayout1);
    this.setSize(new Dimension(400, 210));
    jLabel1.setText("Salg:");
    jLabel2.setText("jLabel2");
    this.getContentPane().add(jPanel1, BorderLayout.CENTER);
    jPanel1.add(jLabel1, null);
    jPanel1.add(jLabel2, null);
  }

  public void notify(int o)
  {
    jLabel2.setText(""+o);
    show();
  }
}
----------------------------------------------------------
Avatar billede arne_v Ekspert
11. december 2002 - 19:08 #1
of i Sales er null.

Der er ikke nogen observer at publicere til !
Avatar billede iceyblue Nybegynder
11. december 2002 - 20:38 #3
Ok, kan du uddybe den lidt?? Evt. forslag til hvad jeg kan gøre???
Avatar billede arne_v Ekspert
11. december 2002 - 20:42 #4
Din Sale class skal have en metode hvor en observer
kan registrere sig og så skal den metode kaldes.
Avatar billede arne_v Ekspert
11. december 2002 - 20:44 #5
F.eks.:

public class Sale
{
  ObserverIF of;
  int total = 4;

  public Sale()
  {
  }

  public void register(ObserverIF o) {
      of = o;
  }

  public void publishPropertyEvent(int total)
  {
    of.notify(total);
  }

  public void setTotal(int total)
  {
    this.total = total;
    publishPropertyEvent(total);
  }
}
Avatar billede arne_v Ekspert
11. december 2002 - 20:46 #6
Jeg ved så ikke helt med den frame.

En meget simpel løsning uden frane var:

import java.io.*;

public class StartApp implements ObserverIF
{
  public static void main(String[]args) throws IOException
  {
    Sale s = new Sale();
    s.register(new StartApp());
    int variabel = 1;

    InputStreamReader tegnLaeser = new InputStreamReader(System.in);
    BufferedReader ind = new BufferedReader(tegnLaeser);

    s.setTotal(variabel = Integer.parseInt(ind.readLine()) );
    System.out.println("Du skrev: "+variabel);
  }
  public void notify(int o)
  {
    System.out.println("notify=" + o);
  }
}
Avatar billede arne_v Ekspert
11. december 2002 - 20:49 #7
Men prøv og læse de 2 links. De indholde nogele
gode eksempler.
Avatar billede iceyblue Nybegynder
11. december 2002 - 20:54 #8
Tak....men er det ikke netop det primære med observer, at eks. en masse frames skal kunne obdatere deres label's når der sker en hændelse?? Jeg prøver lige med det du foreslår. Ideen, ved programmet er sådan set bare, at lave det aller mest simple Observer eksempel (for at kunne forstå princippet i det). Tak for links ;)
Avatar billede arne_v Ekspert
11. december 2002 - 21:02 #9
Ja der er jo ikke meget sjov ved at fortælle main,
hvad main lige selv har sendt.

Det var bare for at gøre det simpelt.

Naturligvis skal du have din Frame åbnet og have
den notifyet.

Men jeg ville ikke rode mig ud i noget GUI,
når jeg kunne illustrere simplere v.h.a.
StartApp.

PS: Hvis du skal notifiet flere frames, så skal
du have mulighed for flere observers f.eks. via
en ArrayList (det er i de eksempler jeg linkede
til - de har også mulighed for at afregistrere
en observer).
Avatar billede iceyblue Nybegynder
11. december 2002 - 21:06 #10
Ok..dvs. at man skal bruge arrayList el. hvis man vil notify'e flere frames??

Jeg forstår ikke helt hvad "s.register(new StartApp());" gør??? register metoden tager da en int eller hva?? ikke i dit tilfælde vel??
Men dit lille eksempel virker ;)
Avatar billede arne_v Ekspert
11. december 2002 - 21:10 #11
Hele ideen er:
  objekt A, B og C skal vide når variable x ændrer sig i objekt X
  A, B og C kalder derfor register i X med sig selv som argument
  X gemmer dem i en ArrayList
  når x så bliver ændret ser X i sin ArrayList hvem der skal notifies

register skal kaldes med et objekt der implementerer ObserverIF !
Avatar billede arne_v Ekspert
11. december 2002 - 21:11 #12
I mit eksempel lod jeg bare main kalde med
et objekt af typen StartApp.

I en mere realitisk scenarie skal register kaldes
med de frames der skal notifies.
Avatar billede iceyblue Nybegynder
11. december 2002 - 21:58 #13
Tak for hjælpen...jeg har fået det til at virke sådan at, hver gang jeg skriver noget i dos-vinduet, så bliver det opdateret på min frame, så må jeg se hvordan jeg kan få flere frames til at virke med ArrayList ;)
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