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

EDT/SwingWorker Java Discussion :

EDT attendre sans bloquer GUI


Sujet :

EDT/SwingWorker Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 48
    Par défaut EDT attendre sans bloquer GUI
    Bonjour,
    mon problème est le suivant:

    Je veux me passer des JOptionPane (ils ont un bug pas encore corrigé à ce jour qui bloque mon appli).

    J'ai pensé utiliser le GlassPane des JFrame et des JDialog, lorsque je veux envoyer une message à l'utilisateur ou lui poser une question, au lieu de lui donner un JOptionPane, je donne un JPanel au GlassPane de son JDialog, sur lequel je met un label et un bouton (voir plusieurs si je lui pose une Yes/No question par exemple).

    Donc je suis sur l'EDT et je ne veux pas en sortir... Je voudrais en gros, rendre modal le glasspane.

    Voici à peu prés mon 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
     
    	private void methode() {
    		Object o=new Object();
    		System.out.println( "je vais afficher le glasspane" );
    		try {
    			SwingUtilities.invokeLater( new Runnable() {
    				@Override
    				public void run() {
    					getMonJDialog().afficherMonGlassPane(o);
    				}
    			} );
    		} catch ( Exception e ) {
    			e.printStackTrace();
    		}
    		o.wait();//Je fais un wait, le notify sera dans la methode actionPErformed du bouton se trouvant dans le glasspane
    		System.out.println( "j'ai fermé le glasspane" );
    	}
    Je lance donc mon affichage, puis je me met en wait. Quand on cliquera sur le bouton du glasspane, on aura un notify qui me fera sortir du sommeil.

    Problème: ça freeze! le glasspane ne s'affiche jamais: l'EDT se bloque sur le wait et n'affiche jamais mon glasspane...

    Une idée SVP?

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Citation Envoyé par kaoualeo Voir le message
    Problème: ça freeze! le glasspane ne s'affiche jamais: l'EDT se bloque sur le wait et n'affiche jamais mon glasspane..
    Ben c'est normal : tu fais un wait(), et donc tu endors l'EDT. Il ne peut plus faire son travail...


    Par curiosité, quel est le bug de JOptionPane qui te pose problème ?

    a++

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 48
    Par défaut
    Aléatoirement (en tout cas, je n'ai pas pu trouver de lien entre les fois ou ça se produit), ils perdent le focus...

    Je dis bug car visiblement il y aurait un report à se propos sur le site de sun (je n'en ai pas le numéro: source: mon collègue qui est en congés!)

    Je comprend pourquoi le wait() bloque le GUI. Mais j'aimerai trouver une façon de rendre le glasspane modal, j'essaye d'explorer cette solution avec le wait(), mais je suis preneur si y'a une autre solution!

    Il me faudrait un truc du genre invokeAndWait sauf que je suis déjà sur l'EDT.

  4. #4
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Ce que tu demandes se trouve ici :glasspane modale

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 48
    Par défaut
    Citation Envoyé par herve91 Voir le message
    Ce que tu demandes se trouve ici :glasspane modale
    Je mets résolu: le tuto cité plus haut convient parfaitement à ma demande.

    Merci encore!

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 48
    Par défaut
    Bon, une question additionnelle...

    J'ai utilisé le tutoriel cité ci-dessus, adapté à mes besoins.

    Au lieu de mettre un new JOptionPane dans le GlassPane, j'ai créé mon propre JPanel.

    Jusque là, rien de bien sorcier...
    Tout fonctionne bien sauf une chose: j'ai mis un JTextArea et on ne peut rien y saisir! Pourtant il est bien visible, mais il est comme enabled(false), d'ailleurs, j'ai mis du texte dedans et on ne peut meme pas le selectionner avec la souris.

    Une idée du pourquoi du comment?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 48
    Par défaut
    Citation Envoyé par kaoualeo Voir le message
    Bon, une question additionnelle...

    J'ai utilisé le tutoriel cité ci-dessus, adapté à mes besoins.

    Au lieu de mettre un new JOptionPane dans le GlassPane, j'ai créé mon propre JPanel.

    Jusque là, rien de bien sorcier...
    Tout fonctionne bien sauf une chose: j'ai mis un JTextArea et on ne peut rien y saisir! Pourtant il est bien visible, mais il est comme enabled(false), d'ailleurs, j'ai mis du texte dedans et on ne peut meme pas le selectionner avec la souris.

    Une idée du pourquoi du comment?
    Autant pour moi...

    C'est le setInputVerifier qui fait ça...

  8. #8
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Ben tu ne peux pas bloquer l'EDT justement...

    JOptionPane et JDialog "trichent" en relançant la boucle de traitement de l'EDT pour simuler le blocage. En fait l'EDT continue à travailler dans un seconde boucle, et reviendra dans la boucle initiale à la fin du "modal"...


    Perso je te conseillerais plutôt de te documenter sur ce bug du JOptionPane afin de trouver une solution de contournement...


    a++

    PS @herve91 : tiens je ne me souvenais plus de ce code !
    Attention toutefois car c'est juste un proof-of-concept qu'il faut surement débugger un peu

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 48
    Par défaut
    Merci à vous deux!
    Je regarde justement le code de l'autre discussion, vraiment intéressant, je me coucherai pas bête au moins ce soir: j'ai le pouvoir de forcer la file d'exécution de l'EDT!!!

    Mais c'est sur, le mieux est de trouver pourquoi JOptionPane ne fonctionne pas bien sur mon appli.

    Je crois que c'est apparu depuis la version 1.6.15 ou un truc comme ça. Ce qui est sur c'est que je n'ai aucun problème avec la 1.6.11.
    Étrange...

    Merci encore!

  10. #10
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Je te conseillerait de passer par un JXLayer pour tout ce qui concerne le bloquage de l'UI.

    Cf:
    http://weblogs.java.net/blog/alexfro...r_30_lock.html

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 48
    Par défaut
    J'ai l'impression que LockableUI sert à geler un GUI pendant que l'appli continue de tourner en background.

    Moi c'est l'inverse je veux bloquer l'appli en milieu de méthode en attendant un evenement sur le GUI.

    L'API est sympa, mais Je me suis déjà inspiré de l'excellent tutoriel de Romain Guy pour faire ça... (bon il consomme pas mal de cpu, peut etre que ce n'est pas le cas de LockableUI)

  12. #12
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    PS @herve91 : tiens je ne me souvenais plus de ce code !
    Attention toutefois car c'est juste un proof-of-concept qu'il faut surement débugger un peu
    J'ai confiance

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

Discussions similaires

  1. [Débutant] Attendre sans bloquer l'application
    Par EmilleMetz dans le forum VB.NET
    Réponses: 8
    Dernier message: 27/04/2015, 22h59
  2. Réponses: 8
    Dernier message: 10/10/2011, 14h45
  3. Réponses: 4
    Dernier message: 22/12/2006, 11h12
  4. executer code sans bloquer l'aplication
    Par laftah71 dans le forum Access
    Réponses: 2
    Dernier message: 10/11/2006, 19h00
  5. Afficher un message sans bloquer les autres traitements??
    Par Ben_Le_Cool dans le forum Langage
    Réponses: 7
    Dernier message: 13/10/2005, 01h21

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