2009-04-14 4 views
1

J'ai une crampe de cerveau essayant de comprendre la manière appropriée d'utiliser les bindings JGoodies dans mon application.jgoodies bindings + changements indirects

J'ai un article de classe qui est un bean qui a des propriétés en lecture seule. Article est un bean "simple" et ne gère pas les écouteurs de propriétés, car les propriétés ne changent jamais. J'ai un Swan JPanel que je voudrais utiliser pour afficher certaines propriétés d'un article. Des objets d'article différents peuvent être visualisés à des moments différents.

Je cherche quelque chose (X) qui effectue les opérations suivantes par un ou plusieurs objets:

  1. X contient l'article actuellement affiché. Je peux appeler X.setArticle() et X.getArticle() pour passer à un article différent. Il n'y a pas d'autre moyen de changer l'article actuellement vu, je dois passer par X afin qu'il sache que je le change.
  2. Lorsque je configure mon JPanel, je veux utiliser X pour créer des JTextField en lecture seule qui sont liés à diverses propriétés de l'article actuellement vu (titre, auteurs, etc.)
  3. (ceci résulte de # 1 et # 2) Chaque fois que X.setArticle() est appelé, le contenu des champs de texte sera automatiquement mis à jour.

J'ai essayé d'utiliser BeanAdapter pour extraire les modèles de propriété d'un article contenu dans un ValueHolder et BasicComponentFactory.createTextField() pour créer les champs de texte, et tout semble fonctionner sauf que je reçois un com.jgoodies.binding.beans.PropertyUnboundException se plaindre que ma classe d'article a des propriétés non liées. Duh! Je sais cela, je ne peux pas comprendre comment obtenir la bonne «plomberie» pour y faire face. Chaque Article est non modifiable, mais l'article actuellement affiché peut en indiquer un autre.

des suggestions?

Répondre

1

Je l'ai compris.

je fais quelque chose comme ceci:

// on setup: 

BeanAdapter<Article> adapter = new BeanAdapter<Article>((Article)null, 
    false); 
// the "false" in the constructor means don't try to observe property 
// changes within the Article, but we still can observe changes 
// if the Article itself is replaced with a new one. 

JTextField tfAuthors = BasicComponentFactory.createTextField(
    adapter.getValueModel("authors")); 
JTextField tfTitle = BasicComponentFactory.createTextField(
    adapter.getValueModel("title")); 

Plus tard, quand je change l'objet de l'article, je fais juste ceci:

public void showArticle(Article article) 
{ 
    adapter.setBean(article); 
} 

et mises à jour sur tout écran très bien.

Questions connexes