ProgressMonitorDialog / JFace
Bonjour,
Je suis en train de programmer, sous Java / JFace, une application qui liste tous les fichiers
d'un répertoire passé en paramètre (la liste inclus aussi les sous-répertoires).
A la fin du traitement, un fenêtre s'ouvre et affiche la liste.
Jusque là, çà marche.
Sachant que le temps de traitement peut être long, j'ai prévu d'afficher une fenêtre de progression (ProgressMonitorDialog).
Le problème est que je perds le focus de la fenêtre de progression dès le début : ma trace m'indique en log que la prise en compte se fait correctement mais je n'ai aucune vision de cette fenêtre.
Fenêtre JFace
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
WorkLessOperation wlo = null;
try {
wlo = new WorkLessOperation(true);
new ProgressMonitorDialog(shell).run(true, true, wlo);
} catch (InvocationTargetException e) {
MessageDialog.openError(shell, "Erreur", e.getMessage());
} catch (InterruptedException e) {
MessageDialog.openInformation(shell, "Annulée", e.getMessage());
display.dispose();
return;
}
final ArrayList<ElmFusion> liste = initListe(param);
wlo.setFin();
wlo = null;
// Affichage page .... |
Action de ma ProgressMonitorDialog
Code:
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
|
public class WorkLessOperation implements IRunnableWithProgress {
private static final int TOTAL_TIME = 10000;
private static final int INCREMENT = 500;
private boolean indeterminate;
IProgressMonitor monitor;
Timer timer;
public WorkLessOperation(boolean indeterminate) {
this.indeterminate = indeterminate;
}
public void run(final IProgressMonitor monit) throws InvocationTargetException,
InterruptedException {
monitor = monit;
monitor.beginTask("Opération en cours", indeterminate ?
IProgressMonitor.UNKNOWN : TOTAL_TIME);
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
System.out.println("DEBUT"); // Trace de debugging
monitor.worked(INCREMENT);
System.out.println("FIN"); // Trace de debugging
}
} , INCREMENT, INCREMENT);
if (this.monitor.isCanceled()) {
timer.cancel();
throw new InterruptedException("Opération annulée");
}
}
public void setFin() {
timer.cancel();
monitor.done();
}
} |
Merci à ceux qui prendront le temps de lire ce message et de réfléchir à mon problème.