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 :

plusieurs Shell dans une application SWT/JFace


Sujet :

SWT/JFace Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 28
    Points : 29
    Points
    29
    Par défaut plusieurs Shell dans une application SWT/JFace
    Bonjour,

    Je suis nouveau à SWT mais mon problème reste sans solution depuis quelques temps malgré de nombreuses recherches:

    Sous GNU/Linux, impossible d'instancier deux objets Display.
    Mon application crée un thread qui gère ma GUI. Ce thread crée un display, et lance à son tour deux threads de GUI avec en paramètre ce display.

    Chacun des threads de GUI crée un Shell avec le display.
    Je voudrais donc avoir deux fenêtres indépendantes.

    mon problème: quand je ferme une des fenêtres mon application est figée, et les exceptions suivantes sont levées:

    Exception in thread "main" org.eclipse.swt.SWTException: Failed to execute runnable (org.eclipse.swt.SWTException: Failed to execute runnable (org.eclipse.swt.SWTException: Widget is disposed))
    at org.eclipse.swt.SWT.error(Unknown Source)
    at org.eclipse.swt.SWT.error(Unknown Source)
    at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Unknown Source)
    at org.eclipse.swt.widgets.Display.runAsyncMessages(Unknown Source)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
    at net.trevize.galate.Galate.main(Galate.java:209)
    Caused by: org.eclipse.swt.SWTException: Failed to execute runnable (org.eclipse.swt.SWTException: Widget is disposed)
    at org.eclipse.swt.SWT.error(Unknown Source)
    at org.eclipse.swt.SWT.error(Unknown Source)
    at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Unknown Source)
    at org.eclipse.swt.widgets.Display.runAsyncMessages(Unknown Source)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
    at net.trevize.galate.Galate.init(Galate.java:146)
    at net.trevize.galate.Galate$1GalateThread.run(Galate.java:186)
    at org.eclipse.swt.widgets.RunnableLock.run(Unknown Source)
    ... 4 more
    Caused by: org.eclipse.swt.SWTException: Widget is disposed
    at org.eclipse.swt.SWT.error(Unknown Source)
    at org.eclipse.swt.SWT.error(Unknown Source)
    at org.eclipse.swt.SWT.error(Unknown Source)
    at org.eclipse.swt.widgets.Widget.error(Unknown Source)
    at org.eclipse.swt.widgets.Widget.getDisplay(Unknown Source)
    at net.trevize.galate.ImageLoaderPoolThread$ImageUpdaterThread.run(ImageLoaderPoolThread.java:38)
    at org.eclipse.swt.widgets.RunnableLock.run(Unknown Source)
    ... 10 more
    Y aurait-il quelque chose que je n'ai vraiment pas compris dans SWT ?
    Merci beaucoup si vous avez une idée !

  2. #2
    Membre averti

    Profil pro
    Inscrit en
    Août 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2006
    Messages : 218
    Points : 305
    Points
    305
    Par défaut
    Bonjour,

    Il est normal qu'on ne puisse pas créer deux objets display, celui-ci doit être unique...

    Ensuite, le thread SWT est unique, donc créer deux thread qui gèrent chacun une fenêtre n'est pas une bonne approche avec cette librairie...

    Pour avoir deux fenêtre indépendantes, je te conseille cela :

    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
    35
    36
     
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.layout.FillLayout;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Label;
    import org.eclipse.swt.widgets.Shell;
     
    public class Exemple {
     
        public static void main(String[] args) {
            Display display = new Display();
            final Shell shell1 = new Shell(display);
            shell1.setLayout(new FillLayout());
            final Label label1 = new Label(shell1, SWT.NONE);
            label1.setText("  Première fenêtre  ");
     
     
            final Shell shell2 = new Shell(display);
            shell2.setLayout(new FillLayout());
            final Label label2 = new Label(shell2, SWT.NONE);
            label2.setText("  Seconde fenêtre  ");        
     
            shell1.setSize(200, 200);
            shell1.open();
     
            shell2.setSize(200, 200);
            shell2.open();
     
            while (!shell1.isDisposed() || !shell2.isDisposed()) {
                if (!display.readAndDispatch())
                    display.sleep();
            }
            display.dispose();
        }
     
    }
    Laurent

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 28
    Points : 29
    Points
    29
    Par défaut
    Bonjour laurent et merci pour ta réponse.

    Cependant, c'est déjà ce que je fais. (et c'était une affirmation: sous Linux on ne peut créer qu'un seul display, sous d'autres plateformes comme windows, apparemment on peut en instancier plusieurs, mais ce n'est pas recommandé tout simplement parce que le code n'est plus portable...)

    Mon problème est que chaque shell instancie un thread en background pour des calculs un peu lourd sur le rendu de la fenetre.

    En fait, je voudrais avoir tout simplement, deux shell complètement indépendante !!
    C'est pourtant pas compliqué, mais je ne comprend pas la philosophie de SWT à ce point de vue...

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 28
    Points : 29
    Points
    29
    Par défaut
    Dernière maj avant de flagger la discussion comme résolue.

    En fait, une solution était d'utiliser des verrous, mais la mise à jour de l'affichage de mes fenêtres posait problèmes quand je lançais mon thread de rendu (c'est du traitement d'image), comme si le thread était bloquant...
    J'ai résolu le problème en créant un thread classique pour le rendu, qui lui même lance de temps en temps un thread de mise à jour de la GUI via display.asyncexe(...) (et qui peut donc lancer des opérations SWT GUI) (c'est franchement déroutant d'ailleurs cette histoire d'accès au thread UI avec SWT...).

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

Discussions similaires

  1. Créer un mini-shell dans une application
    Par neuro6 dans le forum C++
    Réponses: 6
    Dernier message: 01/11/2007, 11h59
  2. Réponses: 3
    Dernier message: 29/05/2007, 20h37
  3. Ouvrir plusieurs fenêtres dans une application
    Par okonkole dans le forum GTK+
    Réponses: 6
    Dernier message: 03/04/2007, 15h06
  4. Plusieurs langages dans une application ?
    Par kayzra dans le forum Langages de programmation
    Réponses: 8
    Dernier message: 27/03/2007, 08h37
  5. Réponses: 8
    Dernier message: 17/03/2004, 14h40

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