Programmeinstellungen für Anwendung??

Bitte aktiviere JavaScript!
Methoden zur Verarbeitung von Werten kommen weiterhin in das Modell!
Der View ruft Methoden aus dem ViewModel auf, wenn Aktionen auftreten wie Button gedrückt. Das ViewModel entscheidet was passieren soll, wenn die Methode aufgerufen wurde. Beispielsweise führst du im ViewModel eine Validierung durch, setzt eine Fehlerproperty, die dafür sorgt, dass im View der Fehler sichtbar wird oder rufst letztlich eine Methode aus dem Modell auf.
Das Serialisieren der Werte wird dann nur mit dem Modell durchgeführt, also dort implements Serializable?
Ja
Habe dann mal unter ViewModel im Netz nachgesehen und da tauchte dann das Konzept des MVVM auf
Ja, es handelt sich im groben um das Konzept. Da ich nicht alle Nuancen kenne und damit sicher nicht einhalte bezeichne ich mein Beispiel aber nicht als MVVM Beispiel.
Wie du die Klassen zusammenpackst ist Geschmackssache. Kommt auch drauf an, ob du ein Master-Detail UI hast, ein Form auslagerst, welches du in View, Update und Edit einbindest oder nur über Button navigierst und jedes mal ein neues Fenster öffnest. Für sowas kleines reicht vermutlich die Struktur
in src
proj.Application.java
proj.model.Einstellungen.java
proj.ui.einstellungen.EinstellungenView.java
proj.ui.einstellungen.EinstellungenViewModel.java
und in resources
proj.ui.einstellungen.EinstellungenView.fxml
proj.ui.einstellungen.style.css
 
A

Anzeige


Vielleicht hilft dir dieser Kurs hier weiter: (hier klicken)
Das minimale Beispiel mit der Serveradresse habe ich jetzt mal in mein Projekt mit Dateien übertragen.
Es funktioniert zwar soweit, aber die Abwicklung hat sich mir noch nicht so ganz erschlossen.
Ich Dokumentiere zwar sehr viel, das ist aber erstmal ein Hilfmittel für mich um es besser zu verstehen.

Auszug der Klasse Einstellungen (Java-Standardlib)
Java:
private String pfadQuelle;
private String pfadZiel;

// Methode für das einsetzen von Standard Werten
    public static Einstellungen standardWerte() {
        String heimVerzeichnis = System.getProperty("user.home");
        // return new Einstellungen().schreibePfadQuelle(homeVerzeichnis+"\\Dateien\\01 Quelle");
        Einstellungen standardWerte = new Einstellungen();
        standardWerte.schreibePfadQuelle(heimVerzeichnis+"\\Dateien\\01 Quelle");
        standardWerte.schreibePfadZiel(heimVerzeichnis+"\\Dateien\\02 Ziel");    
        return standardWerte;
    } // Methode für das einsetzen von Standard Werten

public String holePfadQuelle() {
        return pfadQuelle;
    }
   
    public Einstellungen schreibePfadQuelle(final String quellVerzeichnis) {
        pfadQuelle = quellVerzeichnis;
        return this;
    }
   
    public String holePfadZiel() {
        return pfadZiel;
    }

    public void schreibePfadZiel(String zielVerzeichnis) {
        pfadQuelle = zielVerzeichnis;
    }
Jedoch habe ich Schwierigkeiten zu verstehen warum bei der schreibePfadQuelle der Datentp Einstellungen gewählt wurde?
Es wird doch nur den Pfad der einen String enthält zurück gegeben!
Normalerweise definiere ich so wie bei schreibePfadZiel eine Methode die nichts zurückgibt mit "void" bei einer Set-Methode?

Auszug der Klasse EinstellungenFM (ViewModell)
Java:
private final StringProperty pfadQuelle = new SimpleStringProperty();
private final StringProperty pfadZiel = new SimpleStringProperty();

// Erstellt das Einstellungen Fenster Modell
    public EinstellungenFM(Einstellungen einstellungen){
        pfadQuelle.set(einstellungen.holePfadQuelle());
        pfadZiel.set(einstellungen.holePfadZiel());
    }

public String holePfadQuelle() {
        return pfadQuelle.get();
    }
   
    public StringProperty pfadQuelleProperty() {
        return pfadQuelle;
    }
   
    public void schreibePfadQuelle(final String pfadQuelle) {
        this.pfadQuelle.set(pfadQuelle);
    }
   
    public StringProperty holePfadZiel() {
        return pfadZiel;
    }
    public StringProperty pfadZielProperty() {
        return pfadZiel;
    }

    public void schreibePfadZiel(String zielVerzeichnis) {
        pfadQuelle.set(zielVerzeichnis);
    }
Bei EinstellungenFM wird ein Kosntruktor aufgerufen der einen Parameter einstellungen enthält.
Ich denke mal hier wird ein Objekt Erzeugtder aus dem Bauplan von Einstellungen der Standardlib erzeugt wird und direkt Werte zugewiesen bekommt. Zu diesem Zeitpunkt ist mir nicht bekannt, ob sich bereit Werte darin enthalten? Ich denke nicht, da die Methode standardWerte() noch nicht aufgerufen wurde?
Ich verstehe aber schon das im ViewModell alles enthalten sein soll was für den Fensteraufbau und deren verhalten notwendig ist.

Auszug der Klasse EinstellungenFK (ViewController)
Java:
@FXML
private Label lblQuellverzeichnis;
@FXML
private Label lblZielverzeichnis;

