SwingLabs - Les nouveaux composants graphiques SwingX

DataBinding

Présentation

Le DataBinding consiste à automatiser la synchronisation entre les données et la vue.

La concurrence

Faisons un petit tour des DataBinding existants :

Généricité

Le DataBinding développé dans le cadre de SwingLabs est générique et peut-être utilisé sur Swing, mais aussi en environnement web, ou même SWT.

Sources de données

De base, plusieurs sources de données sont possible, et il est est facile de développer un accès à une nouvelle source.

le Master/Detail

Le but du DataBinding est de simplifier la création d'interfaces graphiques orientées affichage de données : le Master/Detail.
Le Master/Detail consiste à fournir par exemple le nom d'un client et de voir la liste des commandes qu'il a passé, comme l'illustre l'image ci-dessous :

La vérification des données

Le DataBinding sert également pour la vérification de données, comme par exemple la vérification qu'une adresse e-mail est syntaxiquement valide. La validation de SwingLabs s'appuie entièrement sur celle développée par JGoodies. en effet, la partie validation de JGoodies a été mise plusieurs fois en production, ce qui en assure une certaine robustesse.
Plusieurs possibilités s'offrent à nous pour indiquer visuellement la validation d'un champs, comme l'illustre la figure suivante :

Le DataModel

Le DataBinding de SwingLabs repose sur le DataModel, dont voici la définition :


public Interface DataModel {
	public MetaData[] getMetaData();
	public MetaData getMetaData(String arg);
	public int getFieldCount();
	public String[] getFieldNames();
	public ValueChangeListener[] getValueChangeListeners();
	public void removeValueChangeListener(ValueChangeListener arg)
	public void addValueChangeListener(ValueChangeListener arg);
	public Validator[] getValidators();
	public void removeValidator(Validator arg);
	public void addValidator(Validator arg0);
	public void setValue(String arg0, Object arg1);
	public Object getValue(String arg);
}

Le DataModel est générique et peut accueillir toute sorte de type de données provenant d'une base de données :

Le DataModel peut également être hiérarchique et ainsi représenter un arbre.

Exemple

Voici comment attacher des données à une zone, en utilisant des composants SwingX contenu dans un composant Swing :

public class MyPanel extends JPanel {
  BindingContext ctx;

  public void initComponents() {
    ctx = new BindingContext();
    newsList = new org.jdesktop.swingx.JXList();
    newsList.setDataPath("news");
    newsList.setDisplayFieldName("subject");
    newsList.setBindingContext(ctx);
    
    bodyArea = new org.jdesktop.swingx.JXTextArea();
    bodyArea.setDataPath("news[@selected].body");
    bodyArea.setBindingContext(ctx);
    [...]
  }

  public void bindComponents() {
    List news = [...];
    ctx.addDomainData("news", news);
  }
} 

La nouveauté dans SwingX est que le BindingContext est présent par défaut. On peut alors supprimer un certain nombre de lignes, en remplaçant le JPanel par un JXPanel, de SwingX :


public class MyPanel extends JXPanel {
  public void initComponents() {
    newsList = new org.jdesktop.swingx.JXList();
    newsList.setDataPath("news");
    newsList.setDisplayFieldName("subject");
    
    bodyArea = new org.jdesktop.swingx.JXTextArea();
    bodyArea.setDataPath("news[@selected].body");
    [...]
  }

  public void bindComponents() {
    List news = [...];
    addDomainData("news", news);
  }
}