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

JavaFX Discussion :

Binding JavaBean et JavaFX Label


Sujet :

JavaFX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 25
    Par défaut Binding JavaBean et JavaFX Label
    Bonjour,

    J'ai un objet java disposant d'une propriété Float (balance )que j'aimerais lier à un label javaFX de sorte qu'une modification de balance soit répercutée aussitot sur la partie graphique.

    Le Bean Account
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class Account{
     
    private Float balance;
     
    public Float getBalance(){
    return balance;
    }
     
    public void setBalance(Float balance){
    this.balance = balance;
    }
     
    }
    test d'encapsulation que j'ai fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    class AccountProperty {
     
    		private Account	account;
    		private SimpleFloatProperty balance;
     
     
    		public AccountProperty(Account account){
    			this.account = account;
    			balance = new SimpleFloatProperty(account,"balance");
    			balance.set(account.getBalance());
    		}
     
    		public Float getBalance(){
    			return account.getBalance();
    		}
     
    		public void setBalance(Float balance){
    			account.setBalance(balance);
    		}
     
    		public FloatProperty balanceProperty(){
    			return balance;
    		}
    	}
    Le lien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    AccountProperty current = new AccountProperty(account);
     
    javafx.scene.control.Label currentAmount;
    ...
    currentAmount.textProperty().bind(computed.balanceProperty().asString());
    Si ensuite je fait account.setBalance(25F), il ne se passe rien et le label n'est pas modifié.

    J'ai du raté un truc ou alors j'ai rien compris au binding javaFX.

    Pourriez vous m'éclairer ?

    Merci par avance

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 900
    Billets dans le blog
    54
    Par défaut
    Si ton beans ne génère jamais d'event (PropertyChangeEvent) lorsque sa valeur change et que ta property ne les écoute pas (PropertyChangeListener, celui de l'API Java, pas celui de JavaFX), comment veux-tu qu'elle puise se mettre à jour ?

    Un beans, a besoin de plus que juste un getter et un setter pour être complet et autonome.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 25
    Par défaut
    Ah ok. J'imaginais qu'il devait y avoir une mécanisme quelconque pour faire cela automatiquement. Je vois d’ailleurs pas pourquoi il y en aurait un.

    Donc il faut que je modifie le bean account en ajoutant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Account{
     
      private Float balance;
      private PropertyChangeSupport mPcs = new PropertyChangeSupport(this);
      ...
      public void setBalance(Float balance){
        this.balance = balance;
        mPcs.firePropertyChange("balance", this.balance, balance);
       }
      ...
    }
    Puis ensuite modifier AccountProperty pour y ajouter un PropertyChangeListener. Sauf que là, je ne sais pas comment faire.

    Sinon je peut aussi faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    class AccountProperty {
    		
    		private Account	account;
    		private SimpleFloatProperty balance;
    		
    		
    		public AccountProperty(Account account){
    			this.account = account;
    			balance = new SimpleFloatProperty(account,"balance");
    			balance.set(account.getBalance());
    		}
    		
    		public Float getBalance(){
    			return account.getBalance();
    		}
    		
    		public void setBalance(Float balance){
    			account.setBalance(balance);
    			this.balance.setValue(balance);
    		}
    		
    		public FloatProperty balanceProperty(){
    			return balance;
    		}
    	}
    et j'appelle le setBalance de AccountProperty. ça fonctionne mais ça me gène de faire ça dans la partie graphique alors que cela devrait être fait dans la partie service métier.

    Pour ma culture perso, et si tu as un peu de temps à y consacrer, j'aimerais bien un bout de code d'exemple de PropertyChangeListener et PropertyChangeEvent.

    Je pense que je vais me débrouiller autrement.

    Merci.

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 900
    Billets dans le blog
    54
    Par défaut
    Hélas, je n'ai pas trop de temps à passer dessus puisque je suis toujours en vacances au fin fond des landes de Gascogne et qu'ensuite à partir de samedi, je suis à la JavaOne à San Francisco. Je ne redeviens pleinement disponible qu'à partir du 8 ou 9 octobre (nonobstant 4000 emails à trier au boulot).

    Le fait d'appeler des setters dans l'UI pour un test c'est quand même un peu normal .
    Après bien sur il faudra tester que l'UI FX réagit bien correctement lorsque la propriété du bean est appelée depuis la couche métier et probablement depuis une autre thread (et donc vérifier que coté FX tout se déroule dans la thread appropriée, ce qui je pense dois être le cas).

    Le PropertyChangeEvent fonctionne grosso-modo comme son équivalent FX, juste que là où dans FX on a 3 paramètres dans la fonction appellée, dans Java on a un seul objet event qui contient la source, la propriété, l'ancienne et la nouvelle valeur (et qu'on peut récupérer en appelant les méthodes idoines). C'est donc kif kif pareil à ceci près que l'appel sur le listener peut avoir lieu dans une autre thread que la thread FX.

    Coté JavaFX, ta vie est facilitée par le fait qu'ils ont déjà prévu le coup d'avoir des propriété pleinement dédiées aux beans :

    Citation Envoyé par JavaFX doc
    JavaBeanBooleanProperty
    JavaBeanBooleanPropertyBuilder
    JavaBeanDoubleProperty
    JavaBeanDoublePropertyBuilder
    JavaBeanFloatProperty
    JavaBeanFloatPropertyBuilder
    JavaBeanIntegerProperty
    JavaBeanIntegerPropertyBuilder
    JavaBeanLongProperty
    JavaBeanLongPropertyBuilder
    JavaBeanObjectProperty
    JavaBeanObjectPropertyBuilder
    JavaBeanProperty
    JavaBeanStringProperty
    JavaBeanStringPropertyBuilder
    Donc, en théorie, tu n'as pas à coder l'enregistrement/le désenregistrement des listeners a mano. Un truc du genre devrait suffire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FloatProperty myFXProperty = JavaBeanFloatPropertyBuilder.create().bean(myBean).name("myProperty").build();
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReadOnlyFloatProperty myFXProperty = JavaBeanFloatPropertyBuilder.create().bean(myBean).name("myProperty").build();
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 900
    Billets dans le blog
    54
    Par défaut
    Petite erreur dans ton code, remplace :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void setBalance(Float balance){
        this.balance = balance;
        mPcs.firePropertyChange("balance", this.balance, balance);
       }
    par :`
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void setBalance(Float balance){
        float oldValue = this.balance
        this.balance = balance;
        mPcs.firePropertyChange("balance", oldValue, balance);
       }
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 25
    Par défaut
    Merci. Je vais méditer tout ça

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

Discussions similaires

  1. XAML Binding condiionel depuis un label
    Par july4474 dans le forum Windows Presentation Foundation
    Réponses: 0
    Dernier message: 02/12/2010, 20h03
  2. JavaFX without EDT & bind java/JavaFX
    Par r1-1024 dans le forum JavaFX
    Réponses: 13
    Dernier message: 29/09/2009, 01h29
  3. Binding Label.FontWeight et CheckBox
    Par sodaw dans le forum Windows Forms
    Réponses: 5
    Dernier message: 21/09/2009, 12h18
  4. Binding en JavaFX
    Par thomas.cadot dans le forum JavaFX
    Réponses: 5
    Dernier message: 24/03/2009, 10h01
  5. Binding SWT, Swing, DOM, JavaBean, Rhino
    Par azerr dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 01/02/2008, 12h10

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