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

AWT/Swing Java Discussion :

Récupérer valeur d'un JComboBox


Sujet :

AWT/Swing Java

  1. #1
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 38
    Par défaut Récupérer valeur d'un JComboBox
    Messieurs dames, bonsoir,
    je souhaiterais récupérer la valeur d'un JComboBox, remplie par ma DB. Opération somme toute simple, mais visiblement pas :

    Code :

    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
            lieu = new JComboBox(vect2);
            pan2.add(new JScrollPane(lieu));
            String lieux="abc";
            lieu.addItemListener(
                new ItemListener()
                {
                    public void itemStateChanged(ItemEvent evenement)
                    {
                        if(evenement.getStateChange()==ItemEvent.SELECTED)
                        {
                            lieux=lieu.getSelectedItem().toString();
                        }
                    }
                }
             );
    Erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Compiling 1 source file to D:\JAVA\Cables*****1\build\classes
    D:\JAVA\Cables*****1\src\Index\ajoutCable.java:122: local variable lieux is accessed from within inner class; needs to be declared final
                            lieux=lieu.getSelectedItem().toString();
    Note: D:\JAVA\Cables*****1\src\Index\ajoutCable.java uses unchecked or unsafe operations.
    Help! I need somebody. Help!

  2. #2
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 38
    Par défaut
    Lorsque je déclare le String en "final" comme il le demande, voici l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    D:\JAVA\Cables*****1\src\Index\ajoutCable.java:122: cannot assign a value to final variable lieux

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Et comme ça ?
    En mettant ta variable en final et en ne l'initialisant pas.

    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
     
    lieu = new JComboBox(vect2);
            pan2.add(new JScrollPane(lieu));
            final String lieux;
            lieu.addItemListener(
                new ItemListener()
                {
                    public void itemStateChanged(ItemEvent evenement)
                    {
                        if(evenement.getStateChange()==ItemEvent.SELECTED)
                        {
                            lieux=lieu.getSelectedItem().toString();
                        }
                    }
                }
             );

  4. #4
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 38
    Par défaut
    Dans ce cas j'ai un autre message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Compiling 1 source file to D:\JAVA\Cables*****1\build\classes
    D:\JAVA\Cables*****1\src\Index\ajoutCable.java:122: cannot assign a value to final variable lieux
                            lieux=lieu.getSelectedItem().toString();

  5. #5
    Membre émérite
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Par défaut
    Bonjour,

    une question :

    le code donné est dans une méthode
    la variable lieux a comme durée de vie le temp d'exécution de la méthode.
    l'événement est déclanché à la sélection da la combo donc à la fin de la méthode

    comment compte tu utiliser par la suite la variable lieux ?

  6. #6
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 38
    Par défaut
    Non, elle est déclarée en dehors de la méthode, dans la classe. Mais elle est "remplie" dans la méthode que j'ai envoyé.
    Je compte l'utiliser après comme argument dans une requete SQL vers ma DB.
    Mais étant déclarée dans la classe, elle est censée être récupérée sans problème non?

  7. #7
    Membre émérite
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Par défaut
    la variable lieux est definie au niveau de la classe
    pourquois ne pas passer par ses accesseurs ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(evenement.getStateChange()==ItemEvent.SELECTED)
    {
         setLieux(lieu.getSelectedItem().toString());
    }

  8. #8
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 38
    Par défaut
    C'est quoi le set collé à la variable Lieux? Parce que java ne le comprend pas, moi non plus d'ailleurs...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    D:\JAVA\Cables*****1\src\Index\ajoutCable.java:126: cannot find symbol
    symbol: method setLieux(java.lang.String)
                            setLieux(lieu.getSelectedItem().toString());

  9. #9
    Membre émérite
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Par défaut
    si lieux est une variable de classe, elle doit avoir une léthode set et une méthode get
    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
    public class Maclasse {
        private String lieux;
        private JComboBox lieu;
     
     
        private String getLieux() {
            return lieux
        }
     
        private void setLieux(String p_lieux) {
            lieux = p_lieux;
        }
     
        public MaClasse() {
            ....
            lieu = new JComboBox(vect2);
            pan2.add(new JScrollPane(lieu));
            lieu.addItemListener(
                new ItemListener()
                {
                    public void itemStateChanged(ItemEvent evenement)
                    {
                        if(evenement.getStateChange()==ItemEvent.SELECTED)
                        {
                            setLieux(lieu.getSelectedItem().toString());
                        }
                    }
                }
             );
        }
    }

  10. #10
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 38
    Par défaut
    Ca ne fonctionne pas, j'ai une erreur disant que Lieux n'a pas été initialisée.
    Et quand je l'initialise, il m'affiche ce que j'ai mis dans l'initialisation.


    C'est qd même ridicule de récupérer la valeur d'un JComboBox

  11. #11
    Membre émérite
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Par défaut
    Comment est déclenché l'appel à la base ?

  12. #12
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 38
    Par défaut
    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
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    package Index;
     
    import java.awt.* ; 
    import java.awt.event.*; 
    import javax.swing.*; 
    import javax.swing.JPanel.*; 
    import javax.swing.event.*;
    import javax.swing.Icon.*;
    import java.sql.*;
    import javax.swing.JFrame.*;
    import javax.swing.JDialog.*;
    import java.util.*;
    /**
     *
     * @author *****
     */
    public class ajoutCable extends JPanel {
        private JPanel      pan1,pan2;
        private JLabel      message, messNumCable, messLieu, messTest;
        private JButton     boutonValider;
        private Fenetre     parent;
        private JComboBox   numLibre, lieu;
        private String lieux="abc";
     
        private String getLieux() {
            return lieux;
        }
     
        private void setLieux(String p_lieux) {
            lieux = p_lieux;
        }
     
        /** Creates a new instance of ajoutCable */
        public ajoutCable(Fenetre p, Connection co) {
     
            parent = p;
            //déclarations et placement des composants
            //this.setLayout (new GridLayout(2,1,0,0));
            this.setLayout (new BorderLayout(20,20));
     
            //création, remplissage et placement du panneau titre
            pan1    = new JPanel();
            pan1.setLayout(new FlowLayout());
            message= new JLabel("Insertion d'un nouveau câble VOICE");
            message.setForeground(java.awt.Color.BLUE);
            message.setFont(new Font("Arial",Font.BOLD,16));
            pan1.add(message);
            this.add("North",pan1);
     
            //création, remplissage et placement du panneau de champs
            pan2    = new JPanel();
            pan2.setLayout(new FlowLayout());
            messNumCable= new JLabel("Numéro de câble : ");
            pan2.add(messNumCable);
            Vector vect=new Vector();
            try
                {
                    ResultSet res = AccesGen.executeQuery(co, "SELECT NumCable FROM VOICE");
                    // On défini une valeur de départ :
                    int cursor = 1;
                    while (res.next()) 
                    {
                    // Pour chaque valeur présente dans la base :
                    int value = res.getInt("NumCable");
                    // Et on boucle sur toutes les valeurs entre le curseur et la valeur retournée :
                    for (int i=cursor; i<value; i++) 
                    {
                        // TODO : la valeur 'i' n'est pas présente dans la base
                        vect.add (i);
                    }
                    // On incrémente le curseur avant de passer au suivant :
                    cursor = value + 1;
                }
                vect.add (cursor);
                }
                catch(SQLException sqle)
                {
                    System.out.println("Erreur SQL : " + sqle);
                    JOptionPane.showMessageDialog(null, "Error SQL","ERROR",JOptionPane.ERROR_MESSAGE);
            }
            numLibre = new JComboBox(vect);
            pan2.add(new JScrollPane(numLibre));
     
            messLieu=new JLabel("       Lieu :");
            pan2.add(messLieu);
     
            Vector vect2=new Vector();
            try
            {
                 ResultSet res = AccesGen.executeQuery(co, "SELECT Lieu FROM LIEU");
                 String donnees2="abc";
                 while (res.next()) 
                 {
                    //Pour chaque valeur présente dans la base :
                    String donnees = res.getString("Lieu");
                    if (donnees.equals(donnees2))
                    {
                        //test
                    }
                    else
                    {
                        vect2.add(donnees);
                    }
                    donnees2 = donnees;
                 }
            }
            catch(SQLException sqle)
            {
                 System.out.println("Erreur SQL : " + sqle);
                 JOptionPane.showMessageDialog(null, "Error SQL","ERROR",JOptionPane.ERROR_MESSAGE);
            }
            lieu = new JComboBox(vect2);
            pan2.add(new JScrollPane(lieu));
            //final String lieux;
            lieu.addItemListener(
                new ItemListener()
                {
                    public void itemStateChanged(ItemEvent evenement)
                    {
                        /*if(evenement.getStateChange()==ItemEvent.SELECTED)
                        {
                            lieux=lieu.getSelectedItem().toString();
                        }*/
                        if(evenement.getStateChange()==ItemEvent.SELECTED)
                        {
                            setLieux(lieu.getSelectedItem().toString());
                        }
                    }
                }
             );
     
            messTest= new JLabel(lieux);
            messTest.setForeground(java.awt.Color.BLUE);
            messTest.setFont(new Font("Arial",Font.BOLD,16));
            pan2.add(messTest);
     
            this.add("Center",pan2);
        }
    }

  13. #13
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Pourquoi ne fais tu pas directement un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    lieu.getSelectedItem().toString()
    là où tu as besoin de récupérer la valeur de ta combo ?
    Pas besoin de passer par un événement, non ?

  14. #14
    Membre émérite
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Par défaut
    la seule chose qui utilise la variable lieux c'est le JLabel "messTest" ( messTest= new JLabel(lieux); ) !

    donc pourquoi ne pas faire ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                        if(evenement.getStateChange()==ItemEvent.SELECTED)
                        {
                            messTest.setText(lieu.getSelectedItem().toString());
                        }

  15. #15
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 38
    Par défaut
    C'est un test pour le moment, pour voir si ca fonctionne ou non. Ca servira plus tard à être envoyé comme argument dans une requêtes SQL.
    J'explique :
    Ce JComboBox permet de choisir le batiment, en fonction de ce qui est choisi dans cette liste (batiment), j'aimerais qu'un autre JComboBox se remplisse des etages disponibles dans ce batiment, puis en fonction de l'etage, les locaux, etc...
    Donc, récupérer la valeur simplement, oui, ca marche, je vais voir si ca me suffit pour terminer comme je le souhaite. Car si je change une valeur, les liste suivante doivent aussi changer... D'ou l'utilisation de l'événement.

  16. #16
    Membre émérite
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Par défaut
    il faut découper le constructeur de ta classe AjoutCable (les nom de classe commence par une majuscule) en plusieur méthodes.

    dans le constructeur on ne garde que ce qui sert à construire l'affichage de la fenêtre (partie garphique et listener)
    ensuite il faut une méthode par traitement( par exemple créer une methode de recherche des étages)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        public void chercherEtages(String batiment) {
            //traitement de recherche des étages
            //  => select des etage where batiment = batiment
            //remplissage de la combo des etages
        }
    puis si tu souhaite que le changement de batiment provoque le chargement de la combo des étages il suffit que l'evementde la combo des batiments appel la methode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(evenement.getStateChange()==ItemEvent.SELECTED)
    {
        chercherEtages(lieu.getSelectedItem().toString());
    }

  17. #17
    Membre émérite
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Par défaut
    Voilà un exemple pour comprendre le principe de la gestion evénementiel (fait à la va-vite donc nettement améliorable):
    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
    public class Fenetre extends JFrame
    {
        private JPanel pan;
        private JComboBox batiments;
        private JComboBox etages;
     
        /**
         * Mise en place des composants graphiques
         */
        public Fenetre()
        {
            this.setResizable(false);
            this.setSize(620, 420);
            this.setLocationRelativeTo(null);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
            pan = new JPanel();
            pan.setLayout(null);
            batiments = new JComboBox(new String[]{"Choisir un bâtiment","Bâtiment 1","Bâtiment 2"});
            batiments.addItemListener(new ItemListener(){
                public void itemStateChanged(ItemEvent evenement)
                {
                    if(evenement.getStateChange()==ItemEvent.SELECTED)
                    {
                        chercherEtages(evenement.getItem().toString());
                    }
                }            
            });
            batiments.setBounds(20,10,150,25);
            pan.add(batiments);
            etages = new JComboBox();
            etages.setBounds(20,50,100,25);
            getContentPane().add(pan);
            pan.add(etages);
            //pan.add(etages);
     
     
        }
        /**
         * pour lancer le test.
         * @param args
         */
        public static void main(String[] args)
        {
            new Fenetre().setVisible(true);
        }
        /**
         * Charge les etages pour un bâtiment.
         * @param batiment
         */
        public void chercherEtages(String batiment) {
            DefaultComboBoxModel modele = (DefaultComboBoxModel)etages.getModel(); 
            modele.removeAllElements();
            if ("Bâtiment 1".equals(batiment)) {
                modele.addElement("Etage 1");
                modele.addElement("Etage 2");
                modele.addElement("Etage 3");
            }
            if ("Bâtiment 2".equals(batiment)) {
                modele.addElement("1er Etage");
                modele.addElement("2nd Etage");
            }
        }    
     
    }

  18. #18
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 38
    Par défaut
    Je n'utilise pas de méthode pour la simple et bonne raison que chaque fois que je rempli une liste, c'est par requete sql. et donc si je dois à chauqe fois appeler une méthode pour un remplissage, ca complique le système assez fort. Je sais que ma solution n'est pas le plus "propre", mais c'est la plus simple il me semble.

    Je réxplique ce que je veux :

    J'ai un liste : je sélectionne dedans un batiment.
    Là une autre liste apparait (ou se remplit, c'est pareil, elle peut etre soit absente, soit grisée) en fonction de ce qui a été choisi dans la première.
    Là rebelote, une autre liste apparait en fonction de ce qui a été choisi dans la 2e.
    etc...

  19. #19
    Membre émérite
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Par défaut
    si tu ne veux pas faire de requête à chaque changement, rien ne t'empêche de charger la liste complete des elements au début (dans le constructeur), et dans la méthode tu construit la combo à partir des élements.

    par contre tu ne peux pas éviter de faire une méthode qui reconstruit la deuxième liste à chaque changement d'item de la première.

  20. #20
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 38
    Par défaut
    Je ne vois pas comment je peux d'une méthode, renvoyer la liste vers la fenetre.
    Je ne dis pas que c'est pas possible hein! Je dis juste que je ne comprend pas comment faire?
    Je sais que je vais devoir utiliser des méthodes, mais dans ma tete, je ncomptais utiliser que des ecouteurs, ce genre de choses.

Discussions similaires

  1. Récupérer valeur de JComboBox selon son type
    Par alfhcg dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 03/12/2012, 22h48
  2. Récupérer les valeurs d'un JComboBox
    Par Lukoda dans le forum AWT/Swing
    Réponses: 16
    Dernier message: 11/07/2012, 10h53
  3. Récupérer la valeur d'un JCombobox à partir d'une BD
    Par coolanso dans le forum Composants
    Réponses: 2
    Dernier message: 13/08/2010, 00h09
  4. Récupérer et comparer la valeur d'un JCombobox
    Par canary dans le forum Composants
    Réponses: 3
    Dernier message: 11/05/2008, 02h43
  5. récupérer valeur jcombobox
    Par mmb04 dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 20/04/2007, 15h11

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