Précédent   Forum du club des développeurs et IT Pro > Java > Interfaces Graphiques en Java > SWT/JFace
SWT/JFace Forum d'entraide pour les API SWT/JFace. Avant de poster -> FAQ SWT/JFace
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 13/07/2012, 11h00   #1
Gaspard22
Invité régulier
 
Homme
Développeur Java
Inscription : juillet 2012
Messages : 36
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur Java
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juillet 2012
Messages : 36
Points : 7
Points : 7
Par défaut ProgressBar sous MAC OSX

Bonjour,

J'effectue un développement sous Mac Lion et Windows. Mon problème se trouve dans la gestion graphique du Mac de ma barre de progression.

Dans ma méthode, je lance une ProgressBar indeterminate , et puis je lance un thread qui exécute sa partie de code de son coté.

Le thread en prenant fin, ferme la boucle du Shell et celui-ci donc.
Cela marche très bien sous windows, celui-ci gérant le multi-threading graphique.

Sous mac, la barre de progression ne prend pas le focus et lorsque l'exécution de mon thread est terminée, la barre continue jusqu'à ce que je clique sur mon shell de barre de progression.
Et si je met le focus sur la barre de progression , celui ci attend un évènement graphique pour disparaitre.

N'étant pas un spécialiste du Mac, quelqu'un pourrait-il m'aider?
Merci d'avance
Gaspard22 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2012, 10h09   #2
Gueritarish
Modérateur
 
Avatar de Gueritarish
 
Homme Marc
Développeur Java
Inscription : mai 2007
Messages : 1 567
Détails du profil
Informations personnelles :
Nom : Homme Marc
Âge : 28
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur Java
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2007
Messages : 1 567
Points : 3 430
Points : 3 430
Salut,

Plutôt que d'essayer de gérer toi même une boite de dialogue qui affiche une barre de progression (ce que je devine?), pourquoi ne pas utiliser une déjà faite?
Avec JFace, tu peux utiliser une ProgressMonitorDialog. Petit exemple d'implémentation:
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
42
43
44
45
46
47
48
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setLayout(new GridLayout());
final Button button = new Button(shell, SWT.PUSH);
button.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
button.setText("Launch");
button.addSelectionListener(new SelectionAdapter() {
  /**
   * {@inheritDoc}
   */
  @Override
  public void widgetSelected(final SelectionEvent anEvent) {
    final IRunnableWithProgress runnable = new IRunnableWithProgress() {
 
      @Override
      public void run(final IProgressMonitor monitor)
          throws InvocationTargetException, InterruptedException {
        monitor.beginTask("Long treatment...", IProgressMonitor.UNKNOWN);
        monitor.subTask("Performing the long treatment...");
        Thread.sleep(2000);
        monitor.done();
        display.asyncExec(new Runnable() {
          @Override
          public void run() {
            if (shell != null && !shell.isDisposed()) {
              shell.dispose();
            }
          }
        });
      }
    };
    try {
      new ProgressMonitorDialog(shell).run(true, false, runnable);
    } catch (final InvocationTargetException iException) {
      iException.printStackTrace();
    } catch (final InterruptedException iException) {
      iException.printStackTrace();
    }
  }
});
 
shell.pack();
shell.open();
while (!shell.isDisposed()) {
  if (!display.readAndDispatch())
    display.sleep();
}
display.dispose();
Je n'ai pas testé sous Mac, mais je pense que ça devrait aider pour ton problème...

Voilà, à+
Gueritarish
__________________
Pas de questions technique par MP, les forums sont là pour ça.

Le 5 et 6 juin à Toulouse, la première EclipseCon France !
Gueritarish est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/07/2012, 16h57   #3
Gaspard22
Invité régulier
 
Homme
Développeur Java
Inscription : juillet 2012
Messages : 36
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur Java
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juillet 2012
Messages : 36
Points : 7
Points : 7
Pour expliquer plus en détail, ce n'est pas une boite de dialogue, juste un repère visuel pour informer l'utilisateur qu'il y a un traitement en cours et qu'il doit vérifier son lecteur de carte.
donc c'est juste un shell, comportant une Progressbar inderterminate, qui se termine quand le thread est terminé.

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
 
