Salut,
Je suis ammené à faire une copie d'un fichier local vers un serveur distant.
J'ai donc trouvé une fonction qui marche parfaitement, mais quand on copie des gros fichiers, celà prend du temps. Du coup, j'aimerai faire un JProgressBar et l'intégrer à cette fonction.
Voici ce que j'ai fait :
Je précise que cette fonction est appelée lors d'un clic de bouton, dans un ActionListener. Pour afficher ma jdialog sans que celà ne gèle le traitement, je le met visible dans un thread approprié, puisque l'appel à invokeLater de SwingUtilities donnerai un affichage apres le traitement (qui est appelé dans un event, je le rappelle).
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75 private void copyFile(File in, File out) { FileChannel inChannel=null; FileChannel outChannel=null; try { JProgressBar progressBar = new JProgressBar(); /*progressBar.setIndeterminate(true); progressBar.setVisible(true);*/ //progressBar.setIndeterminate(false); inChannel = new FileInputStream(in).getChannel(); outChannel = new FileOutputStream(out).getChannel(); /**specially for windows cases**/ // magic number for Windows, 64Mb - 32Kb) int maxCount = (64 * 1024 * 1024) - (32 * 1024); long size = inChannel.size(); long position = 0; progressBar.setStringPainted(true); progressBar.setMaximum((int)(size/maxCount)); progressBar.setMinimum(0); progressBar.setValue(0); final JDialog jd=new JDialog((JFrame)null, true); jd.setSize(400,150); jd.add(progressBar); jd.setLocationRelativeTo(null); new Thread(new Runnable() { public void run() { System.out.println("setting progressbar visible"); jd.setVisible(true); } } ).start(); //progressBar.setVisible(true); while (position < size) { position += inChannel.transferTo(position, maxCount, outChannel); progressBar.setValue(new Long(position).intValue()); progressBar.setString(position/maxCount+"/"+size/maxCount); } jd.dispose(); //progressBar.close(); System.out.println("end of copy"); }catch(Exception e) { e.printStackTrace(); } finally { } }
Or, le problème est qu'on se retrouve avec une jdialog qui s'affiche mais dans laquelle rien n'est affiché pendant le traitement (bug d'affichage "gel" classique à java) et lorsque le traitement est fini, elle s'affiche bien si on ne dispose pas, sinon elle dispose tout simplement.
J'aimerai savoir pourquoi, et comment je peux y remédier pour bien afficher mon traitement.
Merci
Fred










Répondre avec citation





Partager