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

SWT/JFace Java Discussion :

Tableviewer(JFACE) avec nombre de colonnes variable


Sujet :

SWT/JFace Java

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2017
    Messages : 4
    Points : 6
    Points
    6
    Par défaut Tableviewer(JFACE) avec nombre de colonnes variable
    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.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    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 :
    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;
    	}
    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.

    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public String getText(T element, int index) {
            // code
    }
    Dans le LabelProvider, on aura plutôt :

    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;
    	}
    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.
    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.

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2017
    Messages : 4
    Points : 6
    Points
    6
    Par défaut
    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

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    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.

Discussions similaires

  1. Table avec nombre de colonnes variable
    Par satanas313 dans le forum Développement
    Réponses: 6
    Dernier message: 21/05/2010, 15h07
  2. Somme d'une colonne (avec nombre de rangée variable)
    Par Berny77 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 13/05/2008, 23h30
  3. Tableau avec un nombre de colonne variable
    Par HoB dans le forum VBScript
    Réponses: 12
    Dernier message: 17/01/2008, 11h06
  4. Affichage avec un nombre de colonnes variable
    Par sebaaas dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 04/10/2007, 19h53
  5. SELECT avec un nombre de colonnes variable
    Par sorcer1 dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 24/09/2007, 21h58

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