private EinstellungenFM fensterModell;

// Konstruktor um das Fenstermodell zu erzeugen
    public EinstellungenFK() {
        // Laedt die Standardwerte aus dem Modell
        Einstellungen einstellungen = Einstellungen.standardWerte();
        // Erstellt das Modell des Fenstermodells
        this.fensterModell = new EinstellungenFM(einstellungen);
    } // Konstruktor um das Fenstermodell zu erzeugen

public void initialize(URL url, ResourceBundle rb) {
        LOG.info("Einstellungen werden initialisiert");
        lblQuellverzeichnis.textProperty().bind(fensterModell.pfadQuelleProperty());
    } // initialize

@FXML
    private void sucheQuellverzeichnis(ActionEvent event) {
        LOG.info("sucheQuellverzeichnis wurde aufgerufen");
        String verzeichnis = Datei.auswahlVerzeichnis("Wähle das Quellverzeichnis");
        fensterModell.schreibePfadQuelle(verzeichnis);
        lblQuellverzeichnis.textProperty().bind(fensterModell.pfadQuelleProperty());
        LOG.info("Selektiertes Quellverzeichnis " + fensterModell.holePfadQuelle());
    } // sucheQuellverzeichnis

    @FXML
    private void sucheZielverzeichnis(ActionEvent event) {
        LOG.info("sucheZiellverzeichnis wurde aufgerufen");
        String verzeichnis = Datei.auswahlVerzeichnis("Wähle das Zielverzeichnis");
        fensterModell.schreibePfadZiel(verzeichnis);
        lblZielverzeichnis.textProperty().bind(fensterModell.pfadZielProperty());
        LOG.info("Selektiertes Zielverzeichnis " + fensterModell.pfadZielProperty());
    } // sucheZielverzeichnis
Der Fenster Kontroller soll also nur die Daten vom Modell zum Fenster verbinden.
Also wird EinstellungenFM mit der variable fensterModell definiert, welche dann im Konstruktor irgendwie gefüllt werden?
Der Konstruktor so wie er da ist verstehe ich nicht so ganz. Ich weiß das dort durch die Methode die Pfade gesetzt werden.
Es wird ein Objekt einstellungen erzeugt und dort die die Werte übergeben.
Aber einstellungen wird doch nach dem Bauplan erzeugt. Wird in diesem Objekt tatsächlich Quellverzeichnis und Zielverzeichnis in den entsprechenden Platzhalter erzeugt und übergeben so wie es in der Vorgabe definiert wurde?

Wenn ich mein Programm mit beiden Daten (Quellverzeichnis und Zielverzeichnis) ausführe dann erhalte ich im Textfeld des Fensters nur den letzten also Zielverzeichnis.
Im label Quellverzeichnis wird der Pfad des Zielverzeichnisses angezeigt und im label Zielverzeichnis nichts.
 
Jedoch habe ich Schwierigkeiten zu verstehen warum bei der schreibePfadQuelle der Datentp Einstellungen gewählt wurde?
Es wird doch nur den Pfad der einen String enthält zurück gegeben!
Normalerweise definiere ich so wie bei schreibePfadZiel eine Methode die nichts zurückgibt mit "void" bei einer Set-Methode?
Ich habe hier bloß "fluent-Setter" benutzt (z.B. hier erklärt).
Zu diesem Zeitpunkt ist mir nicht bekannt, ob sich bereit Werte darin enthalten? Ich denke nicht, da die Methode standardWerte() noch nicht aufgerufen wurde?
Du gibst doch in den Konstruktor des ViewModels ein Einstellungs-Objekt rein, welches im Kontroller erzeugt wurde:
public EinstellungenFK() { // Laedt die Standardwerte aus dem Modell Einstellungen einstellungen = Einstellungen.standardWerte(); // Erstellt das Modell des Fenstermodells this.fensterModell = new EinstellungenFM(einstellungen); } // Konstruktor um das Fenstermodell zu erzeugen
standardWerte wurde zu dem Zeitpunkt aufgerufen, und das Einstellungs-Objekt auf die Werte gesetzt, die in standardWerte gesetzt werden. Das natürlich nur für dieses minimale Beispiel. Später liest du die Einstellungen aus einer Datei oder Properties (java.util).
Aber einstellungen wird doch nach dem Bauplan erzeugt. Wird in diesem Objekt tatsächlich Quellverzeichnis und Zielverzeichnis in den entsprechenden Platzhalter erzeugt und übergeben so wie es in der Vorgabe definiert wurde?
Auch hier: Es wird das gesetzt, was in standardWerte definiert ist.

Wenn ich mein Programm mit beiden Daten (Quellverzeichnis und Zielverzeichnis) ausführe dann erhalte ich im Textfeld des Fensters nur den letzten also Zielverzeichnis.
Du hast im Konstruktor nur eins von zwei Textfeldern gebunden und bindest in den Action-Handlern erneut Properties.
Die Bindings erledigst du ausschließlich im Konstruktor.
In den Action-Handlern setzt du die neuen Verzeichnispfade im ViewModel über die Setter ( schreibePfadZiel usw. ) und der View aktualisiert sich aufgrund der Bindings selbstständig.
 
Ich hab es mir jetzt noch mal angeschaut und bin ein bisschen durcheinander.
Vielleicht hat jemand Zeit in form einer Nachhilfestunde mir das an meinem Code über Teamviever zu erklären.
Ich bin auch gerne bereit die Stunde zu bezahlen, bitte einfach eine PN senden.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben