Ajouter un commentaire

maxlegrand
[Résolu]JTable construite à partir d'une requete 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 :

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.
Je crois que le probleme provient de tout ce qui est dans le try{}catch mais je n'arrive pas à savoir pourquoi.
Toutes les 2 secondes, je relance la requete et s'il y a de nouvelles lignes, la JTable doit les prendre en compte or elle ne se met pas à jour...
Voici le code avec la connexion à une base de données :

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){}
	}
}

Filtered HTML

Plain text

CAPTCHA
Cette question permet de vérifier que vous n'êtes pas un robot spammeur :-)
 PPPP       J      J  N   N   GGG  
P P J J NN N G
PPPP J J N N N G GG
P J J J J N NN G G
P JJJ JJJ N N GGG