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 :

Générer un KEYEVENT différent


Sujet :

SWT/JFace Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2003
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 51
    Par défaut Générer un KEYEVENT différent
    Bonjour à tous,

    Je vous écris parce que je galère depuis un ptit moment sur un problème que j'espère tout con

    J'ai beau chercher... J'ai pas trouvé de solution que ce soit ici ou ailleurs...

    Je développe une application Java en SWT avec Eclipse RCP. Dans mon appli se trouve un formulaire avec plusieurs champs et j'aimerai pouvoir passer d'un champ à l'autre lorsque l'utilisateur appuis sur la touche ENTREE.
    J'ai pensé que le plus simple pour ça était de remplacer le KEYEVENT de la touche ENTREE par un KEYEVENT de la touche TAB.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    tChamp.addKeyListener(new org.eclipse.swt.events.KeyAdapter() {
    	public void keyReleased(org.eclipse.swt.events.KeyEvent e) {
    		System.out.println(e.keyCode);
    		if (e.keyCode == SWT.CR || e.keyCode == SWT.KEYPAD_CR) {
    			System.out.println("CR => " + e.keyCode);
    			// Et c'est là que je souhaite générer un KeyEvent de code SWT.TAB
    		}
    	}
    });
    tChamp est un objet de type "Text".

    Si vous avez une solution pour ce problème ou une autre idée ca me rendrait grandement service !!

    D'avance, merci beaucoup

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2006
    Messages : 218
    Par défaut
    Voici une solution qui a le mérite de fonctionner

    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
    72
    73
     
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.layout.FillLayout;
    import org.eclipse.swt.widgets.Control;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Event;
    import org.eclipse.swt.widgets.Label;
    import org.eclipse.swt.widgets.Listener;
    import org.eclipse.swt.widgets.Shell;
    import org.eclipse.swt.widgets.Text;
     
    public class Test2 {
        public static void main(String[] args) {
            // Création d'un shell
            Display display = new Display();
            Shell shell = new Shell(display);
            shell.setLayout(new FillLayout(SWT.VERTICAL));
            shell.setText("Exemple");
     
            // Création d'un contenu
            new Label(shell, SWT.NONE).setText("Texte 1");
            Text t1 = new Text(shell, SWT.BORDER);
     
            new Label(shell, SWT.NONE).setText("Texte 2");
            Text t2 = new Text(shell, SWT.BORDER);
     
            new Label(shell, SWT.NONE).setText("Texte 3");
            Text t3 = new Text(shell, SWT.BORDER);
     
            // Le listener
            Listener listener = new Listener() {
     
                public void handleEvent(Event e) {
                    if (e.keyCode == SWT.CR || e.keyCode == SWT.KEYPAD_CR) {
                        // Annule l'événement
                        e.doit = false;
     
                        // Cherche l'élément sur lequel CR a été appuyé
                        final Control control = (Control) e.widget;
                        final Control[] tabList = control.getParent().getTabList();
                        int length = tabList.length;
                        int index = 0;
                        while (index < length) {
                            // Trouvé !
                            if (tabList[index] == control)
                                break;
                            index++;
                        }
                        if (index >= (length - 1))
                            index = -1;
     
                        // Passe à l'élément suivant
                        tabList[index + 1].forceFocus();
     
                    }
                }
            };
     
            // Affecte les listeners
            t1.addListener(SWT.KeyUp, listener);
            t2.addListener(SWT.KeyUp, listener);
            t3.addListener(SWT.KeyUp, listener);
     
            // Et affiche la fenêtre
            shell.setSize(1000, 600);
            shell.open();
            while (!shell.isDisposed()) {
                if (!display.readAndDispatch())
                    display.sleep();
            }
            display.dispose();
        }
    }
    C'est à mon avis la méthode la plus "propre" en SWT. Il te reste à l'adapter à ton code (ce qui devrait aller).

    En espérant t'avoir aidé

    Laurent

  3. #3
    Membre averti
    Inscrit en
    Février 2003
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 51
    Par défaut
    Merci Laurent...

    J'ai pas encore eu le temps de l'intégrer dans mon code mais j'essaierai ta solution quand ca sera un peu plus calme !!
    J'ai d'autres priorités bien plus importante que le changement de focus actuellement mais je te remercie beaucoup pour cette solution.

    Je ne connaissais pas l'existence de la tabList et j'ai cru que ca ne pourrait pas s'adapter à mon code mais en fait je pense que ca doit être possible

    Je craignais une réponse du style "bin suffit de faire un focusLost sur le 1er champ et un focusGained sur le suivant"...

    Enfin bon dans tous les cas je n'ai pas réussi à générer (instancier) un évènement et à le lancer sur un composant. Sans quoi cette histoire serait déjà réglé

    Bon en tout cas encore merci pour ce bout de code (et également pour ta réactivité car j'ai vu ton post hier tout de suite aprés que tu l'aies posté mais j'ai pas pris le temps d'y répondre et m'en excuse !)

    Allez... On code on code on code...

Discussions similaires

  1. générer 2 entiers différents
    Par wikisoft dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 25/06/2009, 09h34
  2. Générer des html différents
    Par capello123 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 07/12/2007, 16h28
  3. Réponses: 6
    Dernier message: 29/11/2006, 11h56
  4. Réponses: 2
    Dernier message: 28/07/2006, 12h14
  5. Réponses: 18
    Dernier message: 28/04/2006, 11h00

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