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]Générer dynamiquement IHM sur une vue en fonction de données d'une autre vue


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]Générer dynamiquement IHM sur une vue en fonction de données d'une autre vue
    hello tout le monde, c'est encore moi!

    J'ai ouvert il y'a quelques mois un post dont le sujet était la génération dynamique d'IHM en SWT. Je suis au jour d'aujourd'hui capable de générer une IHM à partir de données provennant de ma base de données.

    Pour rappel, le but est de pouvoir, lorsque je dispose d'informtions renvoyées par ma BD, effectuer un filtre sur ces données. Je dois donc disposer d'un interface me permettant d'effectuer ce filtre. Cependant, je n'ai aucune idée de ce que l'éxecution de la requête va me renvoyer(nom et nombre de colonnes notemment).

    L'application que je développe étant la même, je voudrais donc, lors d'un click sur un noeud de l'arbre de ma vue de navigation, pouvoir générer l'ihm en fonction des données qui me seront fournies par ce noeud. L'ihm sera généré sur une vue qui est dédiée à cet effet.

    La question que je me pose est celle de savoir comment m'y prendre pour transmettre les infos dont la vue a besoin pour génerer l'ihm. Pour l'instant, j'essai (sans succes) de le faire avec le principe du "selectionService".

    Je poste le source de ma vue(de filtre) en espérant que cela pourrait aider à m'aider. Sachant que dans ma vue de navigation, quite au click sur un noeud j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    ...
    FilterView filterView = new FilterView();										
    try {
    	filterView = (FilterView) getViewSite().getWorkbenchWindow().getActivePage().showView(FilterView.ID);
     
    } catch (PartInitException e) {
    	e.printStackTrace();
    }
    filterView.setQuery(myQuery);
    filterView.setDataSource(myDataSource);
    filterView.setModelProvider(new ModelProvider(myQuery, myDataSource));
    ...

    Je reste attentif à toute remarque.

    Merci
    Fichiers attachés Fichiers attachés

  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
    Bonjour à tous,

    Je vais essayer de reformuler mon problème de plus simplement. Je suis à mesure de pouvoir générer un IHM grâce à certaines données. Ces données sont des lignes renvoyées par l'éxécution d'une requête.

    Dans mon cas, je recupère cette lignes suite à un click sur un noeud d'un treeViewer présent dans une vue. Je voudrais donc utiliser cette données pour créer une IHM dans une autre vue.

    Parvenant déjà à faire ce genre de lien (une selection d'un noeud sur une vue permettant de peupler un tableViewer sur une autre vue), j'ai essayé dans ce cas de faire cela de la même manière, mais j'y arrive pas. Le problème vient surrement du fait que dans ce cas, je n'ai pas de viewer dans ma vue, mais des vues.

    Voilà donc synthétisé mon problème.

    Merci infiniment de votre aide

  3. #3
    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, toujours a la recherche d'une solution à mon problème, je crois avoir cerné où se situe ma principale difficulté. Dans ma NavigationView(celle dans la quelle gere le click sur un noeud de l'arbre, récupère et traite la selection), je fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ...
    try {
    	filterView = (FilterView)getViewSite().getWorkbenchWindow().getActivePage().showView(FilterView.ID);			
    } catch (PartInitException e) {
    	Activator.getLogger().error(e.toString());
    }		
    // mise à jour du modelProvider
    filterView.setModelProvider(modelProvider);
    ...
    Quand je lance l'application et que je clique sur un noeud, j'ai un "Java.lang.NullPointerException". Cela me semble normal, car, lorsque je fais un "showView" il se sert de la méthode "createPartControl" pour afficher la vue. Hors dans cette méthode, je fais appel à une méthode "createWidgets()" qui constuit les widgets en fonction des données du modelProvider. Le modelProvider est ici un objet me permettant de gérer mes données metiers, il est déclaré comme attribut privé de ma classe "FilterView", et n'est jamais initialisé avant sa première utilisation(lors de l'affichage de la vue), d'ou l'exception.

    Je suis donc en train de reflechir sur la maniere avec laquelle je vais initialiser ce "modelProvider"(qui je le rapelle est construit avec les données provenant de la selection) dans ma "FilterView".

    Merci de votre aide

    Je me rends donc compte que, lorsque je fais un "showView" dans un premier temps, c'est normal que la vue qui est affichée ne contienne pas de widgets

  4. #4
    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,
    En reprenant le code que tu as posté, il te suffit de passer ton provider en paramètres et de recréer tes composants en fonction de celui-ci. (Comme pour le ResultView que j'avais posté il y a quelques temps)
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    try {
        ModelProvider modelProvider = new ModelProvider(...);
        IWorkbenchPage page = getViewSite().getWorkbenchWindow().getActivePage();
        FilterView filterView = (FilterView) page.findView(FilterView.ID);
        filterView.createWidgets(modelProvider);
        ...
    } catch (PartInitException e) {
        Activator.getLogger().error(e.toString());
    }
    et dans ta classe FilterView :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private Composite parent;
     
    public void createPartControl(Composite parent) {
        this.parent = parent;
    }
     
    public void createWidgets(ModelProvider modelProvider) {
       //Recréation des composants...
    }
    Maintenant, sans aller plus loin, cela risque d'être coton pour faire communiquer ta vue "Filtres" avec la bonne instance de ta vue "Résultats" et vice versa.
    Personnellement, ce que j'aurais fait, c'est créer une classe qui regroupe ta vue Filtres, ta vue Résultats, ton provider qui alimentent les deux vues et le noeud sélectionné de la vue "Navigation". Cela faciliterait sans doute les communications entre les vues et les données, un peu à la manière du controller dans l'architecture MVC.

  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
    Bonjour à tous et merci Desert pour ta réponse,

    J'ai réadapté mon code de la manière que tu m'as conseillé, mais à l'exécution, lorque je clique sur un noeud de l'érbre, j'obtiens un "Java.Lang.NullException".

    J'ai éssayé de débogguer, et jme rends compte que, suite à l'appel du "filterView.createWidgets(modelProvider);", jne rentre même pas dans la méthode "createWidgets(modelProvider);"; encore moins dans le "createPartControl".

    Sachant également que le composants d'une vue doivent être construits dans le "createPartControl", est ce qu'on s'y prends bien?

    Pour information, ma classe filterView est déclarée dans ma perspective de la même manière que celle de la resultView(vue avec plusieurs instances):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    IFolderLayout folderFilter = layout.createFolder("Filter", IPageLayout.TOP, 0.3f, editorArea);		
    folderFilter.addPlaceholder(FilterView.ID);
    Avez vous une idée de solution?

  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
    J'ai un tout petit peu évolué depuis ce matin, mais je bloque face à un problème de rafraichissement de ma vue.

    Tout d'abord, les changements que j'ai apportés sont les suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    FilterView filterView;
    IWorkbenchPage activePage = getViewSite().getWorkbenchWindow().getActivePage();
    filterView = (FilterView) activePage.findView(FilterView.ID);
    // si la vue ne dispose pas de query
    if(filterView.getQuery() == null){
    	filterView.createWidgets(modelProvider);
    }else // si la query de la vue est différente de la query selectionée
    	if(filterView.getQuery() != myQuery){
    		filterView.disposeWidgets();
    		filterView.createWidgets(modelProvider);
    }
    Dans la FilterView, j'ai ajouté un champ query, ainsi qu'un getter pour ce champ. Je "set" ce champ quand je rentre dans le "createWidgets()".
    Ma méthode disposeWidgets etant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public void disposeWidgets(){	
    		if (myWidgets.size() > 0){
    			for (int i=0; i<myWidgets.size(); i++)		
    				myWidgets.get(i).dispose();
    		}	
    	}
    De cette manière tout marche à merveille, avec pour seuls bémols :
    - Lors d'un click sur un noeud de l'arbre, les composants sont bien crées dans le FilterView, mais ne sont visibles que lorsque j'agrandit ma vue; en quelque sorte lorsque je la recharge.
    - Tous les composants générés sont disposés en dehors du composant DateTime.

    D'autres parts, je suis obligé de déclarer désormais ma FilterView dans la perspective de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    layout.addStandaloneView(FilterView.ID, true, IPageLayout.TOP, 0.3f, editorArea);
    Car en la déclarant de la manière suivante,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IFolderLayout folderFilter = layout.createFolder("Filter", IPageLayout.TOP, 0.3f, editorArea);
    folderFilter.addPlaceholder(FilterView.ID);
    , cela me génère une java.lang.nullexception.

    Sachant que je voudrais, à un moment donné de l'utilisation de l'application, pouvoir fermer la FilterView, de telle sorte que si je resselectionne un noeud, cette vue puisse se réouvrir. J'ai ce comportement avec ma ResultView, mais en l'état actuel des choses, jne l'ai pas avec le FilterView.

    Est ce que cela est lié à la manière dont je déclare ma vue dans la perpective?

    Auriez vous des idées de solution?

    Merci

  7. #7
    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
    Re-salut,
    En effet, je n'avais pas pensé au fait que tu puisses fermer le vue Filtres.
    La méthode findView ne fait que renvoyer une vue existante. Le problème étant que tu essayais de créer des composants à l'intérieur d'une vue qui n'existait pas !
    Donc en ajoutant la vue dès l'initialisation de ta perspective, via addStandaloneView(), tu corriges le problème sauf en cas de fermeture de la vue.
    Il faudra donc remplacer findView par showView qui lui se chargera de créer le vue si elle n'existe pas.
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    activePage.showView(FilterView.ID)
    Pour ta méthode disposeWidgets, tu devrais supprimer les composants en partant du dernier vers le premier (dans l'ordre qu'ils sont ajoutés, comme pour les colonnes du TableViewer d'un ancien post).
    Pour afficher ces composants sans avoir à redimensionner la vue, tu dois utiliser la méthode layout() du conteneur parent des composants.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //...création des composants
    compositeParent.layout();

  8. #8
    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 (jne le dirais jamais assez),

    Je viens d'appliquer ceque tu conseilles, et une partie des problème a été corigée. En effet, mes composants sont bien affichés sans avoir à redimensionner ma vue. Cependant, j'ai encore deux points d'ombre :

    - malgré le fait d'utiliser un showView, j'ai l'erreur suivante : "An error has occurred when activating this view java.lang.NullPointerException ", mais la vue est quand meme créee.

    - lorsque je passe d'un noeud de l'arbre à un autre et que je reconstruis ma vue de filtres, les composants présents sont décallés à chaque fois. J'imagine que c'est un problème de layout à réinitialiser, mais jne vois pas le quel.

    Je reste à votre disposition pour des idées de solutions.

    Merci

  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
    Pour ton 1er problème, tu tentes d'accéder à un objet qui n'existe pas. Il ne reste plus qu'à trouver lequel. Regardes au niveau de la méthode setFocus() quelque fois que tu chercherais à donner le focus à un object inexistant.
    Pour le 2ème, quel genre de décalage ? Pourrais-tu posté un screen ou du code ?

  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
    Tu trouveras en pièces jointes une capture de ce que j'obtiens au troisième click sur mon arbre. A chaque click, la création de la vue de filtre impose au composants de cette vue de ce "décaler" vers la droite.

    Pour le second problème, jne crois pas que ce soit ca le problème, car malgré
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void setFocus() {
    		if (myWidgets.size() > 0)
    			myWidgets.get(0).setFocus();
    	}
    J'ai toujours le même problème.

    Est ce que c'est moi qui m'y prends mal?
    Images attachées Images attachées  

  11. #11
    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
    La méthode size() ne vérifie pas si la liste d'objets a été instanciée ou pas.
    Essaie plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (myWidgets != null && myWidgets.size() > 0)
    	myWidgets.get(0).setFocus();
    Pour ton problème de layout, je ne vois pas, désolé.

  12. #12
    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,

    Le sujet principal du post a été resolu, mais avant de le mettre en statut "resolu", j'aimerais avec votre aide, resoudre les deux derniers problèmes auquels je suis encore confronté,, et que j'ai posé deux posts plus hauts. Malgré l'application des recommandations de desert, rien n'y fais, j'obtiens toujours la meme exception.

    Pensant que le problème venaient de la manière dont je déclarais et affichais mes vues, j'ai fais tous des essais avec une déclaration de vue sous forme de standalone, ainsi que des affichages avec findView et showView.

    Pour tout vous dire, jne vois pas du tout d'ou peux provenir alors que le reste semble fonctionner presque parfaitement.

    Presque parfaitement car démeure encore ce problème de décalage de widgets dans ma vue après un "update" de celle ci. La capture d'écran présente 2 posts plus haut est là pour montrer ceque j'obtiens.

    Merci de votre aide

  13. #13
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 142
    Par défaut
    Par rapport à ce matin, j'ai assez avancé. J'ai en effet resolu (de manière hasardeuse le second pb). Le problème était lié au fait que je disposais mal(je ne les disposais pas tous visiblement) mes composants.

    Pour le premier problème, je me suis rendu compte que, une fois que j'ai cliqué sur tous les noeuds de mon arbre, que tous mes onglets(instance de vue) aient été instanciés, que la navigation(le fait de recliquer sur les onglets de l'arbre) ne generait plus l'erreur : "Java.Lang.NullException".

    De, compte tenu du fait que j'implemente (afin de récuperer la part active et ainsi de générer le bon filter) l'IpartListener2 dans ma ResultView, je me suis rendu compte qu'en enlevant cette implémentation, l'exception n'apparaissait également plus.

    Voilà les constatations bizares que j'ai faites et que j'arrive pas à contourner.

    Auriez vous des pistes?

    merci

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/05/2012, 08h50
  2. [XL-2007] Exécution code d'une worksheet en fonction de données d'une autre worksheet
    Par assiec dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 08/12/2011, 15h58
  3. Réponses: 3
    Dernier message: 18/12/2009, 13h33
  4. Réponses: 2
    Dernier message: 17/12/2009, 16h40
  5. Réponses: 2
    Dernier message: 28/04/2009, 20h02

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