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, petits éclaircissements requis :)


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
    Septembre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 35
    Par défaut SwingWorker, petits éclaircissements requis :)
    Bonjour,

    Je développe actuellement une petite application qui génère un pdf, cependant ma génération de pdf étant relativement lourde, je suis passé par un swingworker pour la faire, et ainsi, pouvoir, normallement, mettre à jour en parallèle une barre de progression.

    Cependant je m'emmele les pinceaux, ça fait plusieurs jours que je parcours les forums, les tutos java, mais je n'arrive pas à l'adapter à mon cas.

    Pour ma part je m'y suis pris de la sorte
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    class SwingWorkerCreatePDF extends SwingWorker <String, String>
    {
     
    	/* declaration variables */
     
    	public SwingWorkerCreatePDF () { super(); }
     
    	public SwingWorkerCreatePDF(...)
    	{
    	    /* affectations */
    	}
     
    	protected String doInBackground()
    	{
    	    System.out.println("[DEB] doInBackgroung()");
     
    	    try {
    		String res = createPdf(...);
    		return res;
    	    } catch(PdfConversionException e)
    	    {
    		javax.swing.JOptionPane.showMessageDialog(null, e.toString(), "Error", javax.swing.JOptionPane.ERROR_MESSAGE);
    		appStatusBar.setProgressBarVisible(false);
    		return null;
    	    }
    	}
     
    	protected void done()
    	{
     
    	    try
    	    {
    		lastCreatedPdf = get();
    		if(lastCreatedPdf!=null)
    		    appStatusBar.setProgressBarVisible(false,"Finished.");
    		else
    		    appStatusBar.setProgressBarVisible(false,"Failed to generate PDF");
     
    	    }   catch (Exception ignore) {
    		ignore.printStackTrace();
    	    }
     
    	}
    }
    je fais donc appel à mon SwingWorker dans une fonction qui contient uniquement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public String createPdfThread(){
            testSW = new SwingWorkerCreatePDF(...);
            testSW.execute();
            return lastCreatedPdf;
    }
    Et là où doit être le problème, c'est que je met à jour ma progressbar depuis la fonction "createPdf", à chaque fois que j'ai fini une étape de ma fonction, je lui affecte une nouvelle valeur, mais çe ne réalise pas tous mes changements de valeur. Je pense qu'un problème doit venir de ma conception mais j'avoue m'être emmêlé les pinceaux.
    Du coup actuellement je passe par une progressbar en indeterminate, et au moins, j'ai quelque chose de visuel, mais qui ne donne pas vraiment d'information, même si ma progressbar est accompagnée d'un label que je met également à jour.

    Auriez vous une idée ?

    Petite question supplémentaire, parfois, dans une fonction encore plus longue, je voudrais appeler ce Swingworker par l'intermédiaire de createPdfThread(), mais, bien qu'en mettant un get() dans la méthode done(), (d'après un tuto, le done n'est pas forcément appelé à la fin du doInBackground apparement mais bon ça m'a plus embrouillé qu'autre chose :/) le code suivant l'appel de mon swingworker s'execute avant que celui ci ne soit terminé et du coup, il plante car j'ai besoin que mon swingworker se termine auparavant pour récupérer le pdf, mais je ne veux pas pour autant freezer mon interface :/

    Voilà en espérant avoir été suffisamment clair, s'il y a besoins d'éclaircissements n'hésitez pas !

    Merci d'avance pour vos conseils

  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
    Citation Envoyé par nuts62 Voir le message
    Et là où doit être le problème, c'est que je met à jour ma progressbar depuis la fonction "createPdf", à chaque fois que j'ai fini une étape de ma fonction, je lui affecte une nouvelle valeur, mais çe ne réalise pas tous mes changements de valeur.
    Tu fais cela comment ???


    Citation Envoyé par nuts62 Voir le message
    (d'après un tuto, le done n'est pas forcément appelé à la fin du doInBackground apparement mais bon ça m'a plus embrouillé qu'autre chose :/)
    Faux : le done() est bien exécuté à la fin de la tâche du SwingWorker... sauf bien sûr si tu arrêtes brutalement ton application !

    Citation Envoyé par nuts62 Voir le message
    le code suivant l'appel de mon swingworker s'execute avant que celui ci ne soit terminé et du coup, il plante car j'ai besoin que mon swingworker se termine auparavant pour récupérer le pdf, mais je ne veux pas pour autant freezer mon interface :/
    Normal puisque le code d'appel du SwingWorker se contente de lancer l'exécuter en tâche de fond.

    Pour exécuter un traitement dans l'UI à la fin de la tâche il faut justement utiliser la méthode done()...

    a++

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 35
    Par défaut
    Tu fais cela comment ???
    J'ai créé une classe StatusBar qui contient une progressbar et un jlabel, que je mets à jour via setProgressBarValue(value,text) ou juste setProgressBarValue(value)

    Faux : le done() est bien exécuté à la fin de la tâche du SwingWorker... sauf bien sûr si tu arrêtes brutalement ton application !
    C'est ce passage qui m'a mis le doute
    SwingWorker ne garantit pas que la méthode done sera appelée après tous les appels à process. Ainsi, si vous mettez dans la méthode done l'affichage d'une ligne supplémentaire dans le textarea, cette ligne ne se trouvera pas forcément en dernière dans le textarea.
    Mais en fait je me suis juste enbrouillé au temps pour moi

    Normal puisque le code d'appel du SwingWorker se contente de lancer l'exécuter en tâche de fond.

    Pour exécuter un traitement dans l'UI à la fin de la tâche il faut justement utiliser la méthode done()...
    J'ai refait un SwingWorker spécifique à cette tache plus longue, mais il me fait toujours mes opérations en vrac, en gros, dans ma longue tache, tout à la fin, pour les 2 actions qui sont les plus lourdes, j'ai fais un swingworker, je fais ma première tache (creation de pdf) dans le doInBackground, et dans le done(), après avoir fait un get(), je fais ma seconde tache, et pourtant ... il ne me le fais toujours pas dans l'ordre :/

  4. #4
    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
    Désolé, mais sans un bout de code (compilable si possible), qui montre ce que tu fais, ca va être très dur de trouver l'origine du problème...


    a++

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 35
    Par défaut
    Pour du code compilable ça va être compliqué puisque beaucoup de choses s'imbriquent, mais voilà au moins mon swingworker, si jamais j'y ai déjà fait une erreur

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
        class SwingWorkerPublishWithPdf extends SwingWorker <String, String>
        {
     
    /* declaration variables */
     
            public SwingWorkerPublishWithPdf () { super(); }
     
            public SwingWorkerPublishWithPdf(...)
            {
    /* affectation */
            }
     
            protected String doInBackground()
            {
                System.out.println("[DEB] doInBackgroung()");
     
                try {
                    appMainFrame.setCursor(new Cursor(Cursor.WAIT_CURSOR));
                    String res = createPdf(...);
                    return res;
                } catch(PdfConversionException e)
                {
                    javax.swing.JOptionPane.showMessageDialog(null, e.toString(), "Error", javax.swing.JOptionPane.ERROR_MESSAGE);
                    appStatusBar.setProgressBarVisible(false);
                    return null;
                }
            }
     
            protected void done()
            {
     
     
     
                try
                {
     
                    lastCreatedPdf = get();
                    if(lastCreatedPdf!=null){
                        File f = new File(lastCreatedPdf);
    // la fameuse fonction qui ne doit s'executer qu'une fois la création de pdf réalisée et réussie
                        publish(..);
                        appMainFrame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
                    }
     
                }   catch (Exception ignore) {
                    ignore.printStackTrace();
                }
     
     
     
            }
        }

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 35
    Par défaut
    Finalement je suis parvenu à mes fins en me servant de la méthode setProgress(int) et en ajouter un PropertyChangeListener pour maintenir ma barre de progression à jour et ça fonctionne. Après une petite pause, les idées plus claire ça va tout de suite mieux
    Merci pour ton aide en tout cas !

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

Discussions similaires

  1. [Débutant] Héritage petit éclaircissement.
    Par MoThA dans le forum C#
    Réponses: 2
    Dernier message: 13/02/2014, 16h29
  2. Réponses: 0
    Dernier message: 11/09/2011, 17h29
  3. un petit éclaircissement sur la syntaxe
    Par JeanNoel53 dans le forum NetBeans
    Réponses: 3
    Dernier message: 04/11/2010, 10h19
  4. un petit éclaircissement sur free()
    Par minibus dans le forum Débuter
    Réponses: 9
    Dernier message: 29/07/2009, 11h35
  5. Petit éclaircissement sur la fonction to_days
    Par monstor dans le forum Requêtes
    Réponses: 4
    Dernier message: 15/04/2009, 12h27

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