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

Java Discussion :

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


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 13
    Par défaut Jtable AbstractTableModel bug dans onglet toutes les JTables se mettent à jour
    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 :
    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
     
    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.
    */
    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
     
    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. #2
    Membre averti
    Inscrit en
    Février 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 13
    Par défaut Plus d'infos
    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...

  3. #3
    Membre averti
    Inscrit en
    Février 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 13
    Par défaut Statement,connexion et resultset
    J'avance ! Visiblement, ce serai du au fait que je ne ferme pas mon statement, mon resultset et ma connexion. J'essai de les fermer dans les class (leurs propres classes) mais du coup la connexion et le statement sont fermés avant que le tableau soit rempli.
    Faut-il que je ferme le statement, la connexion et le resultset depuis les class ? SVP je suis débutant en JAVA, je viens des mondes PHP et VB Dotnet et très franchement ca ne ce ressemble pas lol help pleeeeeease !!!

  4. #4
    Membre averti
    Inscrit en
    Février 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 13
    Par défaut NOuveau
    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

  5. #5
    Membre averti
    Inscrit en
    Février 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 13
    Par défaut C'est bon
    C'est bon, l'erreur venait bien du fait que je ne fermais pas le resultset et que je le réutilisait juste après.
    En fermant le Resultset et la connexion, cela fonctionne très bien.
    Apparement personne ici ne connait bien les jtables et jAbtractModel, donc si vous rencontrez le meme soucis, contactez moi en MP

  6. #6
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 2
    Par défaut meme probleme...
    Pourrais tu me copier ton code final ? je ne vois pas où tu as fermé ton resultset :s help
    Merci beaucoup

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

Discussions similaires

  1. [Débutant] Comment on peut voir sur l'onglet toutes les procedures et fonctions
    Par xingjing910 dans le forum VB.NET
    Réponses: 3
    Dernier message: 04/04/2012, 10h49
  2. Réponses: 2
    Dernier message: 10/11/2011, 12h01
  3. Javascript dans presque toute les page
    Par Vanlen dans le forum ASP.NET
    Réponses: 7
    Dernier message: 15/10/2010, 12h35
  4. Avoir tout les champs entre deux jours
    Par Luffy_San dans le forum SQL
    Réponses: 3
    Dernier message: 05/07/2007, 10h57

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