IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

[beansbinding 0.5 jdk6 update1] problème pour binder sur un bean


Sujet :

AWT/Swing Java

  1. #1
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2006
    Messages : 380
    Points : 314
    Points
    314
    Par défaut [beansbinding 0.5 jdk6 update1] problème pour binder sur un bean
    Bonjour,
    C'est une question lorsqu'on utilise le dernier jdk avec le framework beansbinding 0.5 sur Netbeans 6M9 avec matisse.
    J'avais posté sur le forum netbeans mais on m'a conseillé de venir plutôt ici. Ca me semble logique du fait que Netbeans semble remplir son devoir. Et que c'est plutôt le framework beansbinding qui semble ne pas assurer toutes les fonctions.


    J'ai un JLabel qui bind sur une valeur (au travers d'un get et d'un set) qui doit changer au cours du temps, elle est modifiée par un Timer.

    Pour faire le binding, j'ai cliqué doit sur le label, puis j'ai choisi les menu :
    - bind/text
    -j'ai renseigné "Binding Source" sur l'objet contenant l'objet qui contient la propriété que je dois afficher.
    - puis dans "Binding Expression" j'ai été chercher la propriété désirée
    - Dans l'oprion avanced j'ai bien Always sync(Read/Write)

    Le problème est que je lance le programme, le JLabel se fixe sur la bonne valeur (20) mais lorsque celle-ci s'incrémente grâce au Timer l'affichage n'est pas modifié.

    Le code généré pour le Binding est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //au début de l'initcomponent on voit :
    bindingContext = new javax.beans.binding.BindingContext();
     
    //puis vers le milieu
    bindingContext.addBinding(partie1, "${joueur1.pointActionActuel}", pointActionJoueur1, "text");
     
    //à la fin du code il  y a
    bindingContext.bind();
    Je précise que je suis programmeur Java pour mon loisir car dans mon métier je fais du C# donc si je ne suis pas trop au point faut pas m'en vouloir !

    J'espère m'être exprimé assez clairement.

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,



    Le DataBinding utilise une notion importante : les PropertyChangeListener
    Ces derniers permettent d'être mis au courant des changements d'une propriété d'un objet.

    Il faut donc que tes objets qui seront surveillé implémente ce mécanisme de listener afin de "signaler" leurs modifications pour mettre à jour le binding.

    C'est assez simple à mettre en place grâce à la classe PropertyChangeSupport, il te suffit ainsi de proposer dans tes classes les méthodes pour ajouter/supprimer un listener sur tes propriétés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    		protected PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);
     
    		public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
    			if (listener != null) {
    				changeSupport.addPropertyChangeListener(propertyName, listener);
    			}
    		}
     
    		public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
    			if (listener != null) {
    				changeSupport.removePropertyChangeListener(propertyName, listener);
    			}
    		}
    Ensuite, il faut générer un évènement à chaque modification de la propriété. Par exemple dans ton cas la méthode setPointActionActuel() pourrait ressembler à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    		public void setPointActionActuel(int value) {
    			if (pointActionActuel!=value) {
    				// On garde une copie de l'ancienne valeur :
    				int oldValue = pointActionActuel;
    				// On met à jour la valeur de la propriété
    				pointActionActuel = value;
    				// Et on envoit l'évenement à tous les listeners :
    				changeSupport.firePropertyChange("pointActionActuel", oldValue, pointActionActuel);
    			}
    		}
    Et là je pense que ca devrait fonctionner normalement

    a++

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2006
    Messages : 380
    Points : 314
    Points
    314
    Par défaut
    Merci Adiguba, tes explications sont claires et compréhensibles comme toujours.

    Je croyais que le binding allait se débrouiller tout seul, en évitant justement ce genre de manipulations.

    J'imaginais que le "addBinding" ajoutait un évènement qui se déclenchait à la modification de la propriété : comme ça tout seul, sans rien faire... Tant pis je vais mettre ça dans mon appli !

    Dommage ! Si je comprend bien le seul travail du binding est de rafraichir l'affichage par rapport à des évènements qu'il faut tout de même générer soi-même.

    Je me demande coment je vais faire lorsque j'aurai des collections d'objets bindés sur des tableaux. J'imagine que si on ne veut rafraichir qu'une partie du tableau, il faudra être très précis, sinon on raffiche tout.

    A+

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tralloc
    Je me demande coment je vais faire lorsque j'aurai des collections d'objets bindés sur des tableaux. J'imagine que si on ne veut rafraichir qu'une partie du tableau, il faudra être très précis, sinon on raffiche tout.
    Il me semble (mais je n'en suis pas sûr) que la JSR prévoit des wrappers pour cela, qui permettent de gérer les bons évènement sur les collections...

    a++

  5. #5
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2006
    Messages : 380
    Points : 314
    Points
    314
    Par défaut
    En tout cas vivement que ça arrive en version finale... et avec une doc bien explicite
    Bye et merci !

  6. #6
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2006
    Messages : 380
    Points : 314
    Points
    314
    Par défaut
    je viens de poster une question sur le forum de sun.
    Voici une partie de ce qu'on m'a répondu :

    dans le premier message de réponse :
    First asking the most frequent oversight (just to make sure :-) does the
    setter fire a propertyChangeEvent on change?
    Dans le deuxième
    yes, you need some mechanism to notify interested parties about changes
    of your bean.

  7. #7
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2006
    Messages : 380
    Points : 314
    Points
    314
    Par défaut
    Adiguba : j'ai essayé ta méthode, ça marche très bien, c'est pas compliqué, il suffit de bien comprendre ce qu'on fait.

    Effectivement la dernière fois que j'avais essayé de faire de la mise à jour, je crois que c'était plus compliqué que ça. Il me semble qu'il fallait faire plus de manip sur l'objet "client".

    J'ai aussi l'impression que ça doit être plus simple de travailler directement dans des objets de type JComponent, car il y a nativement la méthode firePropertyChange qui est implémentée

    ce que je trouve pas sympa dans cette méthode, c'est de devoir utiliser le set à l'intérieur de mon bean au lieu d'utiliser directement la propriété.
    En tous les cas ça fonctionne, ouf !

    La prochaine fois j'essaie de faire ça à partir d'une collection dans JTable... ou un JComboBox... Si je trouve je vous dirai comment ça marche

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 40
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Il me semble (mais je n'en suis pas sûr) que la JSR prévoit des wrappers pour cela, qui permettent de gérer les bons évènement sur les collections...

    a++
    Il suffit de rendre la liste observable et le tour est joué !

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 71
    Points : 55
    Points
    55
    Par défaut
    Bonjour,

    J'utilise le binding pour voir dans une Jlist des enregistrements à partir d'une base de données.
    Tout se passe bien, je vois bien le contenu.
    Par contre, si je rajoute un élément dans la base de données, il faudrait que je puisse mettre à jour la Jlist. Y a t'il quelque chose pour demander à la liste de regarder sa source et donc de se mettre à jour?

    Merci

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 71
    Points : 55
    Points
    55
    Par défaut
    pas d'idée ?

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 93
    Points : 36
    Points
    36
    Par défaut
    Je suis aussi ce topic de près.

    Il y a-t-il un tutoriel simple qui explique en détail le fonctionnement du databinding sous netbeans?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 09/03/2009, 16h33
  2. [E-03] problème pour travailler sur 2 fichiers en même temps
    Par Emily2711 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 24/02/2009, 12h06
  3. Problème pour rediriger sur une autre page html
    Par PatMh77 dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 05/05/2008, 07h48
  4. [WPF] problème pour binder un treview avec un XDocument.
    Par maa dans le forum Windows Presentation Foundation
    Réponses: 8
    Dernier message: 28/01/2008, 14h59
  5. [Struts] Problème pour itérer sur un vecteur
    Par vallica dans le forum Struts 1
    Réponses: 5
    Dernier message: 24/04/2006, 15h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo