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

    Informations forums :
    Inscription : avril 2008
    Messages : 475
    Points : 98
    Points
    98

    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 212
    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 212
    Points : 24 486
    Points
    24 486
    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.

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, 08h04
  2. [WD15] Déclaration de classes et composants
    Par sylve dans le forum WinDev
    Réponses: 4
    Dernier message: 12/08/2011, 15h51
  3. [FLASH MX] classe Tween & composant loader
    Par totoche dans le forum Flash
    Réponses: 2
    Dernier message: 21/10/2005, 18h29
  4. Réponses: 2
    Dernier message: 09/08/2005, 08h51
  5. [Composant] Choix de la classe ancêtre
    Par Clorish dans le forum Composants VCL
    Réponses: 11
    Dernier message: 12/08/2004, 16h05

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