Cacher colonne d une jtable

benohite Messages postés 210 Date d'inscription vendredi 11 avril 2003 Statut Membre Dernière intervention 18 décembre 2003 - 25 juil. 2003 à 15:39
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 - 30 juil. 2003 à 19:39
bonjour,

je represente une base de donnees au moyen d une jtable
j aimerais cache dans la jtable certaine de ces colonnes mais les garder dans le model car j en ais besoin pour effectuer un traitement
en gros je chercher un moyen de rendre invisible plusieurs colonnes d un jtable

merci d avance pour vos reponses

benohite
:big)

6 réponses

CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
29 juil. 2003 à 01:00
Essai, comme dans access pour faire la même chose, de mettre une taille de colonne = zéro.

JTable t;
t.getColumn(id).setWidth(0);


Attention id dépend de ton modèle (modèle de JTable) mais communemment c'est une instance de la classe Integer:

JTable t;
t.getColumn(new Integer(position)).setWidth(0);


Core Breaker :)
benohite Messages postés 210 Date d'inscription vendredi 11 avril 2003 Statut Membre Dernière intervention 18 décembre 2003 7
29 juil. 2003 à 10:11
bonjour;

oui j avais pensé a cette methode mais le probleme est que meme pour une taille de 0 java affiche les barres de sepraration de colonnes on obtient donc deux barres l une a cote de l autre ce qui est assez etrange
je te remercie quand meme pour ton aide

benohite
:big)
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
29 juil. 2003 à 20:40
Je sais commen faire.

Tu dois passer par un modèle de table.
class MyModel extends AbstractTableModel
{
int nbCols= 0;
Vector v= new Vector();

public MyModel(ResultSet rs, int except)
{
int nbCols= rs.getMetaData().getColumnCount();

this.nbCols= nbCols - 1;

while(rs.next())
{
Vector ligne= new Vector();
int j= 0;

for(int i= 0; i < nbCols; i++)
if( i != except )
ligne.addElement(rs.getString(i));

v.addElement(ligne);
}
}

public int getColumnCount() { return nbCols; }
public int getRowCount() { return v.size(); }
public Object getValueAt(int row, int col)
{
return ((Vector)v.elementAt(row)).elementAt(col);
}
}

Ensuite tu dois instancier la jtable:
int colonneARendreInvisible;
ResultSet rs;
JTable t= new JTable(new MyModel(rs, colonneARendreInvisible));

L'avantage de passer par un modèle est que c'est simple à implémenter.

Core Breaker :)
benohite Messages postés 210 Date d'inscription vendredi 11 avril 2003 Statut Membre Dernière intervention 18 décembre 2003 7
30 juil. 2003 à 09:30
bonjour,

tu va me trouver chiant mais tant pis je m en excuse d avance
ton idee est bonne puisqu il suffit de ne pas enregistrer la colonne dans le model pour ne pas l avoir afficher
le probleme (et oui encore et tjrs) est que j ai besoin des colonnes cachees car j utilise par exemple une colonne type qui me donne le type de la donnee de la ligne dans la colonne valeur (valeur seule colonne editable)
je ne peux donc pas me debarasser de cette colonne dans le model meme si elle doit etre invisible dans la jtable

La seule solution a peu pres correcte que j ai trouvé rejoint neanmoins ton idee
je ne garde que deux colonnes dans mon model (celles qui doivent etre visible) et j ajoute un ecouteur de selection perso sur la jtable
A chaque ligne selectionnée j envoi une requete pour recuperer les valeurs des deux colonnes qui me manque et je le enregistre dans un champ du model
Je peux alors effectuer mes test dans la methode setValueAt() du model
le seul inconvenient est que j envoi des requetes en pagailles qui en plus ne me retourneront que qqes donnees
En gros j emet des trames de 1500 octets pour recuperer une valeur de qqes octets seulement et c vrai que question encombrement reseau c pas genial
Une autre idee que je n est pas encore tester serait d avoir deux objets resultset dans mon model, un pour recuperer les donnes visibles ( a afficher) et un autre pour les donnes necessaires au test
Ceci resoudrait en plus le pb d encombrement reseau mais ca veut dire que des qu un model est modifie l autre doit l etre aussi en consequence
Voila ce que j ai pu trouver en me cresant le cerveau

Si toi ou qqn d autre a une idee ou une solution n hesitaient pas et merci encore pour l interet que vous y portaient

benohite
:big)

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
30 juil. 2003 à 19:36
Ok !
Acceéder à la colonne cachée utilise le même principe, il suffit de légèrement modifier le modèle.

class MyModel extends AbstractTableModel
{
int nbCols= 0;
Vector v= new Vector();
Vector cachee= new Vector();

public MyModel(ResultSet rs, int except)
{
int nbCols= rs.getMetaData().getColumnCount();

this.nbCols= nbCols - 1;

while(rs.next())
{
Vector ligne= new Vector();
int j= 0;

for(int i= 0; i < nbCols; i++)
if( i == except )
cachee.addElement(rs.getString(i));
else
ligne.addElement(rs.getString(i));

v.addElement(ligne);
}
}

public String getCache(int row)
{
return cachee.elementAt(row).toString();
}

public void setCachee(int row, String val)
{
cachee.setElementAt(val, row);
}

public int getColumnCount() { return nbCols; }
public int getRowCount() { return v.size(); }
public Object getValueAt(int row, int col)
{
return ((Vector)v.elementAt(row)).elementAt(col);
}
}


Et voilà grâce à ce modèle tu n'affiche pas une colonne cachée mais tu peux la lire et la modifier.

Si tu as plusieurs colonne il suffira de mettre des Vector dans le Vector cachee et d'adapter le getter et le setter d'accès aux colonnes cachées.

Le reste du code (init de la table) est identique.

Ca ressemble à peu près à ce que tu décris mais je l'ai un peu concrétisée. Tout cela pour te prouver que seul mon message précédent aurrait suffit à répondre à ta question.

Core Breaker :)
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
30 juil. 2003 à 19:39
Ok !
Acceéder à la colonne cachée utilise le même principe, il suffit de légèrement modifier le modèle.

class MyModel extends AbstractTableModel
{
int nbCols= 0;
Vector v= new Vector();
Vector cachee= new Vector();

public MyModel(ResultSet rs, int except)
{
int nbCols= rs.getMetaData().getColumnCount();

this.nbCols= nbCols - 1;

while(rs.next())
{
Vector ligne= new Vector();
int j= 0;

for(int i= 0; i < nbCols; i++)
if( i == except )
cachee.addElement(rs.getString(i));
else
ligne.addElement(rs.getString(i));

v.addElement(ligne);
}
}

public String getCache(int row)
{
return cachee.elementAt(row).toString();
}

public void setCachee(int row, String val)
{
cachee.setElementAt(val, row);
}

public int getColumnCount() { return nbCols; }
public int getRowCount() { return v.size(); }
public Object getValueAt(int row, int col)
{
return ((Vector)v.elementAt(row)).elementAt(col);
}
}


Et voilà grâce à ce modèle tu n'affiche pas une colonne cachée mais tu peux la lire et la modifier.

Si tu as plusieurs colonne il suffira de mettre des Vector dans le Vector cachee et d'adapter le getter et le setter d'accès aux colonnes cachées.

Le reste du code (init de la table) est identique.

Ca ressemble à peu près à ce que tu décris mais je l'ai un peu concrétisée. Tout cela pour te prouver que seul mon message précédent aurrait suffit à répondre à ta question.

Core Breaker :)
Rejoignez-nous