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 :

[RCP/SWT/JFACE] Update des données d'un tableViewer


Sujet :

SWT/JFace Java

  1. #1
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 142
    Par défaut [RCP/SWT/JFACE] Update des données d'un tableViewer
    Bonjour à tous,

    Je reviens vers vous afin de bénéficier de vos précieux conseils sur une problématique à la quelle jsuis confronté en ce moment.

    Dans une vue de l'application que je suis en train de concevoir, je dispose d'un tableViewer dont je voudrais mettre à jour les données. Pour être plus précis, l'application dispose également d'une vue navigation contenant un treeViewer. Quand je clique sur un noeud de l'arbre, je recupère certaines informations (requête, dataSource, ...). Ces informations sont ensuite utilisées pour créer un ModelProvider(objet qui recupère les infos précédentes, excute la requête et fournie mes lignes d'objet metier). Ce sont ces lignes qui sont utilisées par le contentProvider afin de remplir ma table.

    Les données recupérées étant succeptibles de changer en cour d'éxécution, j'ai ajouté un bouton me permettant de "rafraichir" la vue. En principe, cette action devrait juste consister à recuperer mes infos (celles obtenues lors du click et associées à la vue en cour) et à instancier un nouvel ModelProvider que j'utiliserais ensuite pour mettre à jour les données de mon viewer.

    Cependant, lorsque je fais cela, j'obtiens de nouvelles colonnes qui viennent se placer à la suite de celles qui étaient déjà là. En d'autres termes, l'ancien viewer est tjrs présent. Malgré le fait que j'ai disposé les colonnes de l'ancien viewer, rien y fait. J'ai l'impression que le pb vient de la manière dont j'agence mes données.

    En restant à votre disposition pr tout complément d'info(notement des sources), je vous remercie d'avance.

    merci

  2. #2
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 142
    Par défaut
    J'ajoute en pj, les codes sources de mes deux principales classes concernées :

    - NavigationView : permet de gérer la vue de navigation. c'est entre autre la dedans qu'on recupère les informations(myQuery, myDataSource) liées au noeud selectionné, et qu'on les "envoie" à la vue de resultat(ResultView).

    - ResultView : contient le tableViewer rempli des données corresspondants au noeud selectionné. La méthode refreshColumns(TableViewer viewer, final ModelProvider modelProvider) permet de "rafraichir" le contenu du viewer. Elle est notement utilisée par la navigationView dans en cas de première selection d'un noeud. Elle prends en entrée le viewer courant, et le modelProvider créée à partir des infos sur le noeud selectioné (requête et au dataSource).

    Dans l'action dans la quelle je voudrais mettre à jour ma vue(le contenu de son tableViewer), je fais appel à cette denière méthode avec en paramètre un nouvel modelProvider instancié(qui fera donc une nouvelle requête en base et donc me fournira de nvelles données), et le viewer courant.

    Le problème est que je lui passe un viewer déjà "garni", que je n'arrive pas à disposer.

    Pour faire simple, je voudrais pour ce "refresh", remplacer le tableViewer existant par un nouveau dont les données(colonnes et contenu) sera celui obtenu à l'aide du nouvel modelProvider.

    En espérant que vous avez suivi, je m'em remet à vos conseils avisés.

    Merci
    C'est cette dernière mé
    Fichiers attachés Fichiers attachés

  3. #3
    Membre Expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Par défaut
    Salut papaetoo,

    Tu te compliques la vie... Surtout avec les Viewers JFace. Tu n'as pas besoin de supprimer ton Viewer et de le recréer. Il suffit de mettre à jour l'input du TableViewer et faire un refresh... A moins que tes colonnes aient changé (mais je vois pas pourquoi elles changeraient étant donné que tu veux juste rafraichir une Vue avec les données de ta table). Donc, normalement, tu as les mêmes colonnes et seul le contenu change.
    En gros, ce qu'il te faut faire :
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    myTable.setInput(new ModelProvider(...));
    myTable.refresh();
    Et c'est tout. Pas la peine de se lancer dans la suppression du Viewer et de ses colonnes pour les remplacer ^^

    Voilà, à+
    Gueritarish

  4. #4
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 142
    Par défaut
    Merci Gueritarish pour ta réponse,

    Effectivement, j'aurais juste à mettre à jour les données que je ferais comme tu le dis. Mais dans mon cas, tout est succeptible de changer. J'exécute en effet la pluspart du temps des procédures stockées et je ne sais pas à l'avance ce que je dois avoir comme résultat. D'ou le besoin de tout "disposer" et recréer à nouveau.

    Pour l'instant, j'ai une méthode dispose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public void dispose(){
    	Table table = viewer.getTable(); 		
    	// La première colonne n'est pas disposée
    	if (table.getColumnCount() > 0){
    		for(int i=table.getColumnCount()-1; i >= 0; i--) {
    			table.getColumn(i).dispose();				
    		}
    	}
    // ceci fai également la même chose à la seule différence que 
    // c'est la derniere colonne qui n'est pas disposée
    // for (final TableColumn column : table.getColumns()) {
    //		column.dispose();
    //	}		
    }
    .

    De plus, qd j'appele cette méthode et que je fais mon "refreshColumns", et bien, j'ai plusieurs erreurs (An error has occurred. See error log for more details.
    java.lang.NullPointerException
    ) qui sont générées.

    Avez vous des idées de solutions?

    EDIT : le nombre d'erreurs générées est égal au nombre de lignes qui était présentes dans la tableViewer dont jai disposé les colonnes.

    EIT : lorsque la vue que je veux raffraichir ne contient pas de données, je n'ai aucune erreur(0 ligne => 0 erreur). J'ai l'impression que le pb vient du fait que dans ma méthode refreshColumns, je "sette" à nouveau le ContentProvider, le LabelProvider, et l'input. Sachant que la seule chose que j'ai faite ce n'est que disposer mes colonnes, est ce que les erreurs que j'obtiens viennent de ces (re) "settages" là? Dans ce cas, auriez vous une solution?

    Merci

  5. #5
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 142
    Par défaut
    J'arrive maintenant à "disposer" toutes mes colonnes. Pour cela, j'ai rajouté la ligne : à la fin de ma méthode disposeColumns() (Est ce que cela est d'ailleurs propre?).

    Par contre, j'ai toujours mes erreurs lorsque j'appelle ma méthode refreshColumns(). Pour mémoire, j'obtiens autant d'érreurs que de lignes présentes dans le tableViewer dont j'ai disposé les colonnes. Une capture d'écran de cette erreur est présente en pièce jointes.

    De plus J'ai l'impression que le problème vient du fait que je ne "dispose" que les colonnes de la table du viewer. Les données présentes (et obtenues grâce au setInput()) n'ayant elles pas été suprimées, cela poserait problème quand je refais à nouveau un "setInput()".

    Qu'en pensez vous?

    merci
    Images attachées Images attachées  

  6. #6
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 142
    Par défaut
    Slt à tous,

    Je viens de me rendre compte que le fait de faire ensuite table.removeAll(); ne "disposais" completement mes colonnes. Car quand j'affiche ma vue apres avoir appellé ma méthode refreshColumns, il y'a toujous une colonne remplie d'informations(sans le header par contre). Cette colonne est en fait la première colonne du tableViewer dont je viens de disposer les colonnes.

    Je suis completement perdu, même apres avoir débuggué, jne trouve pas d'ou vient le souci.

    Merci infinémént de votre aide

  7. #7
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 142
    Par défaut
    Bonjour à tous,

    j'essai de voir exactement ou se situe le probleme auquel je suis confronté. D'apres la capture d'écran que j'ai joint deux posts plus haut, le message suivant apparait : An error has occurred. See error for more details.

    Est ce que vous avez une idée de ou se trouvent ces logs? Et sinon, avez vous déjà rencontré ce genre d'érreur(voir capture d'écran)? Si oui, de grâce dites moi comment avez vous resolu le pb.

    Merci

  8. #8
    Membre chevronné Avatar de desert
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 414
    Par défaut
    Salut papaetoo,
    J'ai regardé ton fichier ResultView.java et la méthode que tu utilises pour disposer tes colonnes s'appelle disposeColumns() et non dispose().
    A l'intérieur de ces 2 méthodes (qui exécutent le même code), tu as fait une faute. Tu as écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int i = table.getColumnCount()-1; i <= 0; i--) {
    au lieu de plus grand ou égal.
    J'éviterais également de redéfinir la méthode dispose qui est inutile ici (à la poubelle donc).

  9. #9
    Membre chevronné Avatar de desert
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 414
    Par défaut
    Concernant tes erreurs, à mon avis, cela doit venir de la méthode createColumns() dans laquelle tu utilises des TableViewerColumn sans leur assigner de ColumnLabelProvider.
    Vu que tu utilises déjà un TableLabelProvider pour ton viewer, essaie dans un premier temps de créer des TableColumn sans passer par un TableViewerColumn pour voir si le problème est bien lié à cela.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Table table = viewer.getTable();
    TableColumn column = new TableColumn(table, SWT.LEFT);
    ...

  10. #10
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 142
    Par défaut
    Merci Desert!

    Grâce à ton aide, j'ai résolu partiellement le pb. Je dis partiellement car malgré le fait que j'ai plus le pb du java.lang.nullexception, deux autres phénomènes sont apparus:

    - avant, à la création de la vue, les colonnes du tableViewer étaient toutes créées presque simultanément. Avec ta solution(utiliser un TableColumn directement au lieu d'un TableViewerColumn), les colonnes sont crées les unes à la suite des autres, avec très sacadé ressemblant à un progressebar de lignes de colonnes (j'essai de décrire comme je peux)

    - lorsque je clique sur le bouton me permettant de faire la MAJ du viewer, ses colonnes sont encore crées comme décrit précédement

    - Pour un viewer dont la table n'avais pas de données (0 lignes), et bien le click sur le bouton de rafraichissement ne fai que supprimer une colonne(la derniere du viewer). Pour un viewer avec 5 colonnes par exple, ce n'est qu'au 6eme rafraichissement que le viewer est reconstruit.

    J'ai éssayé de décrire au max ce que je constatait, je reste biensur à ta dispo pr tout complément dinfo.

    Je te remerci infiniment.

  11. #11
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 142
    Par défaut
    Je ne sais pas si c'est lié au fait que ce soit la fin de journée ou au fait que je sois bête, mais je viens de me rendre compte que les pbs précédents étaient liés à une de mes bavures. je faisais en effet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final TableColumn column = new TableColumn(table,SWT.LEFT , SWT.NONE);
    au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final TableColumn column = new TableColumn(table, SWT.NONE);
    Le pb est resolu. Tout marche parfaitement.

    Une fois de plus, merci à mon démi Dieu Desert.

    Par contre, j'envisage d'effectuer ce rafraichissement de viewer entre deux laps de temps. Je m'exlique : Dans l'application, je dispose d'une statusLine avec deux champs(LastUpdate et NextUpdate). Ce que je voudrais c'est que lorsqu'on clique sur le bouton de refresh, il rafraichi la vue(son viewer), lance un progressbar(présent sur la statusLine, un peu comme ceux que lon a sous eclipse lorsqu'on chois d'executer une application) et lorsque l'heure du next update est atteint, il rafraichi à nouveau la vue.

    Débutant de mon état, j'ai éssayé de regarder à dte et à gche et il me semble que j'aurais besoin d'utiliser des jobs eclipses. Par contre , je n'ai pour l'instant pas idée de comment ca marche, ni de comment je vais agencer tout cela pour ke une fois ke j'ai cliqué sur mon bouton refresh, les MAJ se font continuellement et par intervalle de temps (lastUpdate et nextUpdate), jusqu'à ceque je clique à nouveau sur un autre bouton "stop", ou même sur le même bouton.

    Je serais donc prenneur si t'avais des idées pour m'orienter. Ca éviterais par exemple que je "polue" encore le forum avec mes messages de detresse, qui je lespere sont aussi utiles à d'autres que moi.

    Merci une fois de plus et un post de plus résolu.

  12. #12
    Membre chevronné Avatar de desert
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 414
    Par défaut
    Il faudra jouer avec les threads.
    Je crois qu'on en parle dans le tutorial SWT de keulkeul.
    En gros, quand t'appuieras sur ton bouton, cela lancera un thread qui rafraichira le viewer tous les x millisecondes et bouclera tant que tu ne lui as pas demandé de s'arrêter.

    PS: Tu as un exemple ici.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Rcp/Swt/Jface] "Disposer les colonnes d'un tableViewer"
    Par papaetoo dans le forum SWT/JFace
    Réponses: 1
    Dernier message: 05/08/2009, 18h00
  2. Réponses: 2
    Dernier message: 22/09/2008, 18h21
  3. Réponses: 6
    Dernier message: 10/09/2008, 14h29
  4. updater des données dans mon fichier excel
    Par gantec dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 26/02/2007, 16h01
  5. update des données
    Par LesLemmings dans le forum Visual C++
    Réponses: 2
    Dernier message: 30/11/2006, 09h26

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