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

JDBC Java Discussion :

Problème de recharge d'une JTable avec le résultat d'une requête sql


Sujet :

JDBC Java

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut Problème de recharge d'une JTable avec le résultat d'une requête sql
    Bonjour,

    j'ai écrit un programme qui devrait me permettre d'afficher dans une JTable le résultat d'une requête sql.
    Avant d'écrire mon programme avec une requête sql, je l'ai testé avec des données fixées.
    C'est le programme suivant qui fonctionne :
    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
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.table.AbstractTableModel;
     
    import java.util.List;
    import java.util.ArrayList;
    import java.util.Random;
     
    public class Divers extends AbstractTableModel{
    	private static final long serialVersionUID = 1L;
     
    	String[] colonnes = {"Nom", "Prenom", "Age"};
    	//la liste du contenu du tableau 
    	private List<Object[]> allLignes = new ArrayList<Object[]>();
     
    	public Divers(){}
     
    	//constructeur avec la liste
    	public Divers(List<Object[]> allLignes){
    		//test si la liste est vide rajouter une ligne vide
    		if (allLignes == null || allLignes.size()<1){
    			allLignes.add(new Object[colonnes.length]);
    		}
    		this.allLignes = allLignes;
    	}
     
    	/* retourne le nombre d'element de la colonne */
    	public int getColumnCount() {
    		return colonnes.length;
    	}
     
    	/* retourne le nombre de lignes */
    	public int getRowCount() {
    		return allLignes.size();
    	}
     
    	/* retourne le nom de la colonne */
    	public String getColumnName(int col) {
    		return colonnes[col];	
    	}
     
    	/* retourne la valeur à la ligne row et colonne col */
    	public Object getValueAt(int row, int col) {
    		return allLignes.get(row)[col];
    	}
     
    	public Class<?> getColumnClass(int c) {
    		return getValueAt(0, c).getClass();
    	}
     
    	/* definie les cellules éditables ou non */
    	public boolean isCellEditable(int row, int col) {
    			return false;
    	}
     
    	/* permet de modifier l'element en placant value a la ligne row 
    	colonne col */
    	public void setValueAt(Object value, int row, int col) {
    		allLignes.get(row)[col] = value;
    		fireTableCellUpdated(row, col); // on signal un changement
    	}
     
    	//Rempli le tableau
    	public void remplie(List<Object[]> lignes){
    		allLignes = lignes;
    		//On signale le changement des données aux listeners :
    		fireTableDataChanged();
    	}
     
    	//Vide la table
    	public void vide(){
    		allLignes.removeAll(allLignes);
    		fireTableRowsDeleted(0,getRowCount());
    	}	
     
    	public static void main(String [] args){
    		Divers maTable = new Divers();		
    		JTable jTable = new JTable(maTable);		
    		List<Object[]> donnees = new ArrayList<Object[]>();
    		Object [][] data = {
    				{"Cardin","Pierre",50},
    				{"Lopez", "Hector", 47},
    				{"Laurent", "Robert", 29},
    				{"Cardetti","Martin",30},
    				{"Angel", "Marcos", 47}
    		};
    		JFrame frame = new JFrame("Divers");
    		JScrollPane scroll = new JScrollPane(jTable);
    		frame.setSize(300,200);
    		frame.add(scroll);
    		frame.setVisible(true);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		Random r = new Random();
    		while(true){		
    			maTable.vide();
    			int n = r.nextInt(5);
    			System.out.println(n +" ");
    			for(int i=0; i<n; i++){
    				Object [] val = new Object[3];
    				for(int j=0; j<3; j++)
    					val [j]= data[i][j];
    				donnees.add(val);
    			}
    			((Divers)jTable.getModel()).remplie(donnees);	
    			for(Object [] o : donnees){
    				for(Object obj : o)
    					System.out.print(obj + " ");
    			System.out.println("");
    			}
    			try {
    				Thread.sleep(2000);
    			}catch(InterruptedException ie){}
    		}
    	}
    }
    Comme il fonctionnait, je l'ai modifié pour qu'il focntionne avec le résultat d'une requête sql.
    Le soucis, c'est que ça ne fonctionne pas. Lorsque de nouvelles données arrivent, elles ne sont pas prises en compte dans la JTable.
    Le probleme provient de tout ce qui est dans le try{}catch mais je n'arrive pas à savoir pourquoi.
    Voici le code avec la connexion à une base 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
    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
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.table.AbstractTableModel;
     
    import sun.jdbc.odbc.JdbcOdbcDriver;
     
    import java.sql.Connection;
    import java.sql.Driver;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.Statement;
    import java.util.List;
    import java.util.ArrayList;
     
    public class Divers2 extends AbstractTableModel{
    	private static final long serialVersionUID = 1L;
     
    	String[] colonnes = {"Nom", "Prenom", "Age"};
    	//la liste du contenu du tableau 
    	private List<Object[]> allLignes = new ArrayList<Object[]>();
     
    	public Divers2(){}
     
    	//constructeur avec la liste
    	public Divers2(List<Object[]> allLignes){
    		//test si la liste est vide rajouter une ligne vide
    		if (allLignes == null || allLignes.size()<1){
    			allLignes.add(new Object[colonnes.length]);
    		}
    		this.allLignes = allLignes;
    	}
     
    	/* retourne le nombre d'element de la colonne */
    	public int getColumnCount() {
    		return colonnes.length;
    	}
     
    	/* retourne le nombre de lignes */
    	public int getRowCount() {
    		return allLignes.size();
    	}
     
    	/* retourne le nom de la colonne */
    	public String getColumnName(int col) {
    		return colonnes[col];	
    	}
     
    	/* retourne la valeur à la ligne row et colonne col */
    	public Object getValueAt(int row, int col) {
    		return allLignes.get(row)[col];
    	}
     
    	public Class<?> getColumnClass(int c) {
    		return getValueAt(0, c).getClass();
    	}
     
    	/* definie les cellules éditables ou non */
    	public boolean isCellEditable(int row, int col) {
    			return false;
    	}
     
    	/* permet de modifier l'element en placant value a la ligne row 
    	colonne col */
    	public void setValueAt(Object value, int row, int col) {
    		allLignes.get(row)[col] = value;
    		fireTableCellUpdated(row, col); // on signal un changement
    	}
     
    	//Rempli le tableau
    	public void remplie(List<Object[]> lignes){
    		allLignes = lignes;
    		//On signale le changement des données aux listeners :
    		fireTableDataChanged();
    	}
     
    	//Vide la table
    	public void vide(){
    		allLignes.removeAll(allLignes);
    		fireTableRowsDeleted(0,getRowCount());
    	}	
     
    	public static void main(String [] args){
    		Divers2 maTable = new Divers2();		
    		JTable jTable = new JTable(maTable);
    		List<Object[]> donnees = new ArrayList<Object[]>();
     
    		//Parametre de connexion a la base de données
    		String url="jdbc:odbc:TABLE";
        String login = "root";
        String password = "root";
        Connection connection = null;
     
        JFrame frame = new JFrame("Divers");
    		JScrollPane scroll = new JScrollPane(jTable);
    		frame.setSize(300,200);
    		frame.add(scroll);
    		frame.setVisible(true);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		try{
    			Driver monDriver = new JdbcOdbcDriver();
    			DriverManager.registerDriver(monDriver);	
    			connection=DriverManager.getConnection(url,login,password);
    			Statement stmt = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
    			String sql = "SELECT * FROM TABLE.PERSONNEL";
    			while(true){		
    				maTable.vide();
    				ResultSet rs = stmt.executeQuery(sql);
    				ResultSetMetaData rsmd = rs.getMetaData();
    				int ncols = rsmd.getColumnCount();
    				//Remise du curseur à sa position initiale
    				rs.beforeFirst();
    				boolean suivant = rs.next();
    				while(suivant){
    					Object val [] = new Object[ncols];
    					for(int j=1; j<=ncols; j++)
    						val[j-1] = rs.getString(j);
    					donnees.add(val);
    					suivant = rs.next();
    				}		
    				((Divers2)jTable.getModel()).remplie(donnees);	
    				//Remise du curseur à sa position initiale
    				rs.beforeFirst();
    				try {
    					Thread.sleep(2000);
    				}catch(InterruptedException ie){}	
    			}
    		}catch(Exception e){}
    	}
    }

  2. #2
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Citation Envoyé par Premium
    Le soucis, c'est que ça ne fonctionne pas. Lorsque de nouvelles données arrivent, elles ne sont pas prises en compte dans la JTable.
    Juste au cas où ... as tu fait un commit après la mise à jour de tes données ?
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/04/2010, 09h32
  2. [MySQL] Construire une liste avec les résultat d'une requête
    Par Requiem11 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/04/2009, 23h18
  3. Réponses: 4
    Dernier message: 12/06/2008, 17h54
  4. Remplir une table avec le résultat d'une instruction SQL
    Par jbeu dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 02/09/2007, 23h49
  5. Recharger une JTable avec le résultat d'une requete sql
    Par Premium dans le forum Composants
    Réponses: 2
    Dernier message: 06/06/2007, 15h19

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