Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Java » [Verständnisproblem] Events

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
28.11.2004, 00:40 Uhr
DerSchwarzeSchlumpf



hi (:

ich progge gerade mein 1. java programm mit events und hab da scheinbar ein "kleines" verständnisproblem. also, das grundprinzip von observer/observable ist mir ja eigentlich klar... . ABER! es gibt ein großes problem*g*

der sinn ist, dass ich eine "wörte-zähler"-funktion in ein programm implimentieren muss. wenn ich jetzt nach der reihe über die comand-line eingebe "star wars" "the return of star wars" soll er ausgeben:
star: 2
wars: 2
the: 1
of: 1

von der idee her:
ich hab ein objekt "wordindex" das das wort als string und die anzahl speichert. hab die nötigen methoden auch schon (set/get/word/count/decrease/proofIfExisting usw). es soll auch möglich sein, einzelne sätze wieder zu löschen (die gespeicherten löscht er mir schon nur jetzt muss er über einen event auch noch die einzelnn wörter runterzählen was ja eigentlich gleich wie das raufzählen funktioniern sollte). und ja es ist egal wenn jetzt bei einem wort 0 drinsteht und das noch in der liste ist (:

das problem ist aber, dass ich das wie erwähnt jetzt über events machen muss.

ich hab einen "WordIndexChangeEvent" gemacht. der schaut so aus:

C++:
class WordsIndexChangeEvent
{
  //die 2 möglichkeiten die passiern können
  public static final int ADD = 0;
  public static final int DELETE = 1;

  //was passiert ist und das argument
  private int type_;
  private String arg_;

  //Constructor, Get/Set Methoden udgl.
};



Die Wörter speicher ich in diesem Objekt:

C++:
class WordsIndex
{
   private String word_;
   private int count_;

  //Methoden
};



dann hab ich noch den Wrapper angelegt der die einzelnen WordsIndex in einer ArrayList speichert und darauf zugreifen kann

C++:
class WordsIndexWrapper extends Observable
{
  private ArrayList words_;

  public WordsIndexWrapper()
  {
    words_ = new ArrayList();
  }

  public void output();
  public boolean isWordExisting(String word);
  public void addNewWord(String word);
  public void addCount(String word);  
  public int getCount(String word);
};



und dann das was er tun soll wenn es passiert

C++:
class WordsIndexModul implements Observer
{
  
  public void update(Observable observable, Object arg)
  {
     WordsIndexWrapper words_index = (WordsIndexWrapper) observable;
        
    WordsIndexChangeEvent event = (WordsIndexChangeEvent) arg;
  
    switch(event.getType())
    {
     case WordsIndexChangeEvent.ADD:
     {
       String word = (String) event.getArg();
       boolean still_existing = words_index.isWordExisting(word);
      
       if(still_existing == true)
       {
         words_index.addCount(word);
       }
       else
       {
         words_index.addNewWord(word);
       }
      break;
      }
     case WordsIndexChangeEvent.DELETE:
     {
       String word = (String) event.getArg();
      
       words_index.removeCount(word);
       break;
     }
      
    default:
      break;      
    }
  }
}



vom Verständnis her: ich generiere das change-event.DELETE wenn ich etwas lösche und das .ADD wenn ich eine linie hinzufüge - klar. aber ich hab jetzt stundenlang rumprobiert und er stürzt mir jedesmal ab wenn ich bei update() den 1. Cast auf WordsIndexWrapper mache.

Ich glaub ich hab nicht wirklich verstanden, wer jetzt wen überwacht. Der Wrapper überwacht das Input-Modul, oder? Und wenn ich einen Input mache generier ich dort das Event, mach notify(event) und es springt ins update rein, oder? Aber wie binde ich dann das WordsIndexModul (wo die einzelnen WordIndex-Objekte gespeichert sind) da ein? Das müsste ich doch als Argument übergeben, aber wie?

Hat jemand eine Hilfe? Wär echt super... (:

lg chris

EDIT: was mir gerade eingefallen ist: klar, als string-argument wird her die komplette eingabe übergeben, wo ich noch in einer for-schleife die einzelnen tokens rausfiltern muss, aber das ist nicht das problem (:

Dieser Post wurde am 28.11.2004 um 00:45 Uhr von DerSchwarzeSchlumpf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.11.2004, 15:06 Uhr
Spacelord
Hoffnungsloser Fall


Wie sieht den der Code aus wo du notifyObservers(WICEventinstanz) aufrufst?

Und irgendwie finde ich es designmässig unschön dass deine Observerklasse den Zustand der beobachteten Klasse ändert.Ich denke das Zählen der Wörter sollte eher eine Eigenschaft des Beobachters sein.
Der Sinn der ganzen Geschichte ist ja dass diverse Beobachter auf 1 Ereigniss unterschiedlich reagieren können.Du machst die "Reaktion" aber zu einer Eigenschaft des Eventsenders.
Dein zu beobachtendes Objekt meldet all seinen Beobachtern "Hallo,hier ist was passiert"(in diesem Falle wurde ein Wort eingegeben).Daraufhin reagieren alle Beobachter auf Ihre Art und Weise auf dieses Ereigniss.In diesem Falle sollte,zumindest meiner Meinung nach,das Beobachterobjekt seine "Wörterzählliste" aktualisieren.Ein anderer Beobachter könnte auf das gleiche Ereignis ja eventuell dadurch reagieren dass er das neu eingegebene Wort rückwärts ausgibt oder was auch immer.
Ich finde es unlogisch ein Event abzusetzen dass eine fremde Klasse veranlasst die Methoden der Klasse aufzurufen die das Event verschickt hat .

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
28.11.2004, 16:41 Uhr
DerSchwarzeSchlumpf




Zitat von Spacelord:
Wie sieht den der Code aus wo du notifyObservers(WICEventinstanz) aufrufst?

Und irgendwie finde ich es designmässig unschön dass deine Observerklasse den Zustand der beobachteten Klasse ändert.Ich denke das Zählen der Wörter sollte eher eine Eigenschaft des Beobachters sein.
Der Sinn der ganzen Geschichte ist ja dass diverse Beobachter auf 1 Ereigniss unterschiedlich reagieren können.Du machst die "Reaktion" aber zu einer Eigenschaft des Eventsenders.
Dein zu beobachtendes Objekt meldet all seinen Beobachtern "Hallo,hier ist was passiert"(in diesem Falle wurde ein Wort eingegeben).Daraufhin reagieren alle Beobachter auf Ihre Art und Weise auf dieses Ereigniss.In diesem Falle sollte,zumindest meiner Meinung nach,das Beobachterobjekt seine "Wörterzählliste" aktualisieren.Ein anderer Beobachter könnte auf das gleiche Ereignis ja eventuell dadurch reagieren dass er das neu eingegebene Wort rückwärts ausgibt oder was auch immer.
Ich finde es unlogisch ein Event abzusetzen dass eine fremde Klasse veranlasst die Methoden der Klasse aufzurufen die das Event verschickt hat .

MfG Spacelord



hi

jooooooooooooooooooo genau das was du beschrieben hast will ich haben *gg* nur weiß ich jezt nicht wie ich das hinbekomm... . So wie ich das sehe ist mein "WordsIndexWrapper" der eigentliche Observer der sich anpassen muss. Dafür bräuchte er ja die update()-Function, oder? Aber die hab ich ja im WordsIndexModul das als Parameter den "Wrapper und das Event" nehmen sollte... . Aber das funktioniert irgendwie nicht... .

der code schaut da so aus:


C++:
public void parse()
{
  //linie als string einlesen die seperat weiterbehandelt wird
    
WordsIndexChangeEvent event = new WordsIndexChangeEvent WordsIndexChangeEvent.ADD, tmp_string);

        setChanged();        
        notifyObservers(event);  
}


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
28.11.2004, 17:28 Uhr
Spacelord
Hoffnungsloser Fall


Also ich würde die "Eingabe" als Eventquelle nehmen und aus deiner WordsIndexWrapper Klasse den Beobachter machen.
Irgendwoher musst du ja die Strings haben deren Wörter gezählt werden sollen.
Dies würde ich in ne Klasse Input oder so packen.
Dann könntest du ja auch unterschiedliche Arten der Eingabe erfassen(Tastatur,Datei,Aufrufparameter aus main an nen Ctor übergeben oder was auch immer) und sobald neue Wörter vorliegen das Event an die Beobachter senden und den neuen String als Argument übergeben.Dann könnte die WordsIndexWrapper Klasse,in seiner Funktion als Observer, reagieren und seine Wörterzählliste aktualisieren.
Ist jetzt aber nur so ne Idee auf die schnelle....

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
06.12.2004, 09:13 Uhr
~DerSchwarzeSchlumpf
Gast


hi

danke für die hilfe, habs hinbekommen (:

@spacelord

jo, habs genau so gemacht *gg*

schöne woche noch
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Java ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: