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 :

Contrôler les TabList


Sujet :

SWT/JFace Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Mai 2007
    Messages : 159
    Par défaut Contrôler les TabList
    Bonjour,

    Petit problème qui me donne un petit souci :
    Sur ma forme, j'ai un certain nombre (variable) de groupes de contrôles, permettant de saisir des informations pour un enregistrement de bdd par groupe.

    De ce fait, j'ai besoin de savoir quand le focus clavier quitte un groupe pour être pris par un autre (pour enregistrer les infos en particulier, avant de passer à l'autre enregistrement).

    J'ai donc assigné un listener de focus au Composite supportant le groupe. Pour que ca fonctionne, j'ai également dû lui créer un listener dummy pour les évènements clavier, car par défaut Composite n'a pas de gestion du clavier.

    En fait, ce faisant, je pensais naïvement que ca fonctionnerait comme en windows, où les contrôles parents reçoivent tous un évènement de focus d'entrée au moment où un de leurs enfants reçoit le focus venant de l'extérieur, et un évènement de sortie au moment ou un de leurs enfants le perd au profit de l'extérieur.

    En réalité, il fonctionne plutot comme un contrôle séparé, en gagnant le contrôle pour lui, et en le perdant au profit d'un contrôle enfant comme d'un autre.

    Quelqu'un saurait-il comment obtenir ce comportement dont je rêve svp?
    D'avance merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Mai 2007
    Messages : 159
    Par défaut
    Bon, je suppose que je me suis mal exprimé.
    Je vais donc essayer de refaire ma question autrement :

    Voici un résumé de ce que j'ai écrit (code abrégé):
    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
     
     
    class C1 extends Composite {
       text t1=null;
       text t2=null;
       text t3=null;
       String id="";
     
       C1(Composite parent, String id) {
          super(parent,SWT.NONE);
          this.id=id;
          initialize();
       }
     
       void initialize() {
          t1 = new Text(this,...);
          t1.addFocusListener(new FocusListener() {
             public void focusLost(org.eclipse.swt.events.FocusEvent e) {
                System.out.println("t1 lost");
             }
             public void focusGained(FocusEvent e) {
                System.out.println("t1 gained");
             }
          });
     
          t2 = new Text(this,...);
          t2.addFocusListener(new FocusListener() {
             public void focusLost(org.eclipse.swt.events.FocusEvent e) {
                System.out.println("t2 lost");
             }
             public void focusGained(FocusEvent e) {
                System.out.println("t2 gained");
             }
          });
     
          t3 = new Text(this,...);
          t3.addFocusListener(new FocusListener() {
             public void focusLost(org.eclipse.swt.events.FocusEvent e) {
                System.out.println("t3 lost");
             }
             public void focusGained(FocusEvent e) {
                System.out.println("t3 gained");
             }
          });
     
          Control [] tl = { t1, t2, t3 };
          this.setTabList(tl);
          this.addFocusListener(new FocusListener() {
             public void focusLost(org.eclipse.swt.events.FocusEvent e) {
                System.out.println("C" + id + " lost");
             }
             public void focusGained(FocusEvent e) {
                System.out.println("C" + id + " gained");
             }
          });
       }
    }
     
     
    class application {
     
    void createSShell() {
          Shell s1 = new Shell() // je simplifie...
          c1 = new C1(s1,"1");
          c2 = new C1(s1,"2"); 
          c3 = new C1(s1,"3")
          ...
          Control [] tl = { c1, c2, c3 };
          this.setTabList(tl);
       }
    }
    Si je laisse en l'état, et que j'agis avec la touche Tab, j'obtiens (en italique mes actions)
    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
    démarrage t1 gained tab t1 lost t2 gained tab t2 lost t3 gained tab t3 lost t1 gained tab t1 lost t2 gained tab t2 lost t3 gained tab t3 lost t1 gained etc...
    ce qui montre que Composite n'est pas sensible au focus.
    Après une petite recherche chez Eclipse, j'ai trouvé le bout de code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
       void initialize() {
          KeyListener dummy = new KeyListener(){
             public void handleEvent(Event event) {}
          };
          addKeyListener(dummy);
          ...
       }
    que j'ai ajouté à ma classe combo. Maintenant, j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    démarrage C1 gained
    puis plus rien (l'appli ne répond plus au Tab). Normal, me direz vous, handleEvent ne fait rien quand on appuie sur la touche Tab.
    Ensuite, je clique sur un contrôle et voila les réponses (en italique mes actions)
    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
    démarrage C1 gained clic dans t2 de c1 C1 lost t2 gained tab t2 lost t3 gained tab t3 lost C2 gained (tab bloqué) clic dans t1 de c3 C2 lost t1 gained tab t1 lost t2 gained etc...
    Je remarque donc que, quand un controle englobant donne le focus a un de ses fils, il perd lui-même le focus (j'ai aussi essayé avec setFocus dans handleEvent de forcer le composite a donner immédiatement le contrôle à un de ses enfants).

    Et voici le comportement que j'aurais aimé obtenir :
    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
    démarrage C1 gained t1 gained tab t1 lost t2 gained tab t2 lost t3 gained tab t3 lost C1 lost C2 gained t1 gained tab t1 lost t2 gained tab t2 lost t3 gained tab t3 lost C2 lost c3 gained t1 gained etc...
    Je souhaite en effet précisément capturer le fait que le focus passe d'un contrôle d'un composite sur un contrôle d'un autre composite, et pas du même.

    Les questions qui se posent à moi sont donc les suivantes
    - Comment puis-je gérer dans handleEvent l'ordre de tabulation?
    - Comment obtenir le comportement que je souhaite?

    Si quelqu'un a eu la patience de me lire jusqu'ici (qu'il en soit remercié et applaudi), serait-il possible qu'il puisse m'aider?

    Cordialement,
    Marc

Discussions similaires

  1. Access VBA : comment contrôler les marges d'un état
    Par CBleu dans le forum VBA Access
    Réponses: 7
    Dernier message: 18/04/2007, 14h56
  2. [Sécurité] COntrôler les accés
    Par big1 dans le forum Oracle
    Réponses: 5
    Dernier message: 21/06/2006, 10h54
  3. Contrôler les saisies clavier
    Par Pragmateek dans le forum C
    Réponses: 8
    Dernier message: 06/05/2006, 18h17
  4. [MySQL] Contrôler les modification apportées
    Par cari dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 06/03/2006, 15h38
  5. Contrôler les cases à cocher
    Par benny7 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/08/2005, 16h26

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