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 :

Widget is disposed


Sujet :

SWT/JFace Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement Java/Web
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement Java/Web

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Par défaut Widget is disposed
    Salut,

    j'ai cherché sur internet mais je n'ai pas trouvé une réponse claire. Espérant la trouvée ici .
    j'ai une application de type plugin qui ajoute un bouton dans un menu dans Eclipse. En cliquant sur ce bouton une fenêtre s'ouvre, voici le code de création de cette fenêtre:
    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
    final Display display = PlatformUI.getWorkbench().getDisplay();
          final Shell shell = new Shell(display, SWT.APPLICATION_MODAL 
             | SWT.CLOSE
             | SWT.MAX
             | SWT.RESIZE);
    ...
    final Button report = new Button(composite, 0);
          report.setText("report");
          report.addSelectionListener(new SelectionAdapter()
          {
             @Override
             public void widgetSelected(final SelectionEvent event)
             {
                Report.reportShell(shell);
             }
          });
    ...
    while (!shell.isDisposed())
          {
             if (!display.readAndDispatch())
             {
                display.sleep();
             }
          }
    "report" est un bouton permettant de lancer une autre fenêtre; la fenêtre de génération de rapport.

    Report.reportShell(shell) est la méthode permettant la création de la fenêtre de génération du rapport.
    Voici le code de la fenêtre de génération:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public static final void reportShell(final Shell parent)
       {
          final Shell reportShell = new Shell(parent);
          ...
          reportShell.pack();
          reportShell.open();
       }
    Cette dernière contient un bouton permettant la génération d'un rapport XML.Tout fonctionne bel et bien mais après la fermeture de la fenêtre de génération de rapport. une exception a été levée:
    org.eclipse.swt.SWTException: Widget is disposed
    ...
    La ligne qui pose le problème est : if (!display.readAndDispatch()) du boucle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    while (!shell.isDisposed())
          {
             if (!display.readAndDispatch())
             {
                display.sleep();
             }
          }
    Est-ce quelqu'un peut m'aider concernant ce point?

    Merci d'avance

  2. #2
    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 : 41
    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,

    Etant donné que tu récupères le display du runtime d'Eclipse, je ne vois pas pourquoi tu t'occupes de la boucle de dispatch
    La boucle de dispatch, c'est cette boucle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while (!shell.isDisposed())
    {
        if (!display.readAndDispatch())
        {
            display.sleep();
        }
    }
    Eclipse gère déjà cette boucle pour toi.
    Par contre, autre interrogation de ma part, pourquoi tu passes par un Shell?? Si c'est pour créer une boite de dialogue, pourquoi tu ne passes par une Dialog? Tu as un besoin particulier?

    Voilà, à+
    Gueritarish

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement Java/Web
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement Java/Web

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Par défaut
    Bonjour,
    Merci pour votre réponse
    L'utilisation d'un shell est un choix que j'ai fait, peut être que c'est ne pas le bon choix mais je n'ai pas le temps pour le modifier.
    Pour la boucle de dispatch, j'ai enlevé cette boucle, il y a eu des exceptions levées lorsque je change l'éditeur à l'exécution (En fait, je travaille sur un grand projet qui contient des éditeurs graphiques, des vues, ...)
    Le plus important est que j'ai résolu le problème , la fenêtre de générations des rapports contient 3 boutons radio. Lorsque je choisis un bouton et je génère le rapport puis je ferme la fenêtre, la cause principale de l'exception est le bouton suivant. Bon, peut être que je ne peux pas trop expliqué. Voila les changements que j'ai fait.
    Ancien code:
    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
     
    _generate.addSelectionListener(new SelectionAdapter()
          {
             @Override
             public void widgetSelected(final SelectionEvent event)
             {
                if(_name.getText().equals(""))
                {
                   MessageDialog.openError(reportShell, "","pas de nom pour le rapport");
                }
                else
                {
                   _fileName = _name.getText();
                   if(_xmlButton.getSelection() == true)
                   {
                      // traitement
                   }
                   if(_csvCommaButton.getSelection() == true)
                   {
                      // traitement
                   }
                   if(_csvSemicolonButton.getSelection() == true)
                   {
                      // traitement
                   }
                }
             }
          });
    Nouveau code :

    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
    32
    33
    34
     
    _generate.addSelectionListener(new SelectionAdapter()
          {
             @Override
             public void widgetSelected(final SelectionEvent event)
             {
                if(_name.getText().equals(""))
                {
                   MessageDialog.openError(reportShell, "", "pas de nom pour le rapport");
                }
                else
                {
                   _fileName = _name.getText();
                   if(_xmlButton.getSelection() == true)
                   {
                      // traitement
                   }
                   else
                   {
                      if (_csvCommaButton.getSelection() == true)
                      {
                         // traitement
                      }
                      else
                      {
                         if (_csvSemicolonButton.getSelection() == true)
                         {
                            // traitement
                         }
                      }
                   }
                }
             }
          });
    _generate est le bouton qui permet de lancer la génération
    _name zone texte qui contient le nom du rapport.
    _xmlButton, _csvCommaButton et _csvSemicolonButton les boutons radio.

    Bonne journée

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

Discussions similaires

  1. SWT exception Widget is disposed
    Par pmboutteau dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 02/04/2014, 09h31
  2. Erreur "Widget is disposed"
    Par abidi_niz dans le forum SWT/JFace
    Réponses: 3
    Dernier message: 13/06/2012, 14h02
  3. java.Lang.RuntimeException Widget disposed too early!
    Par pssst dans le forum Eclipse Platform
    Réponses: 0
    Dernier message: 09/03/2009, 09h37
  4. "Widget is disposed"
    Par TabrisLeFol dans le forum SWT/JFace
    Réponses: 5
    Dernier message: 10/07/2006, 11h26
  5. [SWT]Eclipse Java : swt.widgets.Table
    Par watson dans le forum SWT/JFace
    Réponses: 3
    Dernier message: 01/10/2003, 09h07

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