Observer

Fiction

Mitglied
Habe folgendes Problem:

Klasse1 hat ein JTextField dessen Feld immer aktualisiert werden muss wenn in Klasse 2 eine Änderung stattfindet.

Klasse2 übergibt an Klasse1 eine Variable X_Pos an JTextField wenn sich X_Pos ändert.

Dieses Problem lässt sich ja mit Observern lösen.
Ich habe noch nie mit Observern gearbeitet.

Wie müssen beide Klassen aussehen?
Mein Ansatz lautet:

Klasse1:

Java:
public class Klasse1 extends JFrame implements Observer {
 
 private JTextField M1_Abs_Pos;
 
    public Klasse1() {
 
     M1_Abs_Pos = new JTextField("");
     add(M1_Abs_Pos);
 
     class OhrenAuf implements Observer{
                 
        public void update(Observable o, Object arg) {
            M1_Abs_Pos.setText((String) arg);
            }
        }
    }   
}


Klasse2

Java:
public class Klasse2 {
 
    public Klasse2() {
 
        class Erzaehler extends Observable {        
            
            public Erzaehler(){
                this.addObserver(new OhrenAuf()); 
                erzaehl(X_Pos);
            } 
            
            public void erzaehl(String info){
                if(countObservers()>0){
                    setChanged();
                    notifyObservers(info);
                }
            }       
            
        }
    }
}

Aber irgendwie bekomme ich das nicht hin.
Wie sage ich in Klasse 2, dass:
this.addObserver(new OhrenAuf()); sich auf Klasse 1 bezieht?

Danke!
 
In Klasse 2 findet eine Änderung statt, auf die Klasse 1 reagieren soll? Was hat das mit X_Pos zu tun? Diese Variable ist ja nirgendwo deklariert/definiert. Beschreibe bitte nochmal genauer, welche Klassen es gibt, welche Änderungen stattfinden und wie (und vor allem in welcher Klasse) darauf reagiert werden soll. Ansonsten würde ich mir wegen Observer (Interface) und Observable (Klasse) auch den Java Insel Link nochmal genauer durchlesen.
 
Hallo,
sorry wenn ich einwenig undeutlich war:

Also:

In Klasse 1 ist eine Grafische Oberfläche definiert mit einem "+" Button und einem JTextField der den String Wert X_POS aus der Klasse 2 darstellt.


In Klasse 2 ist ein int X_POS_int und ein String X_POS definiert.

Wenn ich in Klasse 1 auf den "+" Button drücke, wird X_POS_int in Klasse 2 um den Wert 100 erhöht.
Danach wandle ich diesen Int Wert in einen String Wert um.
Jetzt möchte ich, dass dieser neue String Wert auf dem JTextField aus der Klasse 1 aktualsiert dargestellt wird. D.h. jedesmal, wenn ich auf den "+" Button aus Klasse 1 drücke, soll der neu berechnete X_POS Wert aus Klasse 2 auf dem JTextField der Klasse 1 erscheinen.



Ich habe mich schon eingelesen, werde aber nicht schlau daraus.

Danke, für die aufgewendetet Zeit und Antworten.
 
Vielleicht etwas übertrieben, aber m.M. passender wäre hier ein MVC. Wobei man hier View und Controller in einer Klasse implementieren könnte.

Bei Deinem Ansatz stellt sich die Frage, wo das Observable erzeugt wird? Am besten wäre eine Klasse die sowohl Observer, als auch Observable erzeugt und erstere letzteren zuweist.
 
Vielleicht etwas übertrieben, aber m.M. passender wäre hier ein MVC. Wobei man hier View und Controller in einer Klasse implementieren könnte.

Bei Deinem Ansatz stellt sich die Frage, wo das Observable erzeugt wird? Am besten wäre eine Klasse die sowohl Observer, als auch Observable erzeugt und erstere letzteren zuweist.

View und Controller in einer Klasse?
Dann ist das kein MVC mehr .... Ziel ist es doch genau das zu trennen, damit
du die einzelnen Elemente einfach so austauschen kannst ohne großartige
Anpassungen vorzunehmen.....

Grundsätzlich zum Observer.

Du hast ein Subject....das Subject hat grundsätzlich drei Methoden:

- Observer hinzufügen
- Observer entfernen
- Alle Observer informieren (notifyAll)

Zusätzlich solltest du Setter für die Daten haben, die im Subject
gesetzt sind und diese solltest du auch über die Observer ändern können.

Bsp:

Java:
public class Subject {
    ...
    public void setData(int data) {
        this.data = data;
        notifyAll(data);
    }
    ...
}

Das sorgt dafür, dass wenn ein Observer die Daten ändern muss!!!!
alle anderen Observer auch über die neuen Daten informiert werden.
Dem Observer muss natürlich das Subject bekannt sein.
 
View und Controller in einer Klasse?
Dann ist das kein MVC mehr .... Ziel ist es doch genau das zu trennen, damit
du die einzelnen Elemente einfach so austauschen kannst ohne großartige
Anpassungen vorzunehmen.....
Das wäre m.M. für diesen Fall zu übertrieben. Davon abgesehen sind die Controller i.d.R recht View spezifisch und in der (mir bekannten) Realität oft auch direkt auf die View zu geschnitzt, so dass mit der View auch gleich den Controller austauscht.

Das Problem scheint ja nicht das fehlende Verständnis des Observer Pattern zu sein, es ist ja korrekt implementiert. Das Problem des TO ist es ja den Observer am Observable zu registrieren - was eher auf ein grundlegendes Verständnis der OOP hindeutet.
 
Hmmm.... könnte sein, ich weiß leider nicht genau wo dein (@Fiction) Problem liegt.

Dein Button "+" (also der listener) wäre auf das Observer-Pattern bezogen deine update-Methode,
das heißt in ihr musst du die veränderten Daten neu setzen.

Deine Klasse2 ist also der Observer, in dem der Wert von x-pos wie du sagtest
um 100 erhöht wird. Diese Klasse2 muss also im Observerable registriert sein.

- Deine Klasse1 erbt also von Observerable
- Deine Observer müssen mit der Methode: addObserver(Observer o) regestriert werden.
Hierfür muss deine Klasse2 natürlich die Klasse1 kennen (Komposition in UML-Sprache)
damit du Klasse1.addObserver(Observer o) aufrufen kannst.
- Wenn sich nun was verendert musst du in der Klasse1 (Mit deinem Listener für den Button +)
die Methode notifyObservers() aufrufen.

Bin ich so in der richtigen Richtung oder brauchst du was anderes?
 

Zurück
Oben