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

Composants Java Discussion :

probleme avec un JComboBox et une JTable


Sujet :

Composants Java

  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 203
    Par défaut probleme avec un JComboBox et une JTable
    Bonjour,

    Après beaucoup d'essai de bidouillage, je m'en remet à votre savoir

    En résumé,

    j'ai un JComboBox qui contient la liste des établissements (liste situé dans ma base de données)

    j'ai une JTable qui doit me donner des informations concernant l'établissement.

    j'ai un bouton qui me permet de créer un nouvel établissement

    1) lorsque je clique sur l'onglet "établissement", ma JComboBox est par défaut sur le 1er établissement, et donc ma JTable doit afficher les renseignements le concernant.

    2) quand je sélectionne un autre établissement, ma JTable doit m'afficher les renseignements le concernant

    Problème: j'arrive bien à mettre mon établissement par défaut avec les bon renseignement mais je n'arrive pas à changer d'établissement
    J'ai donc changer mon code mais là rien ne marche


    3) quand je clique sur le bouton création un formulaire apparait (ça c'est ok), cale enregistre mes données dans ma base de données (OK) mais quand je ferme ce formulaire et donc que je retourne sur mon onglet établissement, ma liste n'est pas mise à jour

    Voici mon code:

    classe etablissement:
    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
    public class Etablissement extends JPanel implements ItemListener,ActionListener{
     
        DefaultComboBoxModel listeModel= new DefaultComboBoxModel();
        JComboBox liste;
        JTable table=new JTable();
        TableModel tableur;
         JButton btC=new JButton("Création");
     
    //nom du client afin de le récupérer pour la création d'un établissement (n'apparait pas)
        JTextField tfClient;
    Etablissement(String client)
    {
      super();
      build(client);
    }
     
    private void build(String client)
    {
            tfClient= new JTextField(client);
     
          try {
            BaseDonnees BD=new BaseDonnees();
            ResultSet rst=BD.Ets(client);
            while(rst.next())
               {
                listeModel.addElement(rst.getString("denominationEts"));
                }
         }catch(Exception se) {
                System.out.println("erreur commise est: "+se);
            }
         liste = new JComboBox(listeModel);
         //JCompletionBox.enableAutoCompletion(liste);
         liste.setSelectedIndex(0);
         liste.setMaximumRowCount(5);
         liste.setBounds (550, 120,300,300);
         liste.setBackground(Color.WHITE);
     
     
    //Ecouteur sur la liste et les boutons
      if(liste.getSelectedItem()==client)
      {
          try{
                  BaseDonnees BD=new BaseDonnees();
                  String nomClt=tfClient.getText();
                  ResultSet rst=BD.lireEts1(nomClt);
                  while(rst.next())
                  {
                   String s=rst.getString("denominationEts");
                   table=contenu(s);
                   table.updateUI();
                   revalidate();
                   addFormat(gbc,table, fixStyle, 1, 0);
     
          }
            } catch(Exception se) {
                System.out.println("erreur commise est: "+se);
            }
      }
      else
      {
         liste.addItemListener(this);
      }
     
         btC.addActionListener(this);
         setLayout(new GridBagLayout());
        // Répartition
            addFormat(gbc,liste, fixStyle, 0, 0);
            addFormat(gbc,btC, fixStyle, 2, 1);
     
          }
     
    //Affiche information de l'établissement quand clique dessus
     
    public void itemStateChanged(ItemEvent e) {
           if(e.getStateChange() == ItemEvent.SELECTED)
           {
                                 String s=e.getItem().toString();
                                 table=contenu(s);
                                 table.updateUI();
                                 revalidate();
                                 addFormat(gbc,table, fixStyle, 1, 0);
           }
    }
     
    //Création d'un nouvel établissement
     
    public void actionPerformed(ActionEvent evt){
          Object obj=evt.getSource();
     
        if (obj==btC)
          {
            String nomClt=tfClient.getText();
           CreaEts nouvEts=new CreaEts(nomClt);
          }
     
    }
     
    //Methode contenu: renvoie une JTable avec info de l'établissement
     
    private JTable contenu(String ets)
        {
          String denoEts="";
          String siret="";
     
         try{
     
                  BaseDonnees BD=new BaseDonnees();
                  ResultSet rst=BD.lireEts(ets);
                  while(rst.next())
          {
     
          denoEts=rst.getString("denominationEts");
          siret=rst.getString("siret");
     
          }
            } catch(Exception se) {
                System.out.println("erreur commise est: "+se);
            }
        String[] titreColonnes = { "", ""};
     
       Object[][] données = { { "Dénomination", denoEts },
                                       { "Siret",siret} };
        table=new JTable(données,titreColonnes);
        table.setPreferredSize(new Dimension(700, 300));
        tableur=table.getModel();
        return table;
          }
    J'espère que j'ai bien expliqué mon problème
    merci de votre aide
    claire

  2. #2
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 203
    Par défaut
    Je viens déjà de résoudre une erreur (stupide):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    String t=(String)(liste.getSelectedItem());
     
    //Ecouteur sur la liste et les boutons
      if(t.equals(client))
      {
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if(liste.getSelectedItem()==client)

    mais quand je change d'établissement, rien ne se passe
    claire

  3. #3
    Membre éprouvé
    Profil pro
    Devops
    Inscrit en
    Août 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Devops

    Informations forums :
    Inscription : Août 2006
    Messages : 107
    Par défaut
    J'ai l'impression en survolant le code que tu crées une nouvelle JTable a chaque fois (au lieu d'ajouter un element a une JTable).

    Ensuite, je ne comprends pas ce qu'il se passe dans la fonction actionPerformed. C'est quoi un CreaEts() ?

    Pourquoi la fonction contenu s'appel comme ça ? Il est super important que les fonctions porte un nom correspondant a leur action !

    (Surtout si tu veux que d'autre personnes puisse relire le code )

  4. #4
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 203
    Par défaut
    - la classe CreaEts est mon formulaire pour créer un nouvel établissement.

    - la méthode contenu() me permet, normalement, de remplir ma JTable

    (excusez moi pour les nom mais ça fait à peine 1 mois que je me suis mis à Java donc j'ai du mal à structurer mon code).

    Je vais regarder si je créée plusieurs fois ma table, et si oui, comment je fais pour seulement changer les données à l'intérieur.

    merci pour ta réponse
    claire

  5. #5
    Membre éprouvé
    Profil pro
    Devops
    Inscrit en
    Août 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Devops

    Informations forums :
    Inscription : Août 2006
    Messages : 107
    Par défaut
    Citation Envoyé par claire13 Voir le message
    Je vais regarder si je créée plusieurs fois ma table, et si oui, comment je fais pour seulement changer les données à l'intérieur.
    Visiblement, oui :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    table = new JTable(données, titreColonnes);
    Juste une petites discution sur comment structurer le code. Dans les grandes lignes : Il faut penser en terme de modele (la structure de données), la vue (le moyen de représenter cette structure) et le controleur (le moyen d'influencer sur la structure).

    Ici le modele peut etre une liste d'etablissement contenant les informations les concernants.
    La vue est a la fois la table et le jcombobox
    Enfin le controleur est le code permettant d'ajouter un etablissement dans la liste (par l'intermediare d'une autre vue le TextField du nom de l'etablissement ou le fameux CreaEts() mais la je reste encore dans le flou...)

    Déjà, si tu arrives a avoir ces trois parti bien séparer, tu auras simplifié une grande partie du problème.

  6. #6
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 203
    Par défaut
    merci de ta réponse.

    J'ai refait mon code en enlevant l'erreur de la multi création de JTable et en essayant de séparer le model de la vue (j'attaquerais le contrôleur plus tard).

    Voici le nouveau 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
    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
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    public class EtablissementBis extends JPanel implements ItemListener,ActionListener{
    /*************************************************************************/
    //Vue
    /*************************************************************************/
        DefaultComboBoxModel listeModel= new DefaultComboBoxModel();
        JComboBox liste;
        JLabel titre2=new JLabel("Descriptif de l'établissement");
        JTable table;
        Object[][] données;
        TableModel tableur;
        String[] titreColonnes = { "", ""};
        JButton btM=new JButton("Modifier");
        JButton btC=new JButton("Création");
        JButton btS=new JButton("Supprimer");
        BaseDonnees BD=new BaseDonnees();
     
        //nom du client afin de le récupérer pour la création d'un établissement (n'apparait pas)
        JTextField tfClient;
     
     
        GridBagConstraints gbc=new GridBagConstraints();
     
    /*************************************************************************/
    //Constructeur
    /*************************************************************************/
     
    EtablissementBis(String client)
    {
      super();
      build(client);
    }
    /********************************************************************************************************/
    //Model: appel des fonctions contenuTable(string nom établissement) et contenuListe(string nom client)
    /********************************************************************************************************/
     
     
    private void build(String client)
    {
          tfClient= new JTextField(client);
         listeModel=contenuJComboBox(client);
         liste = new JComboBox(listeModel);
         liste.setSelectedIndex(0);
         liste.setMaximumRowCount(5);
         liste.setBounds (550, 120,300,300);
         liste.setBackground(Color.WHITE);
     
     
    //Ecouteur sur la liste et les boutons
         liste.addItemListener(this);
         btC.addActionListener(this);
     
    // Répartition
       setLayout(new GridBagLayout());
       addFormat(gbc,liste, fixStyle, 0, 0);
       addFormat(gbc,btM, fixStyle, 2, 0);
       addFormat(gbc,btC, fixStyle, 2, 1);
       addFormat(gbc,btS, fixStyle, 2, 2);
     
    //si on n'a pas encore sélectionné un établissement, siège sociale (ets 1)par défaut:
    //données = information le concernant
     
    //quand je sélectionne un autre établissement, écouteur sur la liste
    //données =  information concernant le nouvel établissement
       String t=(String)(liste.getSelectedItem());
     
      if(t.equals(client))
      {
          try{
              données=contenuTableau(client);
      } catch(Exception se) {
                        System.out.println("erreur commise est: "+se);
                        }
      }
      table=new JTable(données,titreColonnes);
      table.updateUI();
      revalidate();
      table.setPreferredSize(new Dimension(700, 300));
      tableur=table.getModel();
     
      addFormat(gbc,table, fixStyle, 1, 0);
     
     
          }
    public void itemStateChanged(ItemEvent e) {
           if(e.getStateChange() == ItemEvent.SELECTED)
           {
                                 String s=e.getItem().toString();
                                 données=contenuTableau(s);
           }
    }
     
     
    //donne le contenu de la JTable
        private Object[][] contenuTableau(String ets)
        {
          //String ets="cpa";
          String denoEts="";
          String siege="";
          String adr1="";
          String adr2="";
          String cp="";
          String ville="";
          String siren="";
          String naf="";
          String act="";
          String conv="";
          String eff="";
          String hor="";
          String aff="";
     
     
     
          try{
     
                  BaseDonnees BD=new BaseDonnees();
                  ResultSet rst=BD.lireEts(ets);
                  while(rst.next())
          {
     
          denoEts=rst.getString("denominationEts");
          siege=rst.getString("siegeSocial");
          adr1=rst.getString("adr1Ets");
          adr2=rst.getString("adr2Ets");
          cp=rst.getString("cpEts");
          ville=rst.getString("villeEts");
          siren=rst.getString("sirenEts");
          naf=rst.getString("nafEts");
          act=rst.getString("activiteEts");
          conv=rst.getString("conventionEts");
          eff=rst.getString("effectifEts");
          hor=rst.getString("horaireEts");
          aff=rst.getString("siret");
     
          }
            } catch(Exception se) {
                System.out.println("erreur commise est: "+se);
            }
     
       Object[][] données = { { "Dénomination", denoEts },
                              { "Siège sociale",siege},
                               { "Adresse", adr1 },
                               { "", adr2 },
                               { "Code Postale", cp },
                               { "Ville", ville },
                               { "Numéro SIREN", siren },
                               { "Code NAF(APE)", naf },
                               { "Activité", act },
                               { "Convention Collective", conv },
                               { "Effectif", eff },
                               { "Horaire", hor },
                               { "Siret",aff } };
        return données;
          }
     
    //Donne le contenu de la JComboBox
    private DefaultComboBoxModel contenuJComboBox(String nomClt){
     
      DefaultComboBoxModel model=new DefaultComboBoxModel();
             try {
            ResultSet rst=BD.Ets(nomClt);
            while(rst.next())
               {
                model.addElement(rst.getString("denominationEts"));
                }
         }catch(Exception se) {
                System.out.println("erreur commise est: "+se);
            }
            return model;
    }
    est-ce que le code est plus compréhensible (c'est bien ça le model et la vue, ou pas du tout!)

    Par contre, ça ne marche toujours pas: il y a bien les informations concernant l'établissement 1(sélectionné par défaut), mais rien ne se passe quand je sélectionne un autre établissement

    merci de votre aide
    claire

  7. #7
    Membre éprouvé
    Profil pro
    Devops
    Inscrit en
    Août 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Devops

    Informations forums :
    Inscription : Août 2006
    Messages : 107
    Par défaut Correction d'un bete bug de copier/coller
    Je vais te montrer comment je vois la chose :

    Partons du modèle. Il s'agit d'une liste d'etablissement. Donc je vais avoir un ArrayList etablissements qui contient des objets de ce type:

    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
    /**
     * Define an etablissement.
     */
    public class Etablissement
    {
    	
    	// Attributs
    	private String denominationEts = "";
    	private String siegeSocial = "";
    	private String adr1Ets = "";
    	private String adr2Ets = "";
    	private String cpEts = "";
    	private String villeEts = "";
    	private String sirenEts = "";
    	private String nafEts = "";
    	private String activiteEts = "";
    	private String conventionEts = "";
    	private String effectifEts = "";
    	private String horaireEts = "";
    	private String siret = "";
    	
    	// Accessors
    	// La série de getter et de setter qui vont bien
    	
    	/**
    	 * Default constructor.
    	 */ 
    	public Etablissement()
    	{
    	}
    
    	/**
    	 * Constructor from a result set.
    	 * @throws SQLException 
    	 */
    	public Etablissement(ResultSet rst) throws SQLException
    	{
    		denominationEts = rst.getString("denominationEts");
    		siegeSocial = rst.getString("siegeSocial");
    		adr1Ets = rst.getString("adr1Ets");
    		adr2Ets = rst.getString("adr2Ets");
    		cpEts = rst.getString("cpEts");
    		villeEts = rst.getString("villeEts");
    		sirenEts = rst.getString("sirenEts");
    		nafEts = rst.getString("nafEts");
    		activiteEts = rst.getString("activiteEts");
    		conventionEts = rst.getString("conventionEts");
    		effectifEts = rst.getString("effectifEts");
    		horaireEts = rst.getString("horaireEts");
    		siret = rst.getString("siret");
    	}
    
    }
    Comment je vais faire pour ajouter un etablissement ? Simplement en le contruisant (appel d'un des contructeurs) puis ajout dans la liste par simple appel a la fonction add.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
    Etablissement monNouvelEtablissement = new Etablissement();
    etablissements.add(monNouvelEtablissement);
    ...
    Ce qui va t'etre utile pour definit un etablissement par defaut a l'initialisation du programme.
    Note : tu vois donc ici une partie du controleur.

    Maintenant, il y a une partie graphique au programme. Cette GUI va observer un modèle (la liste des établissements) et la représenter graphiquement par une JTable et par un JComboBox. Le gros de la compréhension (qui ta amené ici) est que la vue "observe" aussi les changements du modèle (ajout/retrait d'un etablissement ou modification d'un etablissement). Du coup, si tu arrives a ce type de structure de code, le simple ajout d'un etablissement sera répercuté automatiquement par la vue et mettra ta JTable a jour !

    Ce qu'il faudrai faire maintenant, c'est regarder comment marche la JTable. Tu trouveras qu'elle a besoin d'un TableModel (tiens, tiens, ...) et que tu peux très facilement etendre un DefaultTableModel qui au lieu d'etre structuré par un tableau Object[][] que tu recrée par toi-même dans le fonction contenuTableau(...) par ton ArrayList des etablissements...

    Tu suis ou tu ressemble a ça : ?

  8. #8
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 203
    Par défaut

    C'est effectivement la tête que je fais, mais si j'arrive à bien comprendre ce que tu dis, ce sera plus simple après.

    je vais étudier tout ce que tu viens de dire
    en tous les cas merci beaucoup de ta patience

    A tout à l'heure
    claire

  9. #9
    Membre éprouvé
    Profil pro
    Devops
    Inscrit en
    Août 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Devops

    Informations forums :
    Inscription : Août 2006
    Messages : 107
    Par défaut
    Citation Envoyé par claire13 Voir le message

    C'est effectivement la tête que je fais, mais si j'arrive à bien comprendre ce que tu dis, ce sera plus simple après.
    Voila, si tu arrives a comprendre ça, toute la suite du développement sera facilité et tu pourras coder plein de truc de la même façon ! Je comprends que cela soit chaud (je suis passé par la aussi ) et que l'on a l'impression de perdre notre temps a coder des choses inutiles mais en fait non... Tout est logique et optimum. C'est une couche d'abstraction du code a avoir, c'est tout. Et comme dirais mon ancien prof de physique :

    On apprend pas, on s'habitue
    Alors bon courage !

Discussions similaires

  1. Probleme avec le Renderer d'une JTable
    Par Mike888 dans le forum Composants
    Réponses: 6
    Dernier message: 12/05/2007, 17h50
  2. probleme avec des calculs et une requete de mise a jour
    Par el_quincho dans le forum Access
    Réponses: 2
    Dernier message: 16/03/2006, 11h06
  3. probleme avec l'affichage d'une de mes variables
    Par somatino dans le forum Langage
    Réponses: 12
    Dernier message: 02/03/2006, 16h39
  4. Réponses: 3
    Dernier message: 22/11/2005, 21h42
  5. Réponses: 2
    Dernier message: 10/10/2005, 03h25

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