MVC Observer While-Schleife

Ratzefummel

Mitglied
Halli Hallo,

zur Zeit versuche ich in JavaFX einen Observer über zwei Klassen zu implementieren. Ich habe ein Model, einen Controller und eine View.

Im Model gibt es eine Methode, welche über eine While-Schleife eine Varible immer wieder erhöht.
In der View möchte ich diese nach jedem Durchgang der Schleife in einem Label angezeigt bekommen.
Der Controller soll dies letztendlich übernehemen in dem er dem Label die geänderte Variable aus dem Model zuweist. Für jeden Durchgang der Schleife natürlich.

Geplant war von mir das Observer-Muster zu nutzen nur denke ich, dass ich es nicht richtig eingebaut habe. Zur Zeit wird mir das Label erst nachdem die While Schleife komplett durchgelaufen ist angezeigt bzw. aktualisiert und auch nur der letzte berechnete Wert der Variable.

Ist es vielleicht ein generelles Problem, wenn man jeden Wert, den eine Schleife bei jedem Durchlauf berechnet zu überschreiben und dann wieder anzeigen zu lassen?

Hier ein paar Code-Schnippsel:

Model:
Code:
public class Raum extends Observable{

String sensorwert = "0.0";
    
     public String getsensorwert(){
         return sensorwert;
     }

public void temperaturverlauf() {

while(zeit < 20){
//Viele Berechnungen

sensorwert = String.valueOf(raumTemp[Array.getLength(raumTemp)-1][Array.getLength(raumTemp[0])-1][1]);
                      
                setChanged();
                notifyObservers();


zeit++;
}
}

Controller(unwichtiges ausgelassen):
Code:
public class FXMLDocumentController  implements Initializable, Observer {

Raum r1 = new Raum();

@FXML
     private Label aktuelleTemperatur;

@Override
    public void initialize(URL url, ResourceBundle rb) {

@Override
    public void update(Observable o, Object arg) {
       aktuelleTemperatur.setText(r1.getsensorwert());
    }


}

Im Moment läuft es soweit, dass wenn ich das Programm starte und die Schleife alle durchläufe durchlaufen hat zeigt er mir nichts an. Beim zweiten Start zeigt er mir nachdem alles durchlaufen ist lediglich den letzten berechneten Wert an.

Ziel ist es, dass das label permanent auf den neuesten Stand aktualisiert wird.

Ich hoffe mir kann jemand helfen.

Vielen Dank!
 
Hast du es mal mit Bindings probiert. Dein "sensorwert" wäre dann ein StringProperty und könnte an das textProperty des Labels gebunden werden.

Das ganze würde ich so realisieren, dass du eine Methode im Model hast:
Java:
public StringProperty sensorwertProperty() {
    return sensorwert;
}
Hier ist es Konvention das du den Namen der Variable schreibst und dahinter ein Property hängst. Ich glaube final ist auch gewünscht. Du kannst auch ein ReadOnlyStringProperty verwenden, wenn du nicht willst das noch etwas nachträglich von außen verändert wird.

Und im Controller kannst du dann mithilfe des Bindings, sowas anstellen:
Java:
aktuelleTemperatur.textProperty.bind(model.sensorwertProperty);

Oder so ähnlich, musst mal gucken wie genau die Properties heißen.
 
Hey,

danke für deine Antwort.
Also mit Bindings habe ich es auch bereits probiert. Da besteht leider das selbe Problem. Ich denke, dass es mit der While Schleife zu tun haben muss und das dadurch die ständige Verbindung zum Label unterbrochen wird. Den Observer habe ich getestet und er funktioniert auch soweit.
 

Zurück
Oben