Jtable AbstractTableModel bug dans onglet toutes les JTables se mettent à jour

aforpien Messages postés 118 Date d'inscription lundi 6 novembre 2000 Statut Membre Dernière intervention 12 mai 2010 - 8 févr. 2010 à 20:04
aforpien Messages postés 118 Date d'inscription lundi 6 novembre 2000 Statut Membre Dernière intervention 12 mai 2010 - 9 févr. 2010 à 20:31
Bonsoir à tous,

Je suis confronté à un problème lors de la génération de model pour jTable.
J'utilise une classe trouvée sur un site, permettant de remplir un jtable avec des informations en
provenance d'une base de données MySQL. Cette classer fait appel à une seconde classe pour effectuer la connexion,
je joindrai les deux classes en bas de messages.

J'ai donc crée un petit programme qui a pour but d'afficher des données de tables dans des Jtables, et ce dans
un JtabbedPane dans lequel je crée des onglets.
Admettons mon JtabbedPane1 et deux panel,panelusers et paneldonnées. Il n'y a pas de soucis pour appliquer le modèle
de table à la JTable, celle-ci est bien alimentée par les informations de la base.

Le problème est que lorsque j'ouvre un second onglet et que je demande le remplissage de la seconde table, en créant
un nouveau objet pour le modèle, ma première table (dans le premier onglet) ce retrouve elle aussi modifiée.
Mais pas les entete de colonnes, uniquement les lignes...curieux !
En attendant de solutionner ce problème je réapplique le modèle dès que le panel est a nouveau visible (donc quand l'utilisateur
est sur l'onglet) mais bon cela fais perdre un peu de temps et ce n'est pas très propre.

Je pense qu'il y a un problème avec le modèle utilisé, mais pourtant je l'instancie à chaque fois, mes jTables sont
bien deux jTables différentes dans deux panel différents, le seul point commun étant le jTabbedPane.
Avez-vous un peu d'infos à m'apporter ?
Ci-joint le code du module TMFROMMYSQL extends AbstractTableModel pour générer le modèle, SQLExecuteQuery pour
aller récupérer les infos dans la base, et le code appelé sur chacun de mes panels :

Dans le panel 1 : String pilote = "com.mysql.jdbc.Driver";
String host = "jdbc:mysql://localhost:3306/saphirdms";
String login = "root";
String pw = "password";
TModele = new TMFromMysql(pilote,host,login,pw,"select nom,prenom,user_login from users order by nom");
jTableusers.setModel(TModele);

Et le second :

String pilote = "com.mysql.jdbc.Driver";
String host = "jdbc:mysql://localhost:3306/saphirdms";
String login = "root";
String pw = "password";


TMod = new TMFromMysql(pilote,host,login,pw,"select alias_connexion,adresseip,instance from tnsnames order by alias_connexion");
jTableconnexions.setModel(TMod);

C'est vraiment identique, sauf que j'ai changé le nom de l'objet (TModele et TMod), pensant peut-etre que d'instancier
deux fois avec le même nom pauserai problème....
Voici mes deux classes :

TFromMySQL :

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package saphirdms;

/**
*
* @author polo
*/

import java.sql.*;
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import javax.sql.*;
import java.lang.*;
import javax.swing.text.*;
/**
*
* @author polo
*/
class TMFromMysql extends AbstractTableModel {

static SQLExecuteQuery connexion;


public TMFromMysql(String pilote,String host,String login,String pw,String query){
connexion = new SQLExecuteQuery(pilote,host,login,pw);
connexion.setQuery(query);

}

public String diconnect(){
connexion.disconnect();
String s = "";
return s;
}

public int getColumnCount(){
int i = 0;
try {
i = connexion.getResultSet().getMetaData().getColumnCount();
}
catch(SQLException e){
System.out.println(e);
}
return i;
}

public int getRowCount(){
int i = 0;
try {
ResultSet rs = connexion.getResultSet();
rs.last();
i = rs.getRow();
}
catch(SQLException e){
System.out.println(e);
}
return i;
}

public String getColumnName(int c){
String s = "";
try {
s = connexion.getResultSet().getMetaData().getColumnName(c + 1);
}
catch(SQLException e){
System.out.println(e);
}
System.out.println(s);
return s;
}

public Object getValueAt(int row,int column){
Object o = "";
try {
ResultSet rs = connexion.getResultSet();
rs.absolute(row + 1);
o = rs.getObject(column + 1);

}
catch(SQLException e){
System.out.println(e);
}
return o;
}

private static Object[][] data;
private static Object[] colname;

}

SQLExecuteQuery :

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package saphirdms;

/**
*
* @author polo
*/

import java.sql.*;
import org.gjt.mm.mysql.Driver;

public class SQLExecuteQuery {

private static Statement stmt;
private static Connection conn;
private static String query,host,login,pw,pilote;
private static Object a_obj[];
private static Object obj;
private static ResultSet rs;
private static String erreur;
private static String resultat;

public SQLExecuteQuery(String pilote,String host,String login,String pw){
this.pilote = pilote;
this.host = host;
this.login = login;
this.pw = pw;
this.query = query;
Connect();
}

private static void Connect(){
try
{
Class.forName(pilote).newInstance();
conn = DriverManager.getConnection(host,login,pw);
int type = ResultSet.TYPE_SCROLL_INSENSITIVE;
int mode = ResultSet.CONCUR_UPDATABLE;
stmt = conn.createStatement(type,mode);
}
catch ( SQLException E)
{
System.out.println("SQLException: " + E.getMessage());
System.out.println("SQLState: " + E.getSQLState());
System.out.println("VendorError: " + E.getErrorCode());
}
catch ( ClassNotFoundException E)
{
E.printStackTrace();
}
catch ( InstantiationException E)
{
System.out.println(E);
}
catch ( IllegalAccessException E)
{
System.out.println(E);
}
catch ( NullPointerException E)
{
System.out.println(E);
}
}

public static void disconnect(){
try {
conn.close();
}
catch (SQLException E){
//System.out.println("SQLException: " + E.getMessage());
//System.out.println("SQLState: " + E.getSQLState());
//System.out.println("VendorError: " + E.getErrorCode());
erreur = E.getMessage() + " " + E.getSQLState() + " " + E.getErrorCode();
}
}

public static void setQuery(String query){
try {
erreur = null;
rs = stmt.executeQuery(query);
}
catch (SQLException E){
//System.out.println("SQLException: " + E.getMessage());
//System.out.println("SQLState: " + E.getSQLState());
//System.out.println("VendorError: " + E.getErrorCode());
erreur = E.getMessage() + " " + E.getSQLState() + " " + E.getErrorCode();
}
}

public static ResultSet getResultSet(){
return rs;
}

public static String get_erreur(){
return erreur;
}



}

Merci par avance pour votre aide

2 réponses

aforpien Messages postés 118 Date d'inscription lundi 6 novembre 2000 Statut Membre Dernière intervention 12 mai 2010
8 févr. 2010 à 21:35
Je précise que je travaille sous Netbeans, mon JtabbedPane est dessiné sur une forme, et je lui fait des addpane pour lui ajouter des panels (de classes différentes). J'ajoute les panel sous forme d'onglet dans le jTabbedPane en cliquant sur un bouton. Chaque panel contient une jTable.
Quand je change le model d'une table et que je reviens sur les autres onglets, précédents ou suivants, les jtables ont conservées leur entetes mais contiennent les données récupérées par le dernier modèle...
0
aforpien Messages postés 118 Date d'inscription lundi 6 novembre 2000 Statut Membre Dernière intervention 12 mai 2010
9 févr. 2010 à 20:31
Je pense vraiment avoir trouvé d'où vient l'erreur : Le resultset est effacer à chaque fois que je lance une nouvelle requete. Cependant, faut-il laisser le resultset ouvert, afin que le Abstract Model de la jTable puisse y acceder en permanence ?
Ou bien faut-il que je ferme le resultset, afin que le modele de la table soit "enregistré ?" ?
J'avoue ne pas trop maitriser ces objet (Jtable et Abstract Model) pourtant j'ai bien lu les tuto, je les ai appliqué...Mais là je cale...
Faut-il qu'un modele de table Abstract modele accède en permance à un resultset ?
Merci
0
Rejoignez-nous