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 :

[Débutant] Jtable et TableModel


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Inscrit en
    Décembre 2006
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 2
    Par défaut [Débutant] Jtable et TableModel
    Bonjour,

    Je rencontre quelques difficultés à comprendre le fonctionnement des Jtables et des modèles associés permettant de gérer l'affichage de données. Je suis à la recherche d'un tutorial ou d'aide me permettant de comprendre et de trouver une gestion efficace de ma Jtable.

    Tout d'abord une explication de ce que je souhaite faire :

    Je requête actuellement une base de données HSQL et souhaite afficher les données retournées à l'aide d'un resultset par ma fonction de requêtage dans une Jtable.

    Pour cela j'ai compris qu'il fallait que j'utilise un TableModel qui me permettrait de définir les tableaux de string et d'objet nécessaire à l'affichage des données mais aussi à la bonne initialisation des renderers (c'est juste ?)( case à cocher si boolean, Jlabel si string ...)

    En fouinant sur google, j'ai pu trouver un ensemble d'exemple utilisant tous des classes différentes pour étendre ou implémenter leur classe modèle : DefaultTableModel, AbstractTableModel, TableModel . J'avoue ne pas bien comprendre la différence entre l'utilisation de ces classes et interfaces. La première sert à la définition d'un tablemodel par défaut, la second a définir un modèle abstrait ... mais cela ne m'avance pas pour savoir laquelle je dois utiliser et comment ...

    Ensuite et c'est particulièrement là ou je butte, je souhaite surtout gérer l'affichage des headers de mes colonnes : par exemple si je fais une requête select ID, NOM, PRENOM from ETUDIANT; je souhaite spécifier que la colonne ID soit invisible (widht=0) mais toujours présente car elle sera utilisée pour générer de nouvelles requêtes en fonction des actions utilisateurs, que le label de la colonne nom soit "Nom de l'étudiant" et que la largeur soit égal à 100 et qu'elle soit située après la colonne prénom par exemple ....
    Pour cela je pense récupérer l'entête de la colonne retourné par le resultset et à l'aide de "case" définir les propriétés de chaque colonne.

    Cependant les tableModel ne me permettent pas de jouer directement sur les headers des Jtable puisqu'ils ne définissent que des tableaux de string et d'objet.

    Aussi pour cela j'ai vu qu'il était possible de définir des modèles d'header que l'on passe en paramètre au constructeur de la Jtable. Mais je ne sais comment l'implémenter pour faire ce que je souhaite.

    A force de chercher je commence à m'embrouiller et ne plus voir ce que je dois faire, aussi si quelqu'un pouvait éclairer ma lanterne et me montrer la bonne direction...

  2. #2
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    La gestion manuelle des header se fait via la méthode "getColumnName(int c)" de TableModel. Dans ta classe héritée ( ou implémentant ) TableModel et ses dérivés, tu peux controler toi-même ces header ( les afficher ou non ) en fonction de l'état de ton GUI.
    Sache qu'il existe JXTable qui ne fait pas partie du JDK mais qui contient beaucoup plus de méthodes comme le fait de cacher des choses, trier etc. Je t'invite à faire une recherche sur cette API.

  3. #3
    Membre émérite Avatar de Pollux
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    706
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 706
    Par défaut
    Sinon pour un tutorial:

    http://java.sun.com/docs/books/tutor...nts/table.html

    Et va surement t'aider aussi comme la faq et les tutoriaux qui sont sur developpez.com

  4. #4
    Nouveau candidat au Club
    Inscrit en
    Décembre 2006
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 2
    Par défaut
    Bonjour,


    Merci Polux, je connaissais déjà ce tutoriel complet mais qui ne m'a pas permis de résoudre mon problème.

    Aujourd'hui je teste le JXTable proposé par iohack qui a déjà répondu à 80% de mes attentes mais j'ai encore une erreur.

    Notamment pour cacher ma colonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     adhTable.getColumnExt("IDENTIFIANT").setVisible(false);
    ou
    adhTable.getColumnExt(0).setVisible(false);
    me génère un NullPointerException alors que la colonne existe et est affichée si je commente la ligne. avec le bon nom de la colonne.

    Voici comment je créé mon TableModel :

    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
    public class TableModel extends AbstractTableModel {
     
         protected String[] columnNames = {};
         protected int columnCount = 0;
         protected Class[] columnClasses = {}; /* Type des données contenues dans la colonne */
         protected List<Object[]> rowValues = new ArrayList<Object[]>(); /* Liste de de chaque ligne de valeur */
         protected ResultSetMetaData metaData;
         protected boolean editable = false;
         private ErrorDialog _errorMsg;
         private String stmp;
     
        /**
         * Creates a new instance of TableModel
         */
        public TableModel(ResultSet rs)  {
        /* Initialisation du dialogue d'erreur */
        _errorMsg = new ErrorDialog();
            try {
                updateModel(rs);
            } catch (SQLException ex) {
               _errorMsg.WriteMessage("Exception TableModel",ex.getStackTrace().toString(),_errorMsg.ErrorMessage);
               return;
            }
        }
     
     
      /**
         * modifie ce  TableModel pour qu'il corresponde à un
         * ResultSet donné.
         */
      public void updateModel(ResultSet rs) throws SQLException {
        // récpération de l'information sur les données 
        metaData = rs.getMetaData();
        columnCount = metaData.getColumnCount();
     
        // allocation des tableaux pour stocker les noms des colonnes
        // et le type (classes) des colonnes
        columnNames = new String[columnCount];
        columnClasses = new Class[columnCount];
     
        for (int i = 1; i <= columnCount;  i++) {
     
            stmp = metaData.getColumnName(i);     
            columnNames[i-1] = stmp; 
     
          try {
    	columnClasses[i-1] = Class.forName(metaData.getColumnClassName(i));
          }
          catch (ClassNotFoundException clnfe) {
            // normalement ce type d'exception ne devrait jamais être lancé
    	_errorMsg.WriteMessage("Exception TableModel",clnfe.getStackTrace().toString(),_errorMsg.ErrorMessage);
            return;
          }
        }
     
        // chargement des données dans la liste rowValues
        // initialisation de la liste des lignes avec une liste vide
        rowValues = new ArrayList<Object[]>();
     
        // récuperation de chacune des lignes du ResultSet 
        while (rs.next()) {
          //création d'un tableau d'objets pour récupérer les données d'une ligne
          Object[] values = new Object[columnCount];
          // recopie des valeurs de la ligne dans le tableau
          for (int i = 1; i <= columnCount; i++)
    	values[i-1] = rs.getObject(i);
          // ajout du tableau à la liste des lignes
          rowValues.add(values);
        }
     
        // signale au Listener de ce TableModel qu'une nouvelle table a
        // été constituée
       fireTableStructureChanged();
      }
    Je poursuit mes recherches en compléments de ce thread.

    Merci

Discussions similaires

  1. jTable et TableModel
    Par nutix2003 dans le forum NetBeans
    Réponses: 4
    Dernier message: 12/10/2006, 14h39
  2. [Débutant] JTable non editable+DocumentListener
    Par nicotine002 dans le forum Composants
    Réponses: 9
    Dernier message: 04/01/2006, 00h48
  3. [Débutant] [JTable] affichage d'un vecteur
    Par neXistPa dans le forum Composants
    Réponses: 12
    Dernier message: 08/12/2005, 16h11
  4. [Débutant][JTable] Comment ça marche?
    Par Nasky dans le forum Composants
    Réponses: 7
    Dernier message: 02/08/2005, 15h04
  5. [débutant] JTable + selection
    Par pingoui dans le forum Composants
    Réponses: 2
    Dernier message: 21/09/2004, 10h49

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