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 :

Activation / suppression d'un bindBidirectionnal() via un listener


Sujet :

JavaFX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur projet
    Inscrit en
    Juin 2014
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2014
    Messages : 48
    Par défaut Activation / suppression d'un bindBidirectionnal() via un listener
    Bonjour,
    Je cherche à activer et supprimer le binding bidirectionnel entre un champ de saisie TextField et une propriété (DoubleProperty) en fonction de l'élément que l'utilisateur sélectionne dans une liste.
    L'idée est de pouvoir apporter des modifications à la variable directement depuis la Texfield, mais cette variable peut également être mise à jour par ailleurs dans le programme, d'où l'utilisation d'un binding bidirectionnel.
    J'ai besoin que ce binding se mette en place via un listener. J'ai donc reproduit un exemple simplifié qui reproduit le comportement rencontré.

    Je rencontre le problème suivant :
    Lorsque le binding est défini en dehors d'un listener (option 1), le code fonctionne correctement : on peut apporter des modifications directement dans le champ de saisie Texfield, ou via le bouton qui incrémente la valeur stockée dans cette variable.

    La second test (option 2) réalisé consiste à utiliser une checkbox pour installer ou supprimer ce binding via un changelistener (bindingCheckChange). A ce moment là, les modifications apportées à la variable ne sont pas transmises au champ de saisie TextField et inversement. Ce sont pourtant les mêmes commandes qui sont utilisées pour installer le binding.
    Je ne parviens pas à m'expliquer ce comportement, ni à régler ce problème.
    Merci d'avance pour votre aide.

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    import javafx.application.Application;
    import javafx.scene.Scene;
    import javafx.beans.value.ChangeListener;
    import javafx.beans.value.ObservableValue;
    import javafx.event.ActionEvent;
    import javafx.event.EventHandler;
    import javafx.scene.control.Label;
    import javafx.scene.control.TextField;
    import javafx.scene.control.CheckBox;
    import javafx.scene.control.Button; 
    import javafx.scene.layout.VBox;
    import javafx.beans.binding.Bindings;
    import javafx.beans.property.DoubleProperty;
    import javafx.beans.property.SimpleDoubleProperty;
    import javafx.util.StringConverter;
    import javafx.util.converter.NumberStringConverter;
    import javafx.stage.Stage;
     
     
    public class HelloFX extends Application {
     
        private DoubleProperty aProperty = new SimpleDoubleProperty(2.5); 
        private final TextField numberField = new TextField(); 
     
        private Button button = new Button("+1");
        private final StringConverter<Number> converter = new NumberStringConverter();
     
     
        @Override
        public void start(Stage stage) {
            CheckBox checkBox = new CheckBox("BidirectionalBinding");
     
            VBox  vbox = new VBox (checkBox, numberField, button);
            vbox.setSpacing(5);
     
            /* Le bouton permet d'incrémenter la valeur stockée dans la variable aProperty */
            button.setOnAction(new EventHandler<ActionEvent>() {
    			@Override
    			public void handle(ActionEvent event) {
    				aProperty.set(aProperty.get()+1.0);
    			}
    		});
     
     
            /* Déclaration et mise en place d'un listener permettant d'activer ou de supprimer le binding bindBidirectionnal() */
            ChangeListener bindingCheckChange = new ChangeListener<Boolean>() {
            @Override
            public void changed(ObservableValue<? extends Boolean> ov,
                Boolean old_val, Boolean new_val) {
                if (new_val)
                    System.out.println("checkbox activated => isntallation bindBidirectionnal");
                    numberField.textProperty().bindBidirectional(aProperty, converter);
                    // Bindings.bindBidirectional(numberField.textProperty(), aProperty, converter);
                if (!new_val)
                    System.out.println("checkbox unchecked => unbindBidirectional");
                    numberField.textProperty().unbindBidirectional(aProperty);
            }};
            checkBox.selectedProperty().addListener(bindingCheckChange);
     
     
            /* Listener permettant de suivre les changements apportés Ã* la variable 'aProperty' */
            aProperty.addListener(new ChangeListener<Number>() {
                @Override
                public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
                   System.out.println("aProperty changed : "+ oldValue+ " --> "+ newValue);
                }
            });
     
     
            /* Option 1 : Installation du binding directement en utilisant l'une ou l'autre des deux commandes suivantes => cela fonctionne correctement */
            //Bindings.bindBidirectional(numberField.textProperty(), aProperty, converter);
            //numberField.textProperty().bindBidirectional(aProperty, converter);
     
     
            /* Option 2: Test des fonctions de binding en passant par le une checkbox => Cela ne fonctionne pas*/
            checkBox.selectedProperty().set(true); 
     
            Scene scene = new Scene(vbox, 640, 480);
            stage.setScene(scene);
            stage.show();
        }
     
        public static void main(String[] args) {
            launch();
        }
     
    }

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 899
    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 899
    Billets dans le blog
    54
    Par défaut
    Probablement car tu as oublié de mettre des accolades sur tes tests et donc tu que desenregistre le binding immédiatement après l'avoir établi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (new_val)
        System.out.println("checkbox activated => isntallation bindBidirectionnal");
    numberField.textProperty().bindBidirectional(aProperty, converter);
    // Bindings.bindBidirectional(numberField.textProperty(), aProperty, converter);
    if (!new_val)
        System.out.println("checkbox unchecked => unbindBidirectional");
    numberField.textProperty().unbindBidirectional(aProperty);
    ->

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (new_val) {
        System.out.println("checkbox activated => isntallation bindBidirectionnal");
        numberField.textProperty().bindBidirectional(aProperty, converter);
       // Bindings.bindBidirectional(numberField.textProperty(), aProperty, converter);
    } else {
        System.out.println("checkbox unchecked => unbindBidirectional");
        numberField.textProperty().unbindBidirectional(aProperty);
    }
    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 confirmé
    Homme Profil pro
    Ingénieur projet
    Inscrit en
    Juin 2014
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2014
    Messages : 48
    Par défaut
    Je me sens idiot d'avoir laisser passer cette erreur dans l'exemple donné. Même si ça ne résout pas directement le problème que je rencontre dans mon code, cela m'a permis de comprendre que le problème ne venait pas des propriétés de binding, ni dans la façon dont je le mettais en place. Cela m'a donc permis d'isoler l'origine du problème et d'avancer.
    Merci beaucoup pour l'aide apportée et pour votre contribution indéfectible à ce forum.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/09/2007, 16h32
  2. Réponses: 4
    Dernier message: 24/09/2007, 16h17
  3. Erreur suppression projet sur Tomcat via Ant
    Par stujava dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 09/08/2007, 10h20
  4. Recherche;ajout et suppression dans une BD via VB
    Par uvany1 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 23/04/2007, 16h39
  5. [Formulaire] Alerte avant suppression d'une donnée via un formulaire
    Par leloup84 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 26/01/2006, 10h50

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