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 :

SWT exception Widget is disposed


Sujet :

SWT/JFace Java

  1. #1
    Membre averti Avatar de pmboutteau
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Février 2005
    Messages : 601
    Points : 420
    Points
    420
    Par défaut SWT exception Widget is disposed
    Bonjour,

    J'ai une erreur qui vient d'apparaître dans une application RCP et que je n'ai jamais eu avant. Le code n'a pas changé. Je ne comprends pas trop le problème.

    Voici le log:

    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
    30
    31
    ENTRY org.eclipse.ui 4 0 2014-04-01 09:01:39.840
    !MESSAGE Unhandled event loop exception
    !STACK 0
    org.eclipse.swt.SWTException: Widget is disposed
                    at org.eclipse.swt.SWT.error(SWT.java:3777)
                    at org.eclipse.swt.SWT.error(SWT.java:3695)
                    at org.eclipse.swt.SWT.error(SWT.java:3666)
                    at org.eclipse.swt.widgets.Widget.error(Widget.java:463)
                    at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:336)
                    at org.eclipse.swt.widgets.Widget.getData(Widget.java:521)
                    at org.eclipse.jface.viewers.AbstractTreeViewer.updateChildren(AbstractTreeViewer.java:2609)
                    at org.eclipse.jface.viewers.AbstractTreeViewer.internalRefreshStruct(AbstractTreeViewer.java:1856)
                    at org.eclipse.jface.viewers.TreeViewer.internalRefreshStruct(TreeViewer.java:711)
                    at org.eclipse.jface.viewers.AbstractTreeViewer.internalRefreshStruct(AbstractTreeViewer.java:1863)
                    at org.eclipse.jface.viewers.TreeViewer.internalRefreshStruct(TreeViewer.java:711)
                    at org.eclipse.jface.viewers.AbstractTreeViewer.internalRefresh(AbstractTreeViewer.java:1831)
                    at org.eclipse.jface.viewers.AbstractTreeViewer.internalRefresh(AbstractTreeViewer.java:1787)
                    at org.eclipse.jface.viewers.AbstractTreeViewer.internalRefresh(AbstractTreeViewer.java:1773)
                    at org.eclipse.jface.viewers.StructuredViewer$7.run(StructuredViewer.java:1430)
                    at org.eclipse.jface.viewers.StructuredViewer.preservingSelection(StructuredViewer.java:1365)
                    at org.eclipse.jface.viewers.TreeViewer.preservingSelection(TreeViewer.java:397)
                    at org.eclipse.jface.viewers.StructuredViewer.preservingSelection(StructuredViewer.java:1328)
                    at org.eclipse.jface.viewers.StructuredViewer.refresh(StructuredViewer.java:1428)
                    at org.eclipse.jface.viewers.ColumnViewer.refresh(ColumnViewer.java:537)
                    at org.eclipse.jface.viewers.StructuredViewer.refresh(StructuredViewer.java:1387)
                    at fr.sihpic.deplacement.view.remboursement.action.EnvoieAgentEtatFraisAction.run(EnvoieAgentEtatFraisAction.java:135)
                    at org.eclipse.jface.action.Action.runWithEvent(Action.java:498)
                    at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:583)
                    at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:500)
                    at org.eclipse.jface.action.ActionContributionItem$5.handleEvent(ActionContributionItem.java:411)
                    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
    quelqu'un connait ce problème?
    ours ours !! Au début elle est froide mais après elle est bonne!

  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,

    L'une des particularités de SWT, c'est que les composants graphiques (Resource ou Widget) se doivent d'être disposés lorsqu'on ne les utilise plus. Ceci libère les ressources systèmes associées, en particulier le handle utilisé par l'OS pour gérer le composant. A partir du moment où un composant est disposé, on ne peut plus l'utiliser.

    Ici, visiblement, tu as une action de contribution qui rafraichit un TreeViewer. Lors de la mise à jour d'un nœud de l'arbre, on accède au widget (TreeItem) le représentant, et celui-ci est disposé à ce moment. Cela peut être dû à de nombreuses raisons différentes. Difficile de te donner la raison exacte sans avoir le code exact et la structure de l'application. Le TreeViewer est-il dans une vue, un éditeur. L'action de contribution est-elle un action de contribution d'éditeur, de vue, globale...

    Ce qui est étrange, c'est qu'en théorie, les widgets internes d'un Tree devraient être gérés uniquement en interne du Tree, ou du TreeViewer. Donc, déjà, voir s'il n'y a pas de disposition explicite externe (dans le code de ton application). Ensuite, les widgets étant disposés lors de la disposition du Tree, il faudrait voir comment est lié le TreeViewer avec le handler EnvoieAgentEtatFraisAction. Si cette classe maintient un pointeur direct sur le TreeViewer, au lieu d'utiliser un système de récupération de la vue dynamique : si la vue est fermée et ré-ouverte, le handler continue de pointer sur un ancien TreeViewer, disposé donc. Je ne sais plus si on devrait pas avoir l'exception plus haut dans la pile d'appel, mais c'est possible qu'elle arrive à ce niveau seulement.

    Pour pister qui dispose (et quand), il y a le cas facile : enregistrer un DisposeListener sur le Tree dès la création du TreeViewer. En mettant un breakpoint, ou en traçant une pile d'appel, dans la méthode widgetDisposed, tu pourras savoir si on dispose le Tree, et où. Si le problème vient de la disposition d'un TreeItem, c'est plus compliqué : il faudrait trouver un moyen d'enregistrer un DisposeListener sur tous les TreeItem créés par le TreeViewer. Ce qui n'est pas évident à priori. Éventuellement, le faire après un refresh, en parcourant tous les nœuds sur le Tree.

    A part ça, il n'est pas impossible qu'il y ait un bug JFace : le problème se reproduit-il systématiquement ou pas ? Autre cas possible, qui m'est déjà arrivé : une autre erreur a eu lieu pendant l'ouverture de la vue, et le TreeViewer a té disposé en conséquence. Dans ce cas, il devrait y avoir une autre stacktrace plus haut dans le log.
    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
    Membre averti Avatar de pmboutteau
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Février 2005
    Messages : 601
    Points : 420
    Points
    420
    Par défaut
    C'est la première fois que cela arrive.

    Après fermeture de l'application, le problème n'est plus servenu en faisant la même manipulation.

    Merci pour ton aide.

    Si le problème se reproduit j'appliquerai ce que tu expliques.
    ours ours !! Au début elle est froide mais après elle est bonne!

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

Discussions similaires

  1. Erreur "Widget is disposed"
    Par abidi_niz dans le forum SWT/JFace
    Réponses: 3
    Dernier message: 13/06/2012, 14h02
  2. SWT Text Widget : Valeur tronquée
    Par arno15 dans le forum SWT/JFace
    Réponses: 1
    Dernier message: 02/03/2012, 13h57
  3. Widget is disposed
    Par ensi_en dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 14/10/2010, 13h01
  4. [SWT] synchro widget avec thread
    Par TiTiSeb dans le forum SWT/JFace
    Réponses: 7
    Dernier message: 08/09/2008, 21h21
  5. "Widget is disposed"
    Par TabrisLeFol dans le forum SWT/JFace
    Réponses: 5
    Dernier message: 10/07/2006, 11h26

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