IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SWT/JFace Java Discussion :

Ignorer l'action d'un clic simple si double clic


Sujet :

SWT/JFace Java

  1. #1
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    1 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 190
    Points : 2 659
    Points
    2 659
    Par défaut Ignorer l'action d'un clic simple si double clic
    Bonjour!

    J'ai un petit souci sur un arbre swt. J'ai une action si j'effectue un clic simple sur un élément et une autre bien différente si c'est un double clic.

    Le problème, c'est que lors du double clic il appelle aussi l'action du simple clic, normal certes, mais conduit a une erreur pour mon appli.

    Je ne peux annuler les effets de l'action du simple clic, il me faudrait donc un moyen pour ne pas le faire si double clic...

    Intuitivement je penserai à mettre une sorte de timer sur mon simple clic pour attendre et voir si y'a double clic, mais cela me parait bien lourd...

    Y'aurait-il une autre solution?

    Code:
    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
     
     arbre.addSelectionListener(new SelectionAdapter()
        {
          public void widgetSelected(SelectionEvent e)
          {
            actionSimpleClic...
          }
     
        });
     
        arbre.addMouseListener(new MouseListener()
        {
          @Override
          public void mouseUp(MouseEvent e)
          {}
     
          @Override
          public void mouseDown(MouseEvent e)
          {}
     
          @Override
          public void mouseDoubleClick(MouseEvent e)
          {
            actionDoubleClic...
          }
        });

  2. #2
    Membre expert
    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 : 40
    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 919
    Points
    3 919
    Par défaut
    Salut,

    Tu peux utiliser la propriété doit du SelectionEvent.
    Il te suffit de passer cette propriété à false (et de ne pas exécuter ton code ensuite) pour ignorer l'évènement.

    Voilà, à+
    Gueritarish

  3. #3
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    1 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 190
    Points : 2 659
    Points
    2 659
    Par défaut
    Si j'ai bien compris tu proposes dans le double clic de mettre le doIt a false?

    ça pourrait être une solution, mais pour cela il faudrait que j'ai accès au SelectionEvent du simple clic dans le MouseListener.

    Mais cela pose problème, après test il finit obligatoirement le premier SelectionEvent avant de passer au MouseEvent. Et donc une fois que j'y suis dans le double clic, c'est trop tard.

  4. #4
    Membre expert
    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 : 40
    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 919
    Points
    3 919
    Par défaut
    Alors, effectivement, j'ai pas trop réfléchi
    J'ai foncé dès que j'ai vu un SelectionEvent. Honte à moi.
    Alors, tu peux mettre un timer effectivement avec une variable dont les accesseurs sont synchronized:
    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
    ExecutorService executor = Executors.newSingleThreadExecutor();
     arbre.addSelectionListener(new SelectionAdapter()
        {
          public void widgetSelected(SelectionEvent e)
          {
             executor.submit(new Runnable() {
                @Override
                public void run() {
                   try {
                      Thread.sleep(300);
                   } catch (InterruptedException iex) {
                      iex.printStackTrace();
                   }
                   if (isEnabled()) {
                      e.display.asyncExec(new Runnable() {
                         @Override
                         public void run() {
                             // Action simple clic effectué dans le thread IHM.
                         }
                      });
                   }
                }
             });
          }
     
        });
     
        arbre.addMouseListener(new MouseAdapter()
        {
          @Override
          public void mouseDoubleClick(MouseEvent e)
          {
            setEnabled(false);
            executor.submit(new Runnable() {
     
                @Override
                public void run() {
                    try {
                        Thread.sleep(300);
                    } catch (InterruptedException iex) {
                         iex.printStackTrace();
                    }
                    // Action double clic...
                    setDoit(true);
                }
    	});
          }
        }
    });
    Les accesseurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private synchronized boolean isEnabled() {
    	return enabled;
    }
     
    private synchronized void setEnabled(boolean doit) {
    	this.enabled = doit;
    }
    Ne pas oublier fermer le service d'exécution dans la méthode dispose:
    Voilà, à+
    Gueritarish

Discussions similaires

  1. [Débutant] Empécher clic droit et double clic gauche sur un controle
    Par ekydeta dans le forum VB.NET
    Réponses: 13
    Dernier message: 07/05/2014, 14h49
  2. ListBox evenement simple et double clic
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/06/2012, 17h27
  3. [JTable] Détection de simple clic et de double clic
    Par Core8 dans le forum Composants
    Réponses: 7
    Dernier message: 22/12/2006, 13h44
  4. Réponses: 3
    Dernier message: 25/08/2006, 14h01
  5. [MySQL] Compteur de clics simple
    Par jim1 dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 28/12/2005, 20h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo