+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    juillet 2012
    Messages
    67
    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 : 67
    Points : 16
    Points
    16

    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

  2. #2
    Modérateur
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    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 800
    Points : 3 775
    Points
    3 775

    Par défaut

    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.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    juillet 2012
    Messages
    67
    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 : 67
    Points : 16
    Points
    16

    Par défaut

    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

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    juillet 2012
    Messages
    67
    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 : 67
    Points : 16
    Points
    16

    Par défaut Résolu

    Effectivement, cela à résolu mon problème , même si le coté graphique est moins beau, mais merci

  5. #5
    Modérateur
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    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 800
    Points : 3 775
    Points
    3 775

    Par défaut

    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.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    juillet 2012
    Messages
    67
    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 : 67
    Points : 16
    Points
    16

    Par défaut

    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

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •