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 :

comment binder un StringProperty avec un substring d'une autre StringProperty


Sujet :

JavaFX

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut comment binder un StringProperty avec un substring d'une autre StringProperty
    Bonjour,

    La question est dans le titre mais mérite une petite explication...

    j'ai donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    StringProperty  complet = new SimpleStringProperty("11112233");
    System.err.println(complet.get().substring(4, 6)); // vaut 22
     
    StringProperty  milieu = new SimpleStringProperty();
    et ma question est de savoir si je peux binder bidirectionnellement les caractères qui valent pour l'instant 22 entre "complet" et "milieu" ?

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Ca se fait facilement via le binding de bas niveau (et on peut rendre le truc générique assez facilement en passant des paramètres additionnels à la nouvelle classe créée) :

    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
    private final StringProperty complet = new SimpleStringProperty("11112233");
    private final StringBinding milieuCompute = new StringBinding() {
        {
            bind(complet);
        }
     
        @Override
        public void dispose() {
            super.dispose();
            unbind(complet);
        }
     
        @Override
        protected String computeValue() {
            final String value = complet.get();
            String result = null;
            if (value != null && value.length() >= 6) {
                result = value.substring(4, 6);
            }
            return result;
        }
    };
    private final ReadOnlyStringWrapper milieu = new ReadOnlyStringWrapper();
     
    [...]
     
    milieu.bind(milieuCompute);
    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 habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 212
    Points : 184
    Points
    184
    Par défaut
    Une autre solution (liaison unidirectionnel) est d'utiliser la classe Bindings:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     StringProperty  complet = new SimpleStringProperty("11112233");
            StringProperty  milieu = new SimpleStringProperty();
            milieu.bind(Bindings.createStringBinding(() -> complet.get().substring(4, 6), complet));

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut
    Merci à tous les deux pour vos réponses.
    @Bouye
    "Ca se fait facilement via le binding de bas niveau ...."
    Facilement, facilement, moi çà me parait vraiment très complexe

    @Ubuntu
    Un simple binding me suffit, mais je n'ai pas accès au Lambda (je suis toujours en 2.2)
    Pourrais-tu me traduire ?

  5. #5
    Membre habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 212
    Points : 184
    Points
    184
    Par défaut
    Citation Envoyé par Golzinne Voir le message
    Merci à tous les deux pour vos réponses.
    @Bouye
    "Ca se fait facilement via le binding de bas niveau ...."
    Facilement, facilement, moi çà me parait vraiment très complexe

    @Ubuntu
    Un simple binding me suffit, mais je n'ai pas accès au Lambda (je suis toujours en 2.2)
    Pourrais-tu me traduire ?
    voici le code utilisant une classe anonyme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    milieu.bind(Bindings.createStringBinding(new Callable<String>() {
     
                @Override
                public String call() throws Exception {
                    return complet.get().substring(4, 6);
                }
            }, complet));

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut
    merci pour la traduction

    voici le code mis en pratique:

    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
     
    public class Main extends Application {
    	@Override
    	public void start(final Stage primaryStage) {
     
    		final StringProperty  complet = new SimpleStringProperty("11111111");
    		final StringProperty  milieu = new SimpleStringProperty();
    		try {
     
    			milieu.bind(Bindings.createStringBinding(new Callable<String>() {
     
    	            @Override
    	            public String call() throws Exception {
    	                return complet.get().substring(4, 6);
    	            }
    	        }, complet));
     
     
     
     
    TextField   myTextField = new TextField("123456789");
    complet.bind(myTextField.textProperty());
     
    System.out.println(complet.get());
    TextField myAnswer  = new TextField();
    myAnswer.textProperty().bind(milieu);
    myAnswer.setLayoutY(100);
     
     
     
     
     
    			AnchorPane root = new AnchorPane();
     
    			root.getChildren().addAll(myTextField, myAnswer);
     
    			Scene scene = new Scene(root,400,400);
    			scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
    			primaryStage.setScene(scene);
    			primaryStage.show();
     
     
     
    		} catch(Exception e) {
    			e.printStackTrace();
    		}
    	}
     
    	public static void main(String[] args) {
    		launch(args);
    	}
    }

  7. #7
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    @Golzinne : ça a l'air compliqué mais en fait c'est facile à utiliser (quand on a compris comment ça marche) et surtout c'est plus efficace (perfs) et plus facilement réutilisable que le binding de haut niveau ou l'API fluent de la classe Bindings.
    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

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut
    Citation Envoyé par bouye Voir le message
    c'est facile à utiliser (quand on a compris comment ça marche)
    C'est bien ça le problème, c'est le comment ça marche ...
    mais je promets que je vai essayer de comprendre.

    Merci

  9. #9
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Ben dans le constructeur (le constructeur d'une classe anonyme est une méthode anonyme {}) tu te bindes sur la/les propriété(s) source et quand cette dernière est modifiée, ça invalide automatiquement le binding.

    Pour le reste le binding fonctionne comme n'importe quel observable, quand tu cherches à obtenir sa valeur, s'il est dans un état invalide, ça invoque automatiquement updateValue() qui calcule la nouvelle valeur. Sinon ça utilise la valeur en cache pour éviter un calcul inutile.

    Le destructeur ça sert à faire du nettoyage comme d'hab.

    Rien de sorcier donc.

    -> Tutoriel sur le binding de bas niveau en JavaFX
    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

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

Discussions similaires

  1. Comment binder un service avec plusieurs activités ?
    Par Spredzy dans le forum Android
    Réponses: 5
    Dernier message: 18/10/2010, 15h47
  2. Comment binder Crystal report avec entity framework ?
    Par arnaudev dans le forum Entity Framework
    Réponses: 0
    Dernier message: 27/09/2010, 17h54
  3. comment binder un dataList avec une ArrayList
    Par inno007 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 03/03/2008, 17h55

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