Bonjour,
Qui a une id�e sur comment faire un Tableviewer avec nombre de colonnes variable ? J'ai cherch� partout mais je n'ai rien trouv�. Ce que je veux faire est afficher dans un TableViewer une liste de valeurs qui a une taille variable.
Merci.
Bonjour,
Qui a une id�e sur comment faire un Tableviewer avec nombre de colonnes variable ? J'ai cherch� partout mais je n'ai rien trouv�. Ce que je veux faire est afficher dans un TableViewer une liste de valeurs qui a une taille variable.
Merci.
Salut,
Est-ce que le nombre de colonnes varie lorsque le TableViewer est affich� (on peut ajouter ou supprimer des colonnes), est-ce que le nombre de colonnes est diff�rent pour chaque �l�ment, ou est-il simplement diff�rent (mais le m�me pour tous les �lements) � la construction du TableViewer ? Ou peut-�tre le besoin est-il simplement de pouvoir cacher/afficher des colonnes (comme on fait dans l'Explorer de Windows par exemple) ?
Question subsidiaire : le TableViewer est-il layout� par un TableColumnLayout ?
Avant de d�crire le principe, note qu'il existe un composant tr�s puissant, appel� NatTable qui permet de faire plus ou moins ce qu'on ferait avec Excel, qui donc pourrait permettre plus facilement de faire une table avec nombre de colonnes variables.
Pour le TableViewer, ke vais d�crire le principe au cas simple : un nombre diff�rent de colonnes � la construction, mais fixe ensuite. Le principe de base reste applicable, mais il faudra �ventuellement g�rer par �v�nement l'impact des variations, pour rafra�chir le TableViewer (display et layout).
La gestion du nombre de colonnes passe par 2 �l�ments essentiellement :
- Le LabelProvider qui permet au TableViewer de conna�tre les valeurs � afficher pour chaque cellule, ou les styles �ventuellement (on peut utiliser aussi des CellLabelProvider, mais le principe de base est le m�me ) ;
- Les TableColumn qui constituent les d�finitions de colonnes
Pour le LabelProvider, c'est simple, il suffit de g�rer les index par rapport � un mod�le qui tient compte de la variabilit�.
On a 2 m�thodes (ou 3 m�thodes si on impl�mente ITableValueProvider, voire plus si on veut g�rer du style, mais le principe est le m�me pour toutes les m�thodes) dans ITableLabelProvider. La m�thode getColumnText(Object element, int columnIndex) pour donner le texte � afficher pour une cellule, et le pendant getColumnImage()
Par exemple, pour getColumnText, et le cas static, on pourra faire quelque chose comme �a :
Avec un nombre de colonnes variables, on a un nombre de "columnIndex" non fixe. On pourra g�rer �a par exemple avec une classe qui permet de connaitre pour un type d'objet donn�, la valeur correspondant � l'index. Tous les index en dehors de l'intervalle donneront simplement une valeur nulle.
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 @Override public String getColumnText(Object element, int columnIndex) { String text = null; if ( element instanceof MachinTruc ) { MachinTruc machinTruc = (MachinTruc)element; switch (columnIndex) { case 0: text = machinTruc.getXxx(); break; case 1: text = machinTruc.getYyy(); break; // etc... default: break; } } return text; }
Dans le cas g�n�ral, on peut faire une classe qui d�finit les colonnes d'un objet qui aura donc une m�thode du genre :
Dans le LabelProvider, on aura plut�t :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3 public String getText(T element, int index) { // code }
Par exemple, on peut faire une classe abstraite avec cette m�thode abstraite et impl�menter chaque cas concret par un switch comme ci-dessus, on faire une classe "configurable" qui a une List de d�finition de colonnes.
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12 @Override public String getColumnText(Object element, int columnIndex) { String text = null; ColumnManager columnManager = getColumnManager( element ); // on détermine le composant permettant de connaître les valeurs de l'élément pour chaque index (par exemple, en utilisant une Map<Class<?>, ColumnManager>) if ( columnManager == null ) { text = null; } else { text = columnManager.get(columnManager.toType(element), columnIndex); // on délègue l'obtention des valeurs au composant } return text; }
Ainsi, le LabelProvider va juste d�l�guer l'obtention de la bonne valeur � un composant qui saura combien de colonnes il faut afficher pour un �l�ment donn�.
Le second aspect est la cr�ation des TableColumn. Si d'habitude on cr�e les TableColumn avec soit une boucle, soit une s�quence d'appels qui font, en r�sum�, un new TableColumn(...), pour le cas simple il faudra simplement pouvoir conna�tre le nombre maximum de colonnes, et d�terminer les configurations de chacune dynamiquement et utiliser une boucle pour les construire.
Par extension, pour faire varier le nombre de colonnes en cours d'affichage, on utilisera des new TableColumn() pour cr�er des colonnes, des dispose() sur les instances des TableColumn pour les supprimer, et �ventuellement agir sur les index des colonnes � droite de la nouvelle colonne ou de la colonne supprim�e. Puis faire tout ce qui faut pour rafra�chir les diff�rents composant (comme le TableColumnLayout par exemple).
L'expression "�a marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le probl�me.
La plupart des r�ponses � vos questions sont d�j� dans les FAQs ou les Tutoriels, ou peut-�tre dans une autre discussion : utilisez la recherche interne.
Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
Une question correctement pos�e et r�dig�e et vous aurez plus de chances de r�ponses adapt�es et rapides.
N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'�diteur de messages).
Nouveau sur le forum ? Consultez Les R�gles du Club.
en faite ce que je veux exactement c est par exemple si j ai une classe qui contient une liste de voiture avec leurs donn�es differentes je veux dans une autre classe qui contient une table avec les noms des voitures et a chaque fois quand je clique sur un nom il m'affiche une table qui contient dans les noms d colonnes les donn�es du voiture et dans chaque colonne les valeurs de ces donn�es
Le nombre de donn�es de chaque voiture est diff�rents c'est �a ? Et la table qui affiche ces donn�es est toujours visibles, donc tu voudrais pouvoir mettre � jour la table � chaque s�lection d'une nouvelle voiture, en r�sum�. Et bien, si c'est bien �a, c'est bien le sens de ma r�ponse (mais en r�sum� �a pourrait �tre tout simplement recr�er la table � chaque nouvelle s�lection, comme dans le cas standard).
Cependant, je pense qu'il serait beaucoup plus pratique, et mieux adapt� � ce que tu veux faire, d'utiliser une Property View, surtout si tu es dans le cadre d'une application RCP. C'est dynamique, flexible, �a g�re �galement les arbres, et c'est plut�t simple � mettre en place.
L'expression "�a marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le probl�me.
La plupart des r�ponses � vos questions sont d�j� dans les FAQs ou les Tutoriels, ou peut-�tre dans une autre discussion : utilisez la recherche interne.
Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
Une question correctement pos�e et r�dig�e et vous aurez plus de chances de r�ponses adapt�es et rapides.
N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'�diteur de messages).
Nouveau sur le forum ? Consultez Les R�gles du Club.
Partager