JavaFX MVVM Prinzip und Binding

SyntaxTalksToMe

Bekanntes Mitglied
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?
 

SyntaxTalksToMe

Bekanntes Mitglied
@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.
 
K

kneitzel

Gast
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?
 

SyntaxTalksToMe

Bekanntes Mitglied
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:

Robat

Top Contributor
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.
 
K

kneitzel

Gast
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!
 

Robat

Top Contributor
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.
 

SyntaxTalksToMe

Bekanntes Mitglied
@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 ;)
 

mihe7

Top Contributor
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:

SyntaxTalksToMe

Bekanntes Mitglied
@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.
 

SyntaxTalksToMe

Bekanntes Mitglied
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?
 
K

kneitzel

Gast
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.
 

mrBrown

Super-Moderator
Mitarbeiter
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.
 

SyntaxTalksToMe

Bekanntes Mitglied
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.?
 

mrBrown

Super-Moderator
Mitarbeiter
MVC kennt keine Bindings (du nutzt MVVM aber kennst kein MVC? o_O das ist ja wohl Pflichtlektüre für jeden Entwickler ;) )
 

SyntaxTalksToMe

Bekanntes Mitglied
Ist das jetzt ein ja? :)

Bin zwar kein blutiger Anfänger aber noch immer Anfänger im programmieren. Hatte bisher nur das mvvm genutzt.. Ich arbeite seit 2 Tagen mit Javafx.
Geht das durch als Entschuldigung? :p
 
K

kneitzel

Gast
Habs mir grad angeschaut. Ist nix anderes als bei mvvm, außer das es keine extra Ebene für die Relays gibt.
Du wirst immer wieder erleben, dass Kleinigkeiten dann große tolle Namen bekommen. Als damals WPF eingeführt wurde, gab es diesbezüglich ein paar Diskussionen mehr in den MSDN Foren....

Generell sehe ich da nicht wirklich große Unterschiede. Du hattest erwähnt, dass Du z.B. die Bindings in dem xml haben willst, damit der Designer darauf zugreifen kann oder so ähnlich. Aber genau das ist doch egal.

Fakt ist doch dass diese Trennung zwischen Designer und Entwickler so in der Form heute gar nicht mehr geht. Die Abhängigkeiten sind hier einfach zu groß. Ich nehme mal die Web Entwicklung als kleines Beispiel:
Bei HTML kann man sehr gut alles an einen Designer geben. Der bekommt ein einmal generiertes statische HTML Dokument, in dem von mir aus alles als reine div Blöcke vorgegeben ist. Und dann kann er ganz frei seine CSS und JS Parts bauen um aus den strukturierten Daten alles aufzubauen, was benötigt wird. Also z.B. Menüs, Tabellen, ...
Aber da kommt schon das Java Script massiv mit rein mit all seinen Problemen. Zeigt also: Das ist kein reiner Designer sondern da muss man auch schon entwickeln.
Aber wie wichtig ist das? Ganz offensichtlich nicht ganz so wichtig, denn davon wurde dann massiv weggegangen:
- Die Single Page Applikationen sind da jetzt groß am kommen. Und zwar in einer Art und Weise, dass da auf Client Seite schon sehr viel abläuft. Daten kommen nur noch über Webservices in die Applikation. Der Server rendert da nichts mehr.
- Und die Entwicklung geht weiter: Schau Dir mal an, was da mit Webassembly kommt. Das ist teilweise fantastisch aber zeigt, das diese Trennung nicht wirklich so wichtig sein kann. Der Designer-Part endet dann doch meist darin, dass nur noch ein css angepasst wird.

Und zurück zu den Bindings: Das ist ja die große Anhängigkeit zu dem Controller (bzw. dem Gegenpart bei MVVM). Der Designer kann nicht frei walten, denn viele Änderungen benötigen Änderungen eben genau dort. Daher würde ich vermuten (Ich habe nie die Situation gehabt, dass es einen Designer gab, der sowas übernommen hätte), dass die Bindings im Code aufzustellen eben doch sinnvoller ist. Denn dann kann der Desiger die Vorgaben entsprechend umsetzen und das Resultat kommt dann zum Entwickler. Und der schaut dann zu, dass er die Bindings erstellt. Anpassungen am Design ohne funktionale Änderungen kann der Designer dann im Nachgang machen

Generell kann man das aber sehen wie man will. Es geht hier um Feinheiten und jeder muss für sich entscheiden, wie er es denn gerne haben möchte.
 

mihe7

Top Contributor
Ich will Java nicht schlecht machen. Aber in diesem Punkt ist es sehr rückständig.
Nicht nur da (wobei das ist nicht immer schlecht sein muss). Und was JavaFX betrifft, bin ich nicht unbedingt dafür bekannt, ein Freund davon zu sein :)

Habs mir grad angeschaut. Ist nix anderes als bei mvvm, außer das es keine extra Ebene für die Relays gibt
Eben. Verschiedene Dinge unterschiedlich zu bezeichnen, ist im Grundsatz auch völlig in Ordnung - so lange es nur darum geht, ein gemeinsames Verständnis über den Namen herzustellen. Die Probleme fangen an, wenn der Name werbewirksam verwendet wird.

Schau Dir mal z. B. JSF an. Es gibt eine XHTML-Datei, in der Du via JSF EL die Properties einer Managed Bean an UI-Komponenten binden kannst. Die Views werden deklarativ in XHTML beschrieben, wobei die entsprechenden Objekte vom Framework instantiiert werden. Kommt Dir ggf. bekannt vor, oder? In JSF ist einfach nur von MVC die Rede. Liegt vermutlich daran, dass es älter als WPF ist.

Wie auch immer, man kann sich ja mal die Frage stellen, was sich besser verkauft: die Millionste Abhandlung über MVC oder das neue MVVM? Das sehe ich ähnlich wie in der Lebensmittelbranche die "verbesserte Rezeptur"; das ist noch nicht mal gelogen, denn es steht ja nicht dabei, für wen sich die Rezeptur verbessert hat :)

Für den nächsten Abschnitt fasse ich mal ein paar Sätze von Dir zusammen:
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.
...
Da kann man auch gleich auf MVVM in Java verzichten, aus oben genannten Gründen.
...
Warum man das nicht im Code machen will? Der Sinn von MVVM ist es, dieses eben nicht zu tun.
Du begründest Dein Ansinnen vordergründig damit, dass der Code sonst nicht einem bestimmten Muster entspricht.

Das ist ein Indiz für das Problem, das ich mit diesen Buzzwords habe: diese führen dazu, dass die Leute nicht mehr nach einer Lösung (z. B. in Form eines Patterns) für ein Problem suchen, sondern sie suchen sich z. B. erst einmal ein Pattern aus und schaffen sich damit das Problem, dem Pattern entsprechen zu müssen/wollen. Gleiches gilt für Architekturen, Sprachen etc.

Es gibt zig Diskussionen im Netz, wo es nur darum geht, ob das jetzt MVC oder MVP ist und ob man MXYZ jetzt richtig angewendet hat oder in irgendeinem Punkt dagegen "verstößt". Dabei ist das doch völlig egal.

Der Designer kann sich dabei zu 100% um das Design kümmern ohne den Code anzutasten.
Das kann der Designer sogar noch besser, wenn in seiner XML-Datei gar keine Bindings vorkommen. Eine 100 %-ige Unabhängigkeit kann es nicht geben.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M mvvm umsetzen ohne fxml AWT, Swing, JavaFX & SWT 0
L JavaFX JavaFX, MVVM und SceneBuilder AWT, Swing, JavaFX & SWT 4
E Prinzip: wie man Ereignisse in einer GUI verarbeit. Frage zum Design? AWT, Swing, JavaFX & SWT 10
K JavaFX - Binding & Co AWT, Swing, JavaFX & SWT 42
S UI Model Binding AWT, Swing, JavaFX & SWT 7
B Java FX In control.TreeCell-Implementierung Binding erzeugen AWT, Swing, JavaFX & SWT 0
I ReadOnly-Property-Binding AWT, Swing, JavaFX & SWT 3
N JavaFX TreeItem: Value-Binding AWT, Swing, JavaFX & SWT 1
G Swing Swing Binding JList funktioniert nicht AWT, Swing, JavaFX & SWT 5
J JavaFX Line Binding AWT, Swing, JavaFX & SWT 8
L JavaFX Horizontale Linie zur Scene binding AWT, Swing, JavaFX & SWT 3
N JavaFX Erste Versuche mit Data-Binding AWT, Swing, JavaFX & SWT 11
G JavaFX Binding von Objekten AWT, Swing, JavaFX & SWT 4
M Eclipse-Platform Combo-Binding für User-Einträge AWT, Swing, JavaFX & SWT 9
Eldorado Swing JGoodies Binding: Bindung lösen AWT, Swing, JavaFX & SWT 3
A SWT Eclipse JFace Binding TreeViewer AWT, Swing, JavaFX & SWT 4
M Swing Data Binding und PropertyChangeSupport AWT, Swing, JavaFX & SWT 6
B SWT Frage zu MVC und Data-Binding AWT, Swing, JavaFX & SWT 8
M Binding einer TextBox an eine Property AWT, Swing, JavaFX & SWT 2
C Binding eines EntityBean als SelectionInList in ComboBox AWT, Swing, JavaFX & SWT 7
M Beans Binding und SWT / Converter AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben