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 Jtable


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 17
    Par défaut Probleme avec Jtable
    Bonjour,

    Lorsque j'affiche mon Jtable dans mon application java a partir de ma base de données Access ça marche bien par contre lorsque une ligne est ajoutée automatiquement je vois ça directement dans Jtable mais une fois je clique sur Jtable avec la souris dans mon application la ligne disparaît donc je serai obligé a chaque fois de fermer mon application et de l'ouvrir de nouveau pour que la ligne soit afficher une fois pour toute.


    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
    public void List_DataBase(){
     
     
    		ResultSet rs;
    		final Vector<String> nomColonnes = new Vector<String>();
    		final Vector<Vector<Object>> donnees = new Vector<Vector<Object>>();
     
    		try{
    			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    	        Connection con = DriverManager.getConnection("jdbc:odbc:test");
     
    	        Statement st = con.createStatement();
     
    			rs= st.executeQuery("Select Authentication.Time, Authentication.Result, Employee.First_Name, Employee.Last_NAME from Employee  "
    					+ "INNER JOIN Authentication ON Employee.UserID=Authentication.UserID Order By Authentication.Time DESC");
     
    	     //   rs= st.executeQuery("Select Employee.First_Name, Employee.Last_NAME from Employee");
    		   //     rs= st.executeQuery("Select *from Authentication");
     
     
    			ResultSetMetaData md = rs.getMetaData();  // Recuperer les meta données
    			int nbrColonnes = md.getColumnCount();   // le nombre de colonnes
    			for (int i = 1; i <= nbrColonnes; i++) {     /// Remplir le titre de colonnes 
    				nomColonnes.addElement( md.getColumnName(i) );
    			}
     
     
    			while (rs.next()) {    // Boucle pour remplir la Jtable
    				Vector<Object> row = new Vector<Object>(nbrColonnes);    
    				for (int i = 1; i <= nbrColonnes; i++) {
     
    				row.addElement( rs.getObject(i) );		
     
    				}
    				donnees.addElement( row );
     
    			}
    		}
    		catch(Exception e){
    			System.out.println(" =="+e.getMessage());
    			System.out.println(" =="+e.getCause());
    		}
    		JTable table =new JTable();
    		DefaultTableModel model = new DefaultTableModel(donnees, nomColonnes);
    	    table.setModel(model);
     
     
    		JScrollPane scrollPane = new JScrollPane(table);
          	scrollPane.setBounds(12, 503, 761, 168);
    		getContentPane().add(scrollPane);
    		}

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    On ne voit que le code de création et remplissage initial de la JTable, mais pas celui où tu gères le clic sur la JTable dont tu parles, ni comment tu ajoutes ta ligne dans la JTable et l'ajout correspondant dans la table de la base de données.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    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 averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 17
    Par défaut
    la ligne s'ajoute automatiquement a chaque fois que j'appel la méthode ci dessus. il s'agit d'une application d'authentification (par la pomme de la main) en utilisant un capteur. donc a chaque fois que le capteur capte une personne il va enregistrer directement dans la Base de données la date le nom et prénom de la personne en même temps il va l'afficher avec Jtable dans mon application en appelant a chaque authentification la méthode ci dessus. pour le moment j'ai réglé mon problème en ajoutant a la fin de la méthode:

    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
    table.addMouseListener(new MouseListener() {
     
    			public void mouseEntered(MouseEvent e) {
    				List_DataBase();
    			}
     
    		public void mouseClicked(MouseEvent e) {
    		List_DataBase();
    		}
    		public void mousePressed(MouseEvent e) {
    			List_DataBase();
    		}
    		public void mouseReleased(MouseEvent e) {
    			List_DataBase();
    		}
     
    		public void mouseExited(MouseEvent e) {
    			List_DataBase();
    		}
     
    	});
    Mais normalement il y a d'autre solution plus fiable.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    En résumé, ta méthode List_DataBase effectue une requête, mets le résultat dans un modèle de JTable, créé une JTable et la place dans le content pane d'une fenêtre (JFrame).

    Ensuite, tu enregistres un écouteur d'évenements de souris qui va appeler cette méthode (donc faire tout ça) à chaque fois que :

    • la souris entre dans la zone de la JTable (mouseEntered)
    • la souris sort de la zone de la JTable (mouseExited)
    • qu'on appuie sur n'importe quel bouton (mousePressed)
    • qu'on relâche n'importe quel bouton (mouseReleased)
    • qu'on clique avec n'importe quel bouton (mouseClicked)

    Déjà, comme un clic, c'est appuyer le bouton, puis le relâcher, à chaque clic, on va recharger et recréer la JTable trois fois, en plus des deux qui vont arriver lorsqu'on va déplacer la souris pour survoler la JTable, puis au moment d'en resortir pour faire autre chose. Ça fait beaucoup quand même...

    Déjà, si je comprends bien, un enregistrement est ajouté à la table dans la base de données à chaque fois qu'un capteur détecte quelque chose. Est-ce que cet ajout est effectué par la même application que celle qui affiche la table ?

    Si oui, alors la méthode qui fait ça peut très bien rafraîchir la JTable. Ensuite, si recréer une JTable est la façon la plus simple de la recréer, on pourrait déjà au moins juste rafraichir le modèle, voire optimiser en rechargeant que la nouvelle ligne, voire même l'ajouter d'une part dans la base, et d'autre part dans la JTable. Si tu as deux applications, c'est plus complexe. Il existe des moyens sur certaines bases de données de faire des notifications (Je ne sais pas si Access le fait), mais le plus simple est de faire du polling : à intervalle régulier, tu rafraichis la JTable, avec un Timer. En faisant une requête adéquate (soit en cherchant les id supérieurs à l'id max déjà chargé, soit en utilisant les mots clefs SQL spécifiques à ton SGBD pour charger à partir d'une certaine ligne (pagination), si Access le permet.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    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 averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 17
    Par défaut
    Oui c'est ça a chaque fois qu'une personne mets la main sur le capteur il va l'identifier et l’enregistrer dans la base et en même temps il va l'afficher avec Jtable (tout ça se fait par la même application).

    A chaque fois il ajoute la nouvelle personne je la vois et il l'affiche dans Jtable mais une fois je clique sur n'importe quelle colonne ou champs ou je descends on utilisant scrollpane la nouvelle ligne s'en va et je ne peux la retrouver sauf si je ferme l'application et je l'ouvre une autre fois.

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Ok. Donc ton écouteur de souris ne sert à rien. Tu pourrais directement ajouter la ligne à la JTable à la détection, au même moment que tu ajoutes dans la base. Mais, tel que c'est actuellement, ce n'est pas normal que la nouvelle ligne disparaisse après clic sur la JTable. A moins que le problème vienne du layout. Parce qu'il y a un autre problème que je n'avais pas vu dans ta méthode List_database() : chaque nouvelle JTable est ajoutée, mais les autres sont toujours présentes. Si le layout manager est celui par défaut, il y aura plusieurs composants qui stagneront dans le content pane, mais non géré par le layout manager.
    Ajoute un getContentePane().removeAll(); avant la ligne getContentPane().add(scrollPane);, ou alors ne change que le modèle à chaque fois : u gardes une référence sur la JTable la première fois et les autres, tu ne changes que le modèle. 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
    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
    public class MyJFrame extends JFrame {
     
    private JTable table;
     
    public void List_DataBase(){
     
     
    		ResultSet rs;
    		final Vector<String> nomColonnes = new Vector<String>();
    		final Vector<Vector<Object>> donnees = new Vector<Vector<Object>>();
     
    		try{
    			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    	        Connection con = DriverManager.getConnection("jdbc:odbc:test");
     
    	        Statement st = con.createStatement();
     
    			rs= st.executeQuery("Select Authentication.Time, Authentication.Result, Employee.First_Name, Employee.Last_NAME from Employee  "
    					+ "INNER JOIN Authentication ON Employee.UserID=Authentication.UserID Order By Authentication.Time DESC");
     
    	     //   rs= st.executeQuery("Select Employee.First_Name, Employee.Last_NAME from Employee");
    		   //     rs= st.executeQuery("Select *from Authentication");
     
     
    			ResultSetMetaData md = rs.getMetaData();  // Recuperer les meta données
    			int nbrColonnes = md.getColumnCount();   // le nombre de colonnes
    			for (int i = 1; i <= nbrColonnes; i++) {     /// Remplir le titre de colonnes 
    				nomColonnes.addElement( md.getColumnName(i) );
    			}
     
     
    			while (rs.next()) {    // Boucle pour remplir la Jtable
    				Vector<Object> row = new Vector<Object>(nbrColonnes);    
    				for (int i = 1; i <= nbrColonnes; i++) {
     
    				row.addElement( rs.getObject(i) );		
     
    				}
    				donnees.addElement( row );
     
    			}
    		}
    		catch(Exception e){
    			System.out.println(" =="+e.getMessage());
    			System.out.println(" =="+e.getCause());
    		}
    		DefaultTableModel model = new DefaultTableModel(donnees, nomColonnes);
     
     
                   if ( table=null ) { // la première fois, on créé la JTable, après on utilisera le même composant
     
    		table =new JTable();
    		JScrollPane scrollPane = new JScrollPane(table);
          	scrollPane.setBounds(12, 503, 761, 168);
    		getContentPane().add(scrollPane);
     
                  }
     
    	    table.setModel(model);
     
     
    }
     
    }
    Par ailleurs, montre ton code qui ajoute dans la base.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    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.

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

Discussions similaires

  1. probleme avec jtable et scroll
    Par mrirrou dans le forum Composants
    Réponses: 4
    Dernier message: 02/05/2008, 10h31
  2. probleme avec JTable
    Par moon5 dans le forum Composants
    Réponses: 1
    Dernier message: 20/08/2007, 17h12
  3. probleme avec jTable!
    Par moon5 dans le forum Composants
    Réponses: 1
    Dernier message: 20/08/2007, 10h41
  4. Probleme avec JTable
    Par yann999 dans le forum Composants
    Réponses: 1
    Dernier message: 12/09/2006, 14h47
  5. Probleme avec JTable
    Par Janitrix dans le forum Composants
    Réponses: 4
    Dernier message: 04/04/2006, 18h10

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