GridLayout layout = new GridLayout(1, false);
		Shell shellt = new Shell(Display.getDefault(), SWT.TITLE);
		shellt.setLayout(layout);
		Composite toto = new Composite(shellt, SWT.CENTER);
		GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, false);
 
		toto.setLayoutData(gridData);
ProgressBar bar = new ProgressBar(toto, SWT.INDETERMINATE | SWT.ON_TOP);
		bar.setSize(200, 32);
		shellt.setBackground(color);
		shellt.setSize(210, 80);
		centrerSurEcran(shellt);
		shellt.open();
 
 
		progressBar dfsd = new progressBar(param, action);
		dfsd.start();
 
 
		while (!shellt.isDisposed() && dfsd.isAlive()) {
 
			if (!Display.getDefault().readAndDispatch())
				Display.getDefault().sleep();
		}
 
		shellt.dispose();
et donc ne connaissant pas Jface, je ne suis pas sur de ta réponse et le besoin de l'objet proposé.
cdt
Gaspard22 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/07/2012, 17h40   #4
Gaspard22
Invité régulier
 
Homme
Développeur Java
Inscription : juillet 2012
Messages : 36
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur Java
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juillet 2012
Messages : 36
Points : 7
Points : 7
Par défaut Résolu

Effectivement, cela à résolu mon problème , même si le coté graphique est moins beau, mais merci
Gaspard22 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2012, 10h44   #5
Gueritarish
Modérateur
 
Avatar de Gueritarish
 
Homme Marc
Développeur Java
Inscription : mai 2007
Messages : 1 567
Détails du profil
Informations personnelles :
Nom : Homme Marc
Âge : 28
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur Java
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2007
Messages : 1 567
Points : 3 430
Points : 3 430
Salut,

Je peux pas tester sous Mac, mais est-ce que tu obtiens quelque chose de fonctionnel avec ce code:
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
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
public static void main(final String[] args) {
  final Display display = new Display();
  final Shell shell = new Shell(display);
  shell.setLayout(new GridLayout(1, false));
 
  final Composite composite = new Composite(shell, SWT.NONE);
  composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
  composite.setLayout(new GridLayout(1, false));
 
  final ProgressBar bar = new ProgressBar(composite, SWT.ON_TOP | SWT.SMOOTH);
  bar.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
  bar.setSize(200, 32);
  final int maximum = bar.getMaximum();
  new Thread(new Runnable() {
    @Override
    public void run() {
      for (final int[] i = new int[1]; i[0] < maximum; i[0]++) {
        try {
          Thread.sleep(100);
        } catch (final Throwable th) {
        }
        if (display.isDisposed())
          return;
        display.asyncExec(new Runnable() {
          @Override
          public void run() {
            if (bar.isDisposed())
              return;
            bar.setSelection(i[0]);
          }
        });
        if (i[0] == (maximum - 1)) {
          display.asyncExec(new Runnable() {
            @Override
            public void run() {
              if (bar.isDisposed()) {
                return;
              }
              bar.setSelection(maximum);
            }
          });
          try {
            Thread.sleep(1000);
          } catch (final Throwable th) {
          }
          display.asyncExec(new Runnable() {
            @Override
            public void run() {
              final Shell activeShell = display.getActiveShell();
              if (activeShell != null && !activeShell.isDisposed()) {
                activeShell.close();
              }
            }
          });
        }
      }
    }
  }).start();
 
  shell.setText("Progress test");
  shell.pack();
  shell.open();
  while (!shell.isDisposed()) {
    if (!display.readAndDispatch())
      display.sleep();
  }
  display.dispose();
}
Voilà, à+
Gueritarish
__________________
Pas de questions technique par MP, les forums sont là pour ça.

Le 5 et 6 juin à Toulouse, la première EclipseCon France !
Gueritarish est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2012, 09h41   #6
Gaspard22
Invité régulier
 
Homme
Développeur Java
Inscription : juillet 2012
Messages : 36
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur Java
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juillet 2012
Messages : 36
Points : 7
Points : 7
merci de me proposer un autre code, mais le souci esthétique finalement ne prend pas le devant sur un souci de temps.

J'essaierai ta solution un peu plus tard

merci encore
Gaspard22 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 15h03.


 
 
 
 
Partenaires

Hébergement Web