Programmieren 2 07 JavaFX-Properties und Data-Binding Bachelor Medieninformatik Sommersemester 2015 Dipl.-Inform. Ilse Schmiedecke schmiedecke@beuth-hochschule.de 1
Letztes Mal haben wir Entwickler synchronisiert... (c) https://www.atlassian.com/git/tutorials/ 2
... jetzt geht es um Daten In JavaFX gibt es fertige "Funk-Datentypen" diese Datentypen können kommunizieren 3
Die "magische" Adressen-Tabelle Internetfund bei etlichen Teilnehmern kann alles: editieren, sortieren, suchen... und alle Änderungen werden gespeichert! Magie! 4 4
Key ändern in der TreeView ohne Magie! Einträge über ein Editfeld editierbar: Beim 2. Klick in ein Feld ein Editfenster öffnen Bei Enter Wert in die TreeView übernehmen Feld verbergen ggf. Details an veränderten Key anpassen 5 5
Aktualisieren der TreeView über EventHandler Achtung, direktes Editieren ist kritisch 6 6
Änderung in die TreeView übernehmen 7 7
... und alles nur in der GUI Die geänderten Werte werden nicht zurückgeschrieben ins Adressbuch! Das könnte man noch an das handleeditcommit anfügen Dann wäre auch der zweite Eintrag aktualisiert... ABER: Eintrag könnte verweigert werden, weil der Key nicht eindeutig ist. Und dann? Professionell geht man einen anderen Weg: Das MVC-Konzept 8 8
Veränderungen ins Adressbuch übernehmen direkte Umsetzung: Bei Ende des Editierens alten Eintrag im AddressBook finden und durch neuen ersetzen. Ziemlich aufwändig: Habe ich noch den alten Key zum Suchen? Ziemlich abenteuerlich Datenkonsistenzen!! MVC: Immer erst das AddressBook aktualisieren und dann die TreeView neu aufbauen Konzept Model-View-Control später mehr 9 9
Observer - Listener Zusammenhänge über Listener realisiert: Bestimmte Objekte können Events auslösen Andere Objekte können sich mit einem Listener bei dem Objekt für bestimmte Events registrieren (Abo) Tritt das Event auf, wird die entsprechende Methode des Listeners gerufen: Wenn Textfeld sich geändert hat, rufe die registrierte Methode (z.b. um die TreeView zu ändern) editfield.setonaction(a -> handleeditcommit(a)); 10 10
Das Observer-Pattern Stadardisiertes Event-Listener-Muster: Listener Registrieren (registerobserver Listener-Objekt vom Typ Observer) Registrierte Listener aufrufen (notifyobservers ruft die update-methoden aller registrierten Observer) ActionListener setonaction TextField anonym: (handleeditcommit) 11 11
Observable-Objekte Observables ermöglichen das Registrieren von Handlern (Listenern) Rufen die registrierten Handler ("notify") z.b. actionperformed() oder statechanged() Typische Observable-Objekte in Java sind GUI-Objekte das GUI selbst (MouseEvents) alle anderen Observer muss man selbst implementieren JavaFX erweitert das Observable-Muster auf beliebige Daten (-strukturen): Properties Observable Collections 12 12
Properties Java Bean-Attribut: privates Attribut getter und setter Property: Wrapper um ein Bean-Attribut getter und setter ("normal") mit "Kommunikations"-Möglichkeiten: Observable, Bindable setonchange bind Bean-Property Bean-Property 13 13
Java Bean ContactDetails 14 14
ContactDetails mit Properties : 15 15
Binden von Properties im Daten-"Modell" Im Konstruktor: Der Wert VollerName wird direkt an die anderen Properties "gebunden" Damit wirkt sich jede Änderung von Vor- oder Nachname direkt auf VollerName aus er wird synchronisiert. es gibt auch bindbidirectional 16 16
Binding-Test Nun sollte der VolleName sich immer aus den anderen Namensteilen ergeben: 17 17
Binding in einer anderen Klasse Methode liefert Property 18 18
Binden von Properties in der GUI In JavaFX sind alle Attribute von GUI-Elementen Properties! Nicht aufgefallen, weil getter und setter "normal" sind Binden der Größe eines Rectangle an die Fenstergröße 19 19
Binden von Properties im GUI 20 20
Binden von Properties zwischen GUI und "Modell" Binden von Properties in der GUI 21 21
Wichtige Binding-Anwendungen: Sehr häufig: Übernahme von Auswahlergebnis in ein anderes GUI-Element oder in das Datenmodell Aus Scribble kennen manche schon die Bindung an Combobox ColorPicker 22 22
Übertragung auf Listen und Tabellen? Im Prinzip braucht man Properties und DataBinding Aber: Bindung zwischen Editfeld und Collection-Element ist nicht dauerhaft hängt von der Selektion in der Collection ab Ausweg: Kluge Objekte, die jeweils die richtige Bindung herstellen: CellFactories Mehr dazu in der nächsten Woche! 23 23
... das war der Einstieg in Observables. Nächstes Mal kommen die Observable Collections 24 24
in der nähsten VL JavaFX Observable Collections Bidirektionales Binding Die Adressbuchtabelle ein beispiel. Als Übung (3 Wochen): Oberflächenelemente binden am besten anhand von scribble! Tabelle oder TreeView editierbar machen Terminkalender programmieren mit Binding Terminkalender und Adressbuch persistieren Chatfenster. 25