# Listener für Variable



## noch_anfänger (28. Apr 2010)

Hallo zusammen,

ich mache GUI, die mit dem PHP-Server kontaktiert, GUI ist der Client. Der Datenumtausch geht per SOAP. Das ist eigentlich kein Umtausch. GUI soll sich selbst beim Server melden und Request schicken. Der Server gibt Response zurück. GUI zeigt das an. Alles im Einzelnen funktioniert. 
Ich will das ganze mit Model-View-Controller Paradigma machen. GUI ist View, Controller sind (ist) Listener. Model ist evtl. eine Klasse, die Datenumtausch abwickelt.

Nun weiß ich nicht, wie kann man machen, dass Model STÄNDIG nach Änderungen am Server fragt? Und wie kann man eine Variable abhören, mit welchem Listener? Ich denke, dass Model soll Observable und View Observer sein. Aber weiter?


----------



## KrokoDiehl (28. Apr 2010)

Prinzipiell ist es ja so, dass das Modell bei geänderten Daten entsprechende Listener kontaktiert. Welche in deinem Fall sinnvoll sind, kann ich nicht sagen. Ist es eine Tabelle? Eine Liste?
Im einfachsten Fall könnte es ein _PropertyChangeListener _sein. Der löst meist im Setter aus, á la:

```
public void setValue(Object value)
{
    if (this.value.equals(value)) // nix geändert!
        return;    

    Object old = this.value;
    this.value = value;
    
    firePropertyChangeEvent("value", old, this.value);        
}
```
Du kannst jederzeit auch einen eigenen Listener schreiben. Es hängt wirklich stark von dem Datenmodell ab. Zweidimensionale Daten (Tabelle) sind komplexer als eindimensionale (Liste) und die ist komplexer als nulldimensionale... entsprechend eben auch die benötigten Listener.

Wie dein Modell ständig beim Server anfragt, ist da ne andere Sache. Muss er denn ständig nachfragen? In den Fall könntest du auf einen Timer (TimerTask) zurückgreifen, der alle x Sekunden nachfrägt (Java API ist hier dein Freund).


----------



## noch_anfänger (28. Apr 2010)

> Wie dein Modell ständig beim Server anfragt, ist da ne andere Sache. Muss er denn ständig nachfragen?


 Es muss so sein. Danke für TimerTask, ich werde API studieren!



> Ist es eine Tabelle? Eine Liste?


 Es sind einzelne Variablen, die als Antworten auf Requests kommen.

Alle Listener, die ich gesehen habe, lösen in Setter aus. Das ist mein Problem, ich habe keine Setter im Model.


----------



## KrokoDiehl (28. Apr 2010)

Gut, ich weiß nicht, wie genau dein Modell aufgebaut ist. Aber wenn du eine Menge einzelner Daten hast, wäre der sauberste Ansatz für jedes Datum Getter und Setter zu haben, und der Setter löst zB _PropertyChangeEvents _aus (bzw. informiert _PropertyChangeListener_), dass sich der bestimmte Wert geändert hat. Der _PropertyChangeListener _wäre in Java ja schon vorhanden, d.h. da müsstest du keine neuen Klassen/Schnittstellen schreiben. Weiterhin könntest du dir sogar mal die Klasse PropertyChangeSupport anschauen, die da schon das meiste bietet. Es gibt dazu ein nettes Beispiel in Java ist auch eine Insel.

Wenn du bei einer Serveranfrage aber immer alle neuen Daten im Block holst, würde dieses Vorgehen dafür sorgen, dass jede Wertänderung einzeln gemeldet wird. Dies ist in dem Falle etwas unnötigt. Stattdessen kannst du einmal, nachdem alle Werte erneuert wurden, die Listener informieren.

Um meine Vorstellung mal in Pseudocode zu schreiben:

```
void dieseFunktionFragtImmerWiederBeimServerNach()
{
    hole_neue_Daten_vom_Server();
    // Daten übernehmen:
    // Variante A: (Setter)
    setWert1( wert1 ); // könnte PropertyChangeEvent auslösen
    setWert2( wert2); // könnte PropertyChangeEvent auslösen
    ...


    // Variante B: (gesammeltes Event)
    this.wert1 = wert1;
    this.wert2 = wert2;
    ...
    fireIrgendeinEreignis();
}
```


----------



## noch_anfänger (9. Mai 2010)

Frage als ein neues Thema  erstellt.


----------

