1. #1
    Membre régulier
    Profil pro
    Inscrit en
    avril 2008
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2008
    Messages : 482
    Points : 100
    Points
    100

    Par défaut Classe gérérique composant ComboBox

    Bonjour,

    Je suis en train de créer une classe générique afin de pouvoir alimenter une première combobox "objet" avec une ArrayList d'objets que j'aurais passés dans le constructeur à l'instanciation de l'objet et ainsi passés dans une listObservable pour le résultat affichable dans la combobox comme par exemple :

    Ma classe MaComboBox
    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
    package comboBox;
     
    import java.io.IOException;
    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import java.util.Collection;
     
    import Tests.Pays;
    import Tests.Region;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.fxml.FXML;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.control.ComboBox;
    import javafx.scene.control.ListView;
    import javafx.scene.control.SelectionMode;
    import javafx.scene.layout.BorderPane;
    import javafx.scene.layout.GridPane;
     
    public class MaComboBox<T> extends BorderPane {
     
        /**
         * ListView de gauche dans le nouveau composant
         */
        @FXML
        private ComboBox<T> objet;
        /**
         * ListView de droite dans le nouveau composant
         */
        @FXML
        private ComboBox<T> objetEnfant;
     
        /**
         * ObservableList qui permettra de remplir le ListView de gauche
         */
        private ObservableList<T> listObjet;
     
        /**
         * ObservableList qui permettra de remplir le ListView de gauche
         */
        private ObservableList<T> listObjetEnfant;
     
     
        ArrayList<T> objenf = new ArrayList<T>();
     
        public MaComboBox(ArrayList<T> listeObjet)
     
        {
     
            loader();
     
            this.listObjet = FXCollections.observableArrayList(listeObjet);
     
     
            initialise();
        }
    Et voila ma classe où j'instancie l'objet et ou je construis mes ArrayList de données :
    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
    package Tests;
     
    import java.util.ArrayList;
     
    import comboBox.MaComboBox;
    import javafx.application.Application;
    import javafx.collections.ObservableList;
    import javafx.scene.Scene;
    import javafx.scene.control.ComboBox;
    import javafx.stage.Modality;
    import javafx.stage.Stage;
     
    public class TestComboBox extends Application {
     
        MaComboBox mesComboBox;
     
        @Override
        public void start(Stage stage) throws Exception
        {
            ArrayList<Pays> payss = new ArrayList<Pays>();
     
            Pays p1 = new Pays(125,"France");
            Pays p2 = new Pays(258,"Espagne");
     
            payss.add(p1);
            payss.add(p2);
     
                Region r1 = new Region(1247,"Nord",p1);
            Region r2 = new Region(145,"fdfd",p1);
            Region r3 = new Region(489,"df",p1);
     
     
            p1.addRegion(r1);
            p1.addRegion(r2));
            p1.addRegion(r3));
     
            // on créé une nouvelle instance du composant ListSelection, à laquelle on passe les deux listes
            mesComboBox = new MaComboBox(payss);
     
            // on lance l'affichage
            stage.setScene(new Scene(mesComboBox));
            stage.setTitle("Utilisation d'un contrôle personnalisé");
            stage.setWidth(800);
            stage.setHeight(800);
            stage.show();
     
     
     
        }
    et voici ma classe pays où j'ai une ArrayList de Region
    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
    package Tests;
     
    import java.util.ArrayList;
     
     
    public class Pays {
     
     
        private int id;
        private String nom;
        private ArrayList<Region> regions = new ArrayList<Region>();
     
        public Pays(int id, String nom)
        {
            this.id = id;
            this.nom = nom;
        }
     
        public void addRegion(Region r) {
     
            regions.add(r);
        }
        @Override
        public int hashCode()
        {
            return id;
        }
     
        @Override
        public boolean equals(Object obj)
        {
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Pays other = (Pays) obj;
            return id == other.id;
        }
     
        @Override
        public String toString()
        {
            return nom;
        }
        public int getId()
        {
            return id;
        }
       public ArrayList<Region> getRegion() { return regions; }
    }
    Mon objectif est que quand je sélectionne un objet pays dans ma combobox ici nommé 'objet' (Exemple : France) ma deuxième combobox nommée ici 'objetEnfant' se remplisse avec les données de la collection ArrayList 'regions' par la méthode 'getRegion()' de l’objet pays que j'aurai sélectionné.

    Mais le problèble est que quand je sélectionne un pays dans ma combo 'objet' qui fonctionne très bien et qui me retourne un pays, impossible de voir les méthode de l'objet pays 'getRegion' car le type passé est générique et non de type Pays :

    voici ma fonction de sélection d'un item pays de la combobox pays:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private void selectOne() {
     
            if (this.objet.getSelectionModel().getSelectedItem() != null) {
     
                System.out.println(listObjet.get(this.objet.getSelectionModel().getSelectedIndex()));
     
    //j'ai bien mon objet pays 'ESPAGNE' mais impossible de voir les methode le cette objet!!!         
    }
    Merci les amis

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java/Eclipse RCP
    Inscrit en
    septembre 2009
    Messages
    10 399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java/Eclipse RCP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2009
    Messages : 10 399
    Points : 24 902
    Points
    24 902
    Billets dans le blog
    2

    Par défaut

    Salut,

    Une solution est que la classe qui représente les données de la première combobox implémente une interface qui permet de connaitre les données qui viendront remplir la deuxième combobox. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public interface DonneesRelatives<T> {
        List<T> getDonneesRelatives();
    }
    Ainsi, tu peux avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Pays implements DonneesRelatives<Region> {
     
           public List<Region> getDonneesRelatives() {
                 return getRegions();
           }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Region implements DonneesRelatives<Departement> {
     
           public List<Departement> getDonneesRelatives() {
                 return getDepartements();
           }
     
    }
    Comme ça tu as un moyen commun pour récupérer les données de la deuxième combo pour un item sélectionné dans la première.

    Autre solution, utiliser une lambda au moment de la création.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    private Function<T, List<S>> subdataProvider;
     
    public MaComboBox(ArrayList<T> listeObjet, Function<T,List<S> subdataProvider) {
     
       this.subdataProvider=subdataProvider;
     
    }
    quand tu instancies la combo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new MaComboBox( pays, p-> p.getRegions());
    Pour remplir la sous combo, en fonction d'un pays sélectionné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    T item = this.objet.getSelectionModel().getSelectedItem();
    List<S> data = subdataProvider.apply(item);
    /*.. tu peux remplir l'autre combo maintenant*/
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    avril 2008
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2008
    Messages : 482
    Points : 100
    Points
    100

    Par défaut

    Bonjour

    Tout d'abord merci pour les différentes informations

    Une fois que j'ai ajouter l'interfaces et implémentation de l'interface dans ma classe pays, comment utilisé la méthode "getDonneesRelatives"


    J'en suis au clique item de la combobox pays et voudrai donc avoir les régions grace a la methode "getDonneesRelatives" !!!!


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void selectOne() throws NoSuchMethodException, SecurityException {
    		System.out.println("selectOne !!!");
    		if (this.objet.getSelectionModel().getSelectedItem() != null) {
    			System.out.println(this.objet.getSelectionModel().getSelectedItem());
    merci

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java/Eclipse RCP
    Inscrit en
    septembre 2009
    Messages
    10 399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java/Eclipse RCP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2009
    Messages : 10 399
    Points : 24 902
    Points
    24 902
    Billets dans le blog
    2

    Par défaut

    Soit comme tu fais : comme tu obtiens l'instance d'item sélectionné, tu peux appeler la méthode de l'interface dessus puisque sa classe implémente l'interface, ce qui te permet d'avoir la liste qui permet de peupler l'autre combo. Soit par événement. Je n'utilise pas JavaFX, mais j'imagine quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    paysCombo.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Pays>() {
     
        @Override
        public void changed(ObservableValue<? extends Pays> selected, Pays oldPays, Pays newPays) {
                 regionCombo.getItems().clear();
                 regionCombo.getItems().addAll(newPays.getRegions()); 
        }
     
    })
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    avril 2008
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2008
    Messages : 482
    Points : 100
    Points
    100

    Par défaut

    Oui j’obtiens l'instance avec ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(this.objet.getSelectionModel().getSelectedItem());

    Mais je la méthode n'apparait pas sur mon instance après la fonction getSelectedItem()

    this.objet.getSelectionModel().getSelectedItem()......
    je voudrai faire ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.objet.getSelectionModel().getSelectedItem()
    Le principe et que mes combobox soit réutilisable génériquement

    Pour pouvoir avoir accés a mes méthode d'instance je dois faire ceci, UN CAST(pays)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(((Pays) this.objet.getSelectionModel().getSelectedItem()).getDonneesRelatives());
    Je rappelle que c'est des combobox réutilisable donc je ne peux pas avoir d'instance du type PAYS pays car c'est générique

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java/Eclipse RCP
    Inscrit en
    septembre 2009
    Messages
    10 399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java/Eclipse RCP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2009
    Messages : 10 399
    Points : 24 902
    Points
    24 902
    Billets dans le blog
    2

    Par défaut

    Citation Envoyé par chlock62 Voir le message
    Je rappelle que c'est des combobox réutilisable donc je ne peux pas avoir d'instance du type PAYS pays car c'est générique
    Tu peux paramétrer ta classe pour éviter d'avoir à caster (et pour le coup, ce sera réellement générique, et pas général en fait).
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    avril 2008
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2008
    Messages : 482
    Points : 100
    Points
    100

    Par défaut

    Oui mais comment réaliser ce paramétrage

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java/Eclipse RCP
    Inscrit en
    septembre 2009
    Messages
    10 399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java/Eclipse RCP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2009
    Messages : 10 399
    Points : 24 902
    Points
    24 902
    Billets dans le blog
    2

    Par défaut

    Citation Envoyé par chlock62 Voir le message
    Oui mais comment réaliser ce paramétrage
    Tu as déjà écrit une classe paramétrée : . Le paramétrage c'est le <T>.

    Si tu instancies comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaComboBox combo = new MaComboBox(...);
    tu est obligé de caster pour récupérer les "instances de classe T", parce que le compilateur n'en sait rien de ce que c'est, mais si tu instancies comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaComboBox<Pays> combo = new MaComboBox<>(...);
    , tu n'est plus obligé de caster, partout où il y a des "T", le compilateur sait que ce signifie Pays.

    Par exemple :
    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 Exemple<T> {
     
          private T machin;
     
          public Exemple(T machin) {
              this.machin=machin;
          }
     
          public T getMachin() {
             return machin;
          }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Exemple exemple1 = new Exemple(32);
    int val1 = (Integer)exemple1.getMachin(); // obligé de caster
     
    Exemple<Integer> exemple2 = new Exemple<>(32);
     
    int val2 = exemple2.getMachin(); // plus obligé de caster
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. [WD14] Partage d'un objet classe entre composant
    Par mbsl1 dans le forum WinDev
    Réponses: 0
    Dernier message: 29/05/2012, 09h04
  2. [WD15] Déclaration de classes et composants
    Par sylve dans le forum WinDev
    Réponses: 4
    Dernier message: 12/08/2011, 16h51
  3. [FLASH MX] classe Tween & composant loader
    Par totoche dans le forum Flash
    Réponses: 2
    Dernier message: 21/10/2005, 19h29
  4. Réponses: 2
    Dernier message: 09/08/2005, 09h51
  5. [Composant] Choix de la classe ancêtre
    Par Clorish dans le forum Composants VCL
    Réponses: 11
    Dernier message: 12/08/2004, 17h05

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