Bonjour à tous,
Je suis en train de travailler sur un projet d'une application qui devra scanner un dossier et afficher en plein écran les fichiers (pdf, images et vidéos) de ce dossier.
Voici comment mon code est organisée :
Une classe IHM qui s'occupe de l'interface graphique
Une classe qui s'occupe de parcours le dossier et des classes qui gère chacun des types de fichier (ces classes pour les types de fichiers sont des threads).
J'arrive pour l'instant bien à gérer l'affichage d'un seul fichier. Le problème apparaît avec plusieurs fichiers. Pour l'instant je veux essayer d'afficher deux fichiers pdf l'un après l'autre.
Ma classe de parcours de dossier construit un tableau des fichiers présents dans ce dossier et traite chacun des fichiers. Seulement, il faut attendre la fin du traitement du fichier précédent (par exemple, j'affiche chaque page d'un pdf pendant 5 secondes, et il faut attendre la fin de l'affichage du fichier entier pour passer au fichier suivant). Pour faire ça, le traitement d'un fichier se fait dans un thread à part et je fais appel à la méthode join() pour attendre la fin de l'affichage.
Le problème que j'ai est que ça me bloque apparemment l'affichage des pages. Je m'explique : le traitement d'affichage se fait bien mais rien n'apparaît mais si je n'attends pas la fin du fichier, là les fichiers s'affichent bien (bien sûr il s'affiche sans attendre que le fichier précédent se soit affiché pendant la période voulu et ce n'est donc pas ce que je cherche).
J'ai aussi essayer en synchronisant et en faisant wait() pour attendre la fin du traitement puis notify() pour avertir qu'on peut passer au fichier suivant mais ça ne marche pas non plus !
Je vous mets ici des extraits de mes classes :
un extrait de la classe de parcours de dossier pour traiter les .pdf :
Un extrait de la classe gestionPdf qui s'occupe d'afficher correctement le composant qui gère les pdf (je me suis servi de l'API PDFRenderer), elle délègue le traitement du parcours par page à un autre thread.
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 private void afficherPdf(File fichierPdf) { GestionPdf pdfFile = new GestionPdf(fichierPdf, this); affichage.rafraichir(pdfFile.getPanel()); pdfFile.start(); try { pdfFile.join(); } catch (InterruptedException e) { IHM.erreur("Problème lors de l'attente de fin de Thread PDF"); e.printStackTrace(); } finally { IHM.erreur("le thread pdf est fini"); } }
et enfin un extrait de la classe qui affiche le pdf page par page (5 secondes par page)
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 public void run() { IHM.erreur(this.getName() + " commence."); TimerPdf actionPdf = new TimerPdf(this); actionPdf.start(); try { actionPdf.join(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { IHM.erreur(this.getName() + " s'arrete."); } } public void goToPage(int numPage) { PDFPage page = curFile.getPage(numPage+1); panel.showPage(page); IHM.erreur("OK 2!"); panel.requestFocusInWindow(); }
Voilà, rien que ça !
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 public void run() { parcourirPdf(); } private synchronized void attendre(int duree) { try { this.sleep(duree); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void parcourirPdf() { for(int i=0;i<nbPages;i++) { gererPdf.goToPage(pageCourante); pageCourante++; attendre(2000); } }
J'ai l'impression que quand on fait le join() ça "endort" l'affichage qui ne se rafraichit plus.
Si quelqu'un a une idée d'où pourrait venir le problème, merci d'avance !
Partager