JavaFX MVVM Prinzip und Binding

Bitte aktiviere JavaScript!
Hallo,

ich bin neu hier im Forum und habe als Einstand natürlich gleich eine Frage :)

Ich komme eigentlich aus der WPF Ecke. Vor kurzen habe ich mit JavaFX begonnen und habe nun ein paar Fragen zum Thema Binding.
In WPF kann man beispielsweise einen Button an eine Property einer Klasse binden oder eben an einen bestimmten Wert, solange dieser einen getter und setter haben.

Jetzt meine Frage: Gibt es sowas in JavaFX auch? Ich habe zwar einiges zum Thema MVVM gefunden, allerdings werden dort die Bindings im Code gemacht, was meiner MEinung nach konträr zum System zu MVVM steht.

Ich würde gerne z.b. es so machen

Code:
View

 <Label text="{Klasse.irgendeinString}"/>



Klasse

Stringproperty irgendeinString

Natürlich habe ich auch gegoogelt. Allerdings findet man eben zu diesem Thema, ins besondere zu diesem Weg nur extrem wenig.

Kann mir da wer helfen?
 
A

Anzeige




Vielleicht hilft dir unser Kurs hier weiter —> (hier klicken)
@mihe7

Ja, so in dem Beispiel. Nur das es nach dem Beispiel irgendwie nicht funktioniert :) Meine Frage ist auch, warum man zu dem Thema so wenig findet?

@Ja, das hatte ich auch gefunden. Der FXML Code kommt da aber praktisch vor, bzw wie man in diesem Bindings erstellt.
 
Kannst Du Deinen Code einmal zeigen? Dann können wir schauen, wieso es nicht funktioniert. Evtl. kannst Du ja ein kleines, kompilierbares Beispiel erstellen und uns zeigen?
 
Mein Code entspricht in etwa dem was ich oben gepostet habe.

Ich würde gerne erfahren, wie ich es hinbekomme, angenommen in meinem ViewModel weise ich einem String einen Text zu. Ich will das dieser Text, in einem Button im View angezeigt wird.

Ein ganz großer Bonus wäre es, wenn du mir sagen könntest, ob man eine Liste von Klassen in einer Observable Collection, die Propertys der KLassen, in einem Binding anzeigen lassen kann. Was bei WPF einem ItemControl entspricht. Sorry, dass ich da mit Beispielen von WPF komme. Aber dort habe ich angefangen und mein gesammtes Wissen basiert auf Visual Studio bzw WPF.

Und da interessiert mich ins besondere, der FXML Code. Dieses *.bind Geschichte brauch ich nicht. Da kann man auch gleich auf MVVM in Java verzichten, aus oben genannten Gründen.
 
Zuletzt bearbeitet:
Ich kann zwar nicht nachvollziehen, warum man das ganze nicht im Java Code machen will - trotzdem hier mal ein Beispiel:
XML:
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.GridPane?>

<GridPane xmlns:fx="http://javafx.com/fxml"
          fx:controller="fxmlbinding.RootController"
          prefHeight="400.0" prefWidth="600.0">

    <Label id="counterLabel" text="${controller.counter}"/>
    <Button translateX="50" text="${controller.increaseButtonText}"
            onAction="#onIncreaseButtonClicked"/>
</GridPane>
Java:
public class RootController  {

    private IntegerProperty counter;
    private StringProperty increaseButtonText;

    public RootController() {
        this.counter = new SimpleIntegerProperty(0);
        this.increaseButtonText = new SimpleStringProperty("Increase to 1");
        this.increaseButtonText.bind(Bindings.createStringBinding(() -> String.format("Increase to %d", counter.get() + 1), counter));
    }

    @FXML
    public void onIncreaseButtonClicked() {
        counter.set(counter.get()+1);
    }

    public IntegerProperty counterProperty() {
        return counter;
    }

    public int getCounter() {
        return counter.get();
    }

    public void setCounter( int counter ) {
        this.counter.set(counter);
    }

    public StringProperty increaseButtonTextProperty() {
        return increaseButtonText;
    }

    public String getIncreaseButtonText() {
        return increaseButtonText.get();
    }

    public void setIncreaseButtonText( String increaseButtonText ) {
        this.increaseButtonText.set(increaseButtonText);
    }
}
Java:
public class Main extends Application {
    @Override
    public void start( Stage primaryStage ) throws Exception {
        GridPane root = FXMLLoader.load(Main.class.getResource("root.fxml"));

        primaryStage.setScene(new Scene(root, 900, 800));
        primaryStage.show();
    }
}
Edit:
Vielleicht ist ja mvvmFX was für dich.
 
Also das oben ist ja kein wirklicher Code. Es geht darum, dass man etwas hat, was man direkt übersetzen kann bzw. anpassen um es dann selbst einmal zu testen ehe man es postet.

Aber wenn das oben dein Code war in der fxml, dann fehlt da schon einmal das $:
Code:
 <Label text="${Klasse.irgendeinString}"/>
Und in der Klasse musst Du dann haben:
Java:
public StringProperty irgendeinStringProperty() {
    return yourStringPropertyVariable;
}
Das ist das, was in der verlinkten SO Diskussion so klar benannt wurde.

Wichtig ist halt, dass du im fxml auf irgendeinString verweist aber in der Klasse halt die irgendeinStringProperty Funktion ist!
 
Wichtig ist halt, dass du im fxml auf irgendeinString verweist aber in der Klasse halt die irgendeinStringProperty Funktion ist!
Das ist zwar auch wichtig, aber auch Setter und Getter müssen vorhanden sein - sonst funktioniert es nicht. Wenn man sich den Source Code von dem FXMLLoader bzw der BeanAdapter Klasse anschaut, stößt man auf Konstanten wie
Java:
public static final String GET_PREFIX = "get";
public static final String IS_PREFIX = "is";
public static final String SET_PREFIX = "set";
public static final String PROPERTY_SUFFIX = "Property";
Außerdem werden im Code die angesprochenen Methoden in eine Map geladen. Müssen also wohl irgendwo relevant sein :p

Wieso hast Du das durchgestrichen?
Weil auch die das über Java Code handeln (wenn ich es richtig überflogen habe) .. und das möchte er ja anscheinend nicht.
 
@Robat

Warum man das nicht im Code machen will? Der Sinn von MVVM ist es, dieses eben nicht zu tun. Design und ViewModel sind strickt getrennt.
GUI Änderungen lassen sich problemlos umsetzen, OHNE etwas im Code ändern zu müssen. Man muss lediglich das Binding ändern.

Aber danke für die zahlreichen Posts. Ich guck es mir heute Abend noch mal an ;)
 
Der Sinn von MVVM ist es, dieses eben nicht zu tun. Design und ViewModel sind strickt getrennt.
Die Erweiterung von MVVM gegenüber Presentation Model besteht IMO nur darin, dass hier ein bidirektionales Binding gefordert wird. Natürlich abgesehen davon, dass man mal wieder eine coole Abkürzung eingeführt hat ;) Dass es Frameworks gibt, die das automatisch übernehmen, ist schön aber doch kein Muss: dann stünde die schöne Abkürzung nur für die Produkteigenschaft eines Frameworks.

Apropos Produkteigenschaft: da ist es doch viel besser, wenn man der Entwicklergemeinde ein neues Buzzword hinwerfen kann. Alle paar Jahre erklären irgendwelche Firmen/Leute das neue Mantra der Softwareentwicklung (mal Technologie, mal Architektur, Paradigma, Methode,...) und es ist natürlich reiner Zufall, dass diejenigen damit auch noch Geld verdienen. Denn natürlich braucht man dafür die entsprechenden Tools oder Berater oder Bücher oder...
 
Zuletzt bearbeitet:
@mihe7

Das mag bestimmt auf viele Dinge zutreffen. Aber in dem Fall dieses Buzzwords Mvvm trifft das Buch zu. Es gibt Software Designer und Coder. Der Designer kann sich dabei zu 100% um das Design kümmern ohne den Code anzutasten.

Ich will Java nicht schlecht machen. Aber in diesem Punkt ist es sehr rückständig. Arbeite einmal mit wpf und du weißt was ich meine.
Aber darum geht es ja nicht. Wollte nur wissen wie das in Java funzt und keinen Glaubenskrieg anzetteln.

Jede Sprache hat ihre Vor und Nachteile.

Und ich persönlich halte mvvm nur in größeren Projekten sinnvoll. Da ist jedenfalls sauberer und strukturierter.
 
Mvvm - model view viewmodel.

Das beschreibt die Struktur. Einen Zusammenhang zu wpf sehe ich da nicht, wenn gleich wpf eher dafür ausgelegt ist.

Aber wenn dem so ist, wie heißt es dann bei Java?
 
Microsoft hat mit WPF damals eben das MVVM mit vorgestellt. Vor WPF hat davon niemand gesprochen. So habe ich es zumindest in Erinnerung.

Davor war eigentlich immer von MVC die Rede. Und das ist derzeit auch oft das, was weiter eingesetzt wird. Aber Java ist halt nicht unbedingt die erste Wahl, wenn es um Client GUIs geht. Da sind native Lösungen stärker und besser.

Die Stärke von Java liegt halt mehr auf der Serverseite.
 
Die englische Wikipedia fasst das ganz gut zusammen: "MVVM was designed to make use of data binding functions in WPF"


MVVM wurde zB mit dieser Überschrift vorgestellt: "Introduction to Model/View/ViewModel pattern for building WPF apps", von John Gossman, der einer der Verantwortlichen für WPF war/ist.
 
Aha. Das heißt bei mcv binde ich über den Code die das view an das model. Und kann dort bestimmen was z. B bidirectional ist und so zu gen den Controller bildet.?
 
MVC kennt keine Bindings (du nutzt MVVM aber kennst kein MVC? o_O das ist ja wohl Pflichtlektüre für jeden Entwickler ;) )
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben