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 :

[SwingWorker] Thread.sleep(x) et done()


Sujet :

EDT/SwingWorker Java

  1. #1
    Membre régulier Avatar de SpecialCharacter
    Inscrit en
    Mai 2007
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 73
    Points : 72
    Points
    72
    Par défaut [SwingWorker] Thread.sleep(x) et done()
    Bonjour

    Pour la réalisation d'une application qui effectue une tâche longue (génération d'un fichier PDF par le biais d'iText), j'ouvre une fenêtre qui comporte une jprogressbar afin de témoigner de l'activité, après un click sur le bouton de génération. Rien de plus classique

    J'aimerais cependant fermer l'application 1 seconde après la réussite de la génération du fichier PDF.
    J'ai essayé un Thread.sleep(1000) accompagné d'une fermeture des JFrames dans la surcharge du done() ou du publish(2) (où 2 permet l'avertissement du succès de l'opération) cependant ça ne fonctionne pas.

    Je pense que la raison est que le thread se pause alors que le doInBackground() est déjà terminé et que donc ce thread n'a plus lieu d'être ?
    J'ai essayé de mettre le thread.sleep() avant le return du doinbackground mais done() attend que doinBG soit terminé pour s'executer et faire son publish(2) (succès de l'opération)

    Auriez vous une solution afin de montrer une seconde que tout s'est bien déroulé puis de fermer l'application ?
    Auriez vous également une solution plus propre que la mienne pour fermer l'application ? Parce que ça n'est pas propre d'utiliser ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for (java.awt.Frame frame : monPackage.monUI.getFrames())
    {
    frame.dispose();
    }
    Merci de votre lecture et bonne suite

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 64
    Points : 72
    Points
    72
    Par défaut
    Affiche une message box mais bon, ce n'est peut-être pas ce que tu cherches si cette tâche est en background

    Il faut peut-être que tu sortes la logique d'attendre 1sec du thread qui exécute la tâche pour la mettre, par exemple au niveau de la partie qui fait avancer ta JProgressBar avec un truc style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ... code qui fait évoluer la progressBar
    if (progressBar.getValue() >= progressBar.getMaximum()) {
     wait(1000)
    }

  3. #3
    Membre régulier Avatar de SpecialCharacter
    Inscrit en
    Mai 2007
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 73
    Points : 72
    Points
    72
    Par défaut
    Ta solution serait possible si j'avais rajouté un listener à la barre de progression ce qui n'est pas le cas (je la setIndeterminate(true) quand il y a traitement, puis setIndeterminate(false) et setValue(1) quand c'est terminé ou setValue(0) quand il y a une erreur)

    Il faudrait que je fasse une pause dans l'exécution du doInBackground(). Le problème réside dans le fait que le done prend execution qu'à condition du retour du doInBackground()...

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 64
    Points : 72
    Points
    72
    Par défaut
    Quand tu dit "une application" tu parles d'un process java indépendant qui se lance via un main ou bien une frame appartenant a une application plus conséquente dont la création du PDF en background se fait pendant que l'on fait autre chose?

    En ce qui concerne la pause d'une seconde, alors remonte encore d'un cran dans le stack d'exécution et place ton wait(1000) au niveau de ta JFrame avant la fermeture.

    La fermeture de la fenêtre est un travail pour la fenêtre elle-même ou son container (dans le cas d'une JInternalFrame par exemple, ou de la la class controller qui contient le main éventuellement).

    Ton thread qui crée le PDF il n'a pas à décider de se mettre en pause avant la fermeture de la fenêtre car il n'a pas conscience d'être dans cette fenêtre.

    Pour la fermeture en elle-même, si ta frame est une application indépendante tournant dans un process java indépendant, çà revient a cliquer sur le JBouton "Quit" d'une application Swing, donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Runtime.getRuntime().exit(0);
    devrait faire l'affaire.

    Si c'est une frame parmis d'autre du même process java,

    est une bonne solution... mais je crois qu'on sait pas trop ce que çà fait dispose(), notamment si on rappelle la frame dans la foulée (à tester, j'ai un trou de mémoire lol).

  5. #5
    Membre régulier Avatar de SpecialCharacter
    Inscrit en
    Mai 2007
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 73
    Points : 72
    Points
    72
    Par défaut
    Ta solution me convient, merci

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

Discussions similaires

  1. SwingWorker Thread et JProgressBar
    Par keub51 dans le forum EDT/SwingWorker
    Réponses: 8
    Dernier message: 13/02/2008, 15h52
  2. Timers, boucles d'affichage et Thread.sleep
    Par Silk_do_Nadear dans le forum Développement 2D, 3D et Jeux
    Réponses: 10
    Dernier message: 28/07/2007, 01h49
  3. [Prbl] Thread(image ne s'affichant pas avant le thread.sleep
    Par stephane92400 dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 26/06/2006, 11h57
  4. [Thread] PB Thread.sleep(1000) marche pas
    Par kliel dans le forum Concurrence et multi-thread
    Réponses: 6
    Dernier message: 03/12/2004, 13h47
  5. [Thread]sleep()
    Par jokoss dans le forum Concurrence et multi-thread
    Réponses: 15
    Dernier message: 03/07/2004, 14h33

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