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 :

les builders de noeud et l'heritage des paramètres


Sujet :

JavaFX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Par défaut les builders de noeud et l'heritage des paramètres
    Salut les jFxiens,

    Du fait qu’apparemment les builders passe par la notion des generics, ceux-ci n'hérite pas des builders parent (donc des paramètres des noeud parent).

    Ainsi pour construire un bouton avec le paramètre graphic je devrais d'abord construire un objet Label car c'est dans ce type de noeud que se trouve ce paramètre qui est utilisé en standard par héritage dans le bouton.

    Idem pour les paramètres LayoutXY qui dependent de Node. Je devrais donc d'abord créer un objet node puis un Label puis le bouton final afin de pouvoir utiliser dans un builder l'ensemble des ces paramètres contenu dans ces 3 classes de noeuds graphique.

    Alors comment je pourrais créé inline (sans FXML) en une seule instruction builder un bouton qui set des paramètres à la fois de la classe Node et Label pour lequel button hérite ?

    Surement quelques chose autour des generics pour arriver à cette fin mais je ne vois pas bien comment.

    des idées ?

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 904
    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 904
    Billets dans le blog
    54
    Par défaut
    J'ai rien compris

    Sinon ButtonBuilder dispose bien d'une méthode graphic() héritée de sa classe parente LabeledBuilder tandis que layoutX() et layoutY() sont hérités d'un ancêtre plus ancien : NodeBuilder

    Quand à la manière dont les builders fonctionnent ; difficile de dire exactement sans les sources (les builder sont compilé via une syntaxe particulière qui a été opensourcée plus tôt), mais j'entrevois deux solutions :

    1) Soit tous les champs stockés sont protected, donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class ButtonBuilder {
      public Button build() {
        Button result = new Button();
        [...]
        result.setGraphic(graphic);
        [...]
        result.setLayoutX(layoutX);
        result.setLayoutY(layoutX);
        [...]
        return result;
      }
    }
    mais ça ne semble pas être le cas d'après la doc vu que rien n'est listé en protected.

    2) soit, plus simplement, une méthode de configuration est appelée et remonte tout l'arbre d'héritage. Ça tombe bien tous les builders héritant de NodeBuilder ont la méthode applyTo() justement !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class ButtonBuilder {
      public Button build() {
        Button result = new Button();
        applyTo(result);
        return result;
      }
     
      public void applyTo(Button button) {
        super.applyTo(button);
        [...]
      }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class LabeledBuilder{
      public void applyTo(Labeled labeled) {
        super.applyTo(button);
        [...]
        labeled.setGraphic(graphic);
        [...]
      }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class NodeBuilder{
      public void applyTo(Node node) {
        [...]
        node.setLayoutX(layoutX);
        node.setLayoutY(layoutX);
        [...]
      }
    }
    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 très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Par défaut
    Je ne trouve aucune information concernant la methode applyTo();

    Le code que tu présente proviens d'ou je ne comprends pas bien ?

    Concernant mon code voici ce que j'ai :
    Mon builder de base qui va construire mes boutons avec les paramètre communs entre eux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            buttonBuilder = ButtonBuilder.create()
                                                       .alignment(Pos.CENTER)
                                                       .contentDisplay(ContentDisplay.TOP)
                                                       .graphicTextGap(0)
                                                       .prefHeight(13)
                                                       .prefWidth(13)
                                                       .maxHeight(13)
                                                       .maxWidth(13)
                                                       .minHeight(13)
                                                       .minWidth(13)
                                                       .mnemonicParsing(false)
                                                       .styleClass("btn_window");
    A partir de la j'aimerais créer un button en spécifiant en plus les paramètres Layout et graphic en me servant d'une ligne comme celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    btnWindowFermer = buttonBuilder.graphic(viewAgrandir).layoutY(20).layoutX(10);
    Mais soit je n'ai pas accès à la methode build pour construire à la fin mon node soit j'y est accès mais je n'ai plus accès aux paramètres de layout ou graphic.

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 904
    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 904
    Billets dans le blog
    54
    Par défaut
    La question serait plus claire si elle était mieux décrite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    ButtonBuilder buttonBuilder = ButtonBuilder.create()
                    .alignment(Pos.CENTER)
                    .contentDisplay(ContentDisplay.TOP)
                    .graphicTextGap(0)
                    .prefHeight(13)
                    .prefWidth(13)
                    .maxHeight(13)
                    .maxWidth(13)
                    .minHeight(13)
                    .minWidth(13)
                    .mnemonicParsing(false)
                    .styleClass("btn_window");
    Button btnWindowFermer  = buttonBuilder.graphic(viewAgrandir).layoutY(20).layoutX(10).build();
    Et l'erreur c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cannot find symbol
      symbol: method build
      location: class NodeBuilder
    Tandis que ceci passe sans problème :
    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
    Button btnWindowFermer = ButtonBuilder.create()
                    .alignment(Pos.CENTER)
                    .contentDisplay(ContentDisplay.TOP)
                    .graphicTextGap(0)
                    .prefHeight(13)
                    .prefWidth(13)
                    .maxHeight(13)
                    .maxWidth(13)
                    .minHeight(13)
                    .minWidth(13)
                    .mnemonicParsing(false)                    
                    .styleClass("btn_window")
                    .graphic(viewAgrandir)
                    .layoutY(20)
                    .layoutX(10)
                    .build();
    Ça doit être une limitation des generics au niveau du compilateur.
    Un petit cast et on en parle plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Button btnWindowFermer  = ((ButtonBuilder)buttonBuilder.graphic(viewAgrandir).layoutY(20).layoutX(10)).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
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Par défaut
    Effectivement je n'avais pas pensé à caster ma ligne de commande sur le build. Je comptais un peur trop sur mon auto-completion pour me dire si je pouvais ou non atteindre une méthode.

    C'est donc bien a cause des generics que je ne peux atteindre l'ensemble des méthodes hérité mais avec un cast cela reste tout à fait valable d'effectuer ce genre de manipulation.

    Merci à toi Bouye de ton éclairage

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

Discussions similaires

  1. [Xpath] Sélectionner les noeuds parents en fonctions des enfents
    Par xrcr9709 dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 27/04/2008, 18h12
  2. Retrouver les valeurs des paramètres des fonctions d'une DLL
    Par Bernard Martineau dans le forum Langage
    Réponses: 6
    Dernier message: 08/11/2005, 10h42
  3. Ajusté les Axes d'un graphe en fonction des données rentrée!
    Par Ma2thieu dans le forum Composants VCL
    Réponses: 5
    Dernier message: 09/07/2004, 01h34
  4. heritage des contraintes
    Par krimson dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 30/04/2004, 12h04
  5. créer un noeuds avec des paramétres
    Par Toxine77 dans le forum XMLRAD
    Réponses: 5
    Dernier message: 21/01/2003, 16h11

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