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