Bonjour,
tout d'abord, un petit point sur ce que j'ai réussi à obtenir :
- je suis dans une fenêtre héritant de JDialog implémentant ActionListener, DocumentListener, ItemListener, TableModelListener
- une JTable, comportant un tableau héritant de AbstractTableModel
- cette JTable est dans un JScrollPane
L'utilisateur effectue une recherche parmi une liste d'articles :
- il complète des JTextFields correspondant à différents champs (il peut faire des recherches en appliquant différents "filtres")
- il choisit les colonnes à afficher parmi une liste de champs : ainsi, il peut choisir de n'afficher que la référence et la désignation, ou bien encore le prix en plus, etc...
- il appuie sur "Entrée" ou bien clique sur un bouton "Rechercher"
- la JTable affiche tous les articles correspondants
SAUF QUE c'est ici qu'arrive mon problème... Les en-têtes des colonnes ne se mettent pas à jour. Alors que les données, elles, se mettent à jour...
Je garde les noms de colonnes correspondant à des lettres (A, B, ...)
Un pitit bout de code pour y voir plus clair :
- lors d'un clic sur le bouton rechercher :
- les parties intéressantes de TableArticle :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 modelTabArt = new TableArticle(tableauStringDeuxDimensions, tableauDeCheckBox); // la variable TableArticle hérite de AbstractTableModel // le tableau de checkbox permet de savoir quels champs/quelles colonnes afficher // ce constructeur permet d'afficher tous les articles correspondants, avec le bon nombre de colonnes tabArt.setModel(modelTabArt); tabArt.updateUI();
Voili voilou, je ne comprends donc pas pourquoi les en-têtes ne se mettent pas à jour, alors que les données, elles, se mettent.
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 public class TableArticle extends AbstractTableModel{ private String[][] data; private String[] title; //...... public TableArticle(String[][] ListeArticlesSelectionnes, JCheckBox[] tabCheck) { //Le code ici est un peu long, en gros, il récupère les bonnes données, et les bonnes en-têtes //(un petit "sysout" m'a permis d'en être sûr ! Aucun problème de ce côté) this.title = entetes;// String[] this.data = dataTmp;// String[][] //informer le tableau des changements de données //avant que je mette "updateUI()", cette ligne permettait d'informer du changement en amont //mais maintenant, en commentaire ou pas, le changement s'effectue //this.fireTableDataChanged(); //informer le tableau du changement de structure (normalement) //mais pareil, aucun changement si je le mets en commentaire this.fireTableStructureChanged(); } //...... }
D'autre part, les colonnes ont toutes la même largeur alors le texte contenu dans chaque cellule lui, n'a pas la tout le temps (jamais en fait) la même largeur (la description, beaucoup plus large que la référence par exemple).
Par conséquent, après des recherches sur Internet (), je suis tombé sur ça :
Sur le principe j'ai bien compris tout le code, ce n'est qu'un parcours des différentes largeurs, où on ressort avec le maximum.
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 public void tableChanged(TableModelEvent e) { tabArt.tableChanged(e); TableColumnModel modelecolonne= tabArt.getColumnModel(); TableModel modele = tabArt.getModel(); int total=modelecolonne.getColumnCount(); for(int i=0;i<total;i++){ int taille=0; int total2=modele.getRowCount(); for(int j=0;j<total2;j++){ // Partie determinant la taille de la cellule de ligne j et de colonne i int taille2=modele.getValueAt(j,i).toString().length()*7; // determination arbitraire if(taille2>taille){ taille=taille2; } } modelecolonne.getColumn(i).setPreferredWidth(taille); } }
J'ai ajouter donc dans mon constructeur :
tabArt étant une JTable.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 this.tabArt.getModel().addTableModelListener(this);
Mais aucun changement à l'horizon au moment du changement de Model...
Donc voilà, déjà merci d'avoir pris le temps de vous arrêter là-dessus, et bien entendu, si quelqu'un à une solution à apporter à un, ou à ces deux problèmes, je suis preneur !!!
Partager