mars
2008
Ce billet a pour but de présenter brièvement le principe du DataBinding qui permet d’associer des données (XML, JavaBean, …) avec des interfaces utilisateurs (SWT, Swing) et d’expliquer la raison pour laquelle j’ai choisi JFace DataBinding pour gérer le binding dans le projet TK-UI.
Principe DataBinding
Le DataBinding (association de données) est un mécanisme qui permet de connecter des contrôles d’une UI à leur source de données. Un cas classique de DataBinding est de vouloir binder un controle Textbox (SWT Text, Swing JTextField) a une propriete d’un JavaBean.
Soit le JavaBean Person :
private String name = "Please fill the name";
public String getName(return this.name;)
public void setName(String name) { this.name = name;)
}
Soit le contrôle Textbox Swing :
JTextField text = new JTextField();
L’idéée basic du Databinding est de binder la propriété name d’une instance de Person avec la propriété Text du JTextField. Lorsque la JTextField s’affiche, elle contient « Please fill the name » car elle appelle getName de l’instance de person qui est initialisé avec cette valeur. Lorsque l’utilisateur saisie dans la JTextField, le setter setName est appelé pour mettre à jour la propriété name du JavaBean. Ce mode de fonctionnement permet donc de synchroniser l’UI avec le JavaBean, sans être obligé de coder la synchronisation. Ceci s’effectue par un moteur de DataBinding.
Implementation Moteur DataBinding
J’ai du effectuer une étude sur les implémentation de Databinding pour le projet TK-UI qui permet de décrire en XML (XHTML, XUL, XForms…) des interfaces et les rendre en SWT, Swing.
Dans le cas de TK-UI, celui doit gérer plusieurs type de DataBinding :
- DataBinding UI et DOM, autrement dit synchroniser les valeurs de l’UI avec les attributs du DOM
- DataBinding entre 2 UI, autrement dit synchroniser une Textbox avec une autre.
- DataBinding entre DOM et JavaBean/Objet Scriptable pour pouvoir binder à l’aide d’une expression de binding (comme en XAML), un objet JavaBean/Javascript avec le DOM.
DataBinding UI et DOM
Pour la grammaire HTML :
<input id="MyTextBox" type="text" value="Initial value" />
Il faut que l’attribut value soit bindé avec avec la propriété Text du JTextField. Le DOM HTML chargé reste toujours synchronisé avec l’UI (Swing ou SWT). Ce qui permet ensuite de pouvoir récupérer la valeur du JTextField à travers le DOM HTML chargé, comme ceci :
String value = input.getAttribute("value");
DataBinding entre 2 UI
Dans TK-UI, il est possible de décrire le binding à l’aide d’une expression de binding (comme en XAML).
Par exemple le HTML suivant :
<input id="MyTextbox2" type="text" value="{Binding ElementName=MyTextbox1" Path=value } />
Permet de binder la deuxieme Textbox avec la première. Lorsque la première est modifiée par l’utilisateur (ou par le DOM), la deuxième textbox se synchronise avec la première textbox.
DataBinding entre DOM et JavaBean/Objet Scriptable
Cette fonctionnalité n’est pas encore développé, mais on pourra faire ceci :
function Person() {
this.name = '';
}
var myPerson = new Person();
</script>
<input type="text" value={Binding Source=myPerson Path=name} />
Permet de binder la Textbox avec la champs name de l’objet Javascript myPerson.
JFace Databinding
Il existe plusieurs implémentation de moteur de DataBinding en Java comme celle de JGoodies ou celle ci. Le problème est que ces moteurs de binding ne gère qu’un type de binding. JGoodies permet de binder des JavaBean avec des contrôles Swing. Mais binder un DOM avec du SWT reste très compliqué à implémenter.
Je recherchais donc un moteur de binding générique et je suis tombé sur JFace DataBinding qui comme son nom ne l’indique pas est un moteur de binding générique indépendant de SWT. L’equipe de JFace propose un moteur de binding générique et ont implementé le binding pour SWT et JavaBean, autrement dit :
- org.eclipse.core.databinding_*.jar est le jar qui contient le moteur générique de DataBinding.
- org.eclipse.jface.databinding_*.jar est le jar qui contient l’implementation du binding pour SWT
- org.eclipse.core.databinding.beans_*.jar est le jar qui contient l’implementation du binding pour JavaBean
Qu’en est il de DOM, Swing et Javascript (Rhino). J’ai aussi découvert le projet UFace qui se veut une API d’UI générique pour ensuite la rendre dans n’importe quel renderer (SWT, Swing, GWT…). UFace utilise JFace DataBinding pour gérer le binding. Je contribue à UFace pour implémenter JFace Databinding pour gérer le binding avec DOM, Swing et Javascript (Rhino). Vous pouvez trouvez les projets sur UFace :
- org.ufacekit.core.databinding.dom est le projet Eclipse qui contient l’implémentation du binding pour XML DOM
- org.ufacekit.ui.swing.databinding est le projet Eclipse qui contient l’implémentation du binding pour Swing
- org.ufacekit.core.databinding.scripting est le projet Eclipse qui contient l’implémentation du binding pour Javascript (Rhino)
Ce qui est génial avec JFace DataBinding est qu’une fois que l’on a implementé un type de DataBinding, on peut l’utiliser avec un autre type. Par exemple, le DOM DataBinding implementé peut être utilisé pour binder DOM avec SWT, DOM avec Swing, DOM avec des objets Javascripts.
Si vous souhaitez plus d’information concernant TK-UI ou JFace Databinding, n’hésites pas à laisser un message ou à me contacter.
Angelo
2 Commentaires + Ajouter un commentaire
Articles récents
- Conception d’un client Eclipse RCP et serveur OSGI avec Spring DM [step5]
- Conception d’un client Eclipse RCP et serveur OSGI avec Spring DM [step4]
- Conception d’un client Eclipse RCP et serveur OSGI avec Spring DM [step3]
- Conception d’un client Eclipse RCP et serveur OSGI avec Spring DM [step2]
- Conception d’un client Eclipse RCP et serveur OSGI avec Spring DM [step1]
Commentaires récents
- Conception d’un Editeur Eclipse de workflow XML [step 0] dans
- Conception d’un Editeur Eclipse de workflow XML [step 19] dans
- Conception d’un Editeur Eclipse de workflow XML [step 7] dans
- Conception d’un Editeur Eclipse de workflow XML [step 7] dans
- Conception d’un Editeur Eclipse de workflow XML [step 7] dans
Bonjour leothorne,
Mise a part le site officiel http://wiki.eclipse.org/JFace_Data_Binding_FAQ
je n’en connais pas beaucoup (malheusement).
Sur le lien http://wiki.eclipse.org/JFace_Data_Binding/Snippets tu peux trouver des examples
Avec un autre membre de developpez on a l’intention d’ecrire un article sur JFace Databinding (en francais je pense) mais ca n’est pas pour tout de suite.
Angelo
Bonjour Angelo,
J’utilise SWT dans un projet et j’ai des UI très complexes.
Auriez-vous des tutoriels bien élaborés pour une bonne utilisation de JFACE Binding?
Merci d’avance.