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

AWT/Swing Java Discussion :

Clavier virtuel Swing


Sujet :

AWT/Swing Java

  1. #1
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2010
    Messages : 553
    Points : 2 740
    Points
    2 740
    Par défaut Clavier virtuel Swing
    Bonjour,

    je développe actuellement une application pour tablet-PC tactile et j'ai besoin de coder un clavier virtuel pour la saisie de texte.

    j'ai déjà une ébauche qui fonctionne plus ou moins en générant des évènements personnalisés, mais après réflexion ca ne me convient pas tellement.

    j'aimerais que mon clavier virtuel génère des évènements clavier directement interceptables par les composant swing qui interceptent ce genre d'évènements.

    j'ai donc 2 questions:
    1 - comment faire en sorte que mon composant clavier génère les même évènements qu'un véritable clavier?
    2 - est il possible d'éviter qu'un champs de texte (ou tout autre composant) ne perde pas le focus quand on clique un des boutons du clavier virtuel? et si oui, comment?

    merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    On en a discuté récemment sur le forum.
    Tu trouveras plus d'information ici : http://www.developpez.net/forums/d85...-visuel-swing/

    a++

  3. #3
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2010
    Messages : 553
    Points : 2 740
    Points
    2 740
    Par défaut
    merci pour la réactivité et la pertinence de la redirection, ça m'a permis de bien avancer

    après avoir mis un setFocusable(false) sur chacun des boutons de mon clavier, je peux déjà m'affranchir de la gestion du focus.
    la classe Robot avec ses méthodes keyPress et keyRelease sont aussi très utiles.

    par contre, j'ai encore quelques soucis:

    - tout d'abord, j'ai tenté d'utiliser KeyStroke.getKeyStroke() pour récupérer directement le keyCode qui va bien a partir d'un caractère. mais "étrangement", la ligne suivante...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    KeyStroke.getKeyStroke(unChar).getKeyCode();
    me renvoie toujours 0, je ne peux donc rien en faire. mais je l'utilise peut etre mal...

    - du coup, je me suis dit que j'allais me débrouiller en faisant combinaisons de touches avec les constantes de la classe KeyEvent.
    par exemple pour un "ê", je comptais faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    robot.keyPress(KeyEvent.VK_CIRCUMFLEX);
    robot.keyRelease(KeyEvent.VK_CIRCUMFLEX);
    robot.keyPress(KeyEvent.VK_E);
    robot.keyRelease(KeyEvent.VK_E);
    mais la, ca me lève une exception avec un message "Invalid key code" sur la première ligne...

    - dernière solution qui me vient a l'esprit, je me dis que je vais faire une petite application qui va m'afficher des infos sur la dernière touche tappée, histoire de éventuellement noter les keyCode en dur dans mon code (oui je sais c'est dégueu, mais quand on est désepéré hein... )
    bref, quand j'affiche le résultat de la méthode paramString() d'une KeyEvent, j'obtiens quelque chose de ce genre:
    KEY_TYPED,keyCode=0,keyText=Unknown keyCode: 0x0,keyChar='a',keyLocation=KEY_LOCATION_UNKNOWN,rawCode=0,primaryLevelUnicode=0,scancode=0
    là c'est pour la touche "A" et j'ai un keyCode=0.
    mais pour toutes les touches que je tape, le keyCode est toujours égal à zéro.


    je ne vois donc vraiment pas comment me débrouiller avec mes accents...
    pour le moment, j'ai un problème avec les caractères suivants (que le client veut absolument sur son clavier :/ ):
    ê, ô, ë, ï, ù (oui j'ai pas trouvé le code de cette touche).

    enfin, une dernière curiosité, autant la constante VK_END ne pose pas de problème, autant VK_BEGIN n'est pas reconnue...

    bref, si vous avez une idée pour me sortir de là, je suis tout ouie

    merci d'avance

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Tryph Voir le message
    après avoir mis un setFocusable(false) sur chacun des boutons de mon clavier, je peux déjà m'affranchir de la gestion du focus.
    Tu peux te contenter de faire un setFocusableWindowState(false) sur ta fenêtre


    Citation Envoyé par Tryph Voir le message
    - tout d'abord, j'ai tenté d'utiliser KeyStroke.getKeyStroke() pour récupérer directement le keyCode qui va bien a partir d'un caractère. mais "étrangement", la ligne suivante...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    KeyStroke.getKeyStroke(unChar).getKeyCode();
    me renvoie toujours 0, je ne peux donc rien en faire. mais je l'utilise peut etre mal...
    En fait tu ne peux pas vraiment obtenir un keyCode à partir d'un caractère, car il peut y avoir plusieurs façons de faire...

    Par exemple pour le caractère "1" tu peux utiliser la touche "1" ou bien le pavé numérique. De même pour les caractères spéciaux, etc...
    De même certaines touches ne sont pas forcément lié à un caractères (shift, F1-F12, etc.)

    Le keyTyped correspond bien à un caractère, mais les keyCodes correspondent à des touches du clavier.

    Tu dois passer par les constantes VK_KEY ou par getKeyStroke("KEY") où tu dois préciser le nom de la touche dans une chaine. Bref il est préférable de passer par les constantes...

    Citation Envoyé par Tryph Voir le message
    - du coup, je me suis dit que j'allais me débrouiller en faisant combinaisons de touches avec les constantes de la classe KeyEvent.
    par exemple pour un "ê", je comptais faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    robot.keyPress(KeyEvent.VK_CIRCUMFLEX);
    robot.keyRelease(KeyEvent.VK_CIRCUMFLEX);
    robot.keyPress(KeyEvent.VK_E);
    robot.keyRelease(KeyEvent.VK_E);
    mais la, ca me lève une exception avec un message "Invalid key code" sur la première ligne...
    C'est bien ce qu'il faut faire... mais tu utilises un mauvais keyCode!
    En fait la classe KeyEvent défini un grand nombre de keyCode, parfois en double et en particulier des touches inexistantes sur nos claviers (comme les touches VK_F13 à VK_F24 par exemple).

    Dans ce cas précis il faut utiliser VK_DEAD_CIRCUMFLEX...


    Citation Envoyé par Tryph Voir le message
    - dernière solution qui me vient a l'esprit, je me dis que je vais faire une petite application qui va m'afficher des infos sur la dernière touche tappée, histoire de éventuellement noter les keyCode en dur dans mon code (oui je sais c'est dégueu, mais quand on est désepéré hein... )
    bref, quand j'affiche le résultat de la méthode paramString() d'une KeyEvent, j'obtiens quelque chose de ce genre:

    là c'est pour la touche "A" et j'ai un keyCode=0.
    mais pour toutes les touches que je tape, le keyCode est toujours égal à zéro.
    L'évènement KEY_TYPED survient lorsque la touche a été convertie en caractère, et donc tu perd le keyCode.
    Il faut traiter le keyPressed ou le keyReleased qui concerne toujours la touche du clavier.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	final JLabel lastTyped = new JLabel(" ");
    	final JTextField textField = new JTextField();
    	textField.addKeyListener(new KeyAdapter() {
    		public void keyReleased(KeyEvent e) {
    			KeyStroke key = KeyStroke.getKeyStroke(e.getKeyCode(), e.getModifiers());
    			lastTyped.setText(key.toString());
    			System.out.println(key);
    		}
    	});
     
    	Object[] message = { textField, lastTyped };
     
    	JOptionPane.showMessageDialog(null, message);

    Citation Envoyé par Tryph Voir le message
    je ne vois donc vraiment pas comment me débrouiller avec mes accents...
    pour le moment, j'ai un problème avec les caractères suivants (que le client veut absolument sur son clavier :/ ):
    ê, ô, ë, ï, ù (oui j'ai pas trouvé le code de cette touche).
    Il faut envoyer les deux code comme tu le faisais un peu plus haut, mais avec le bon keyCode

    Citation Envoyé par Tryph Voir le message
    enfin, une dernière curiosité, autant la constante VK_END ne pose pas de problème, autant VK_BEGIN n'est pas reconnue...
    C'est toujours le même problème : VK_BEGIN n'existe pas sur nos claviers.
    Tu dois surement parler de VK_HOME


    a++

  5. #5
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2010
    Messages : 553
    Points : 2 740
    Points
    2 740
    Par défaut
    en fait, je mets un setFocusable(false) sur chaque bouton car mon clavier n'est pas dans une fenêtre indépendante, il est dans le même JFrame que tout le reste de l'application, je ne voulais donc pas empêcher toute la fenêtre de récupérer le focus. j'ai essayé de le faire sur le panel qui contient mon clavier, mais ca ne faisait pas l'affaire...

    bref, pour la 2e fois, merci pour la réactivité, ca fait bien plaisir
    pour la pertinence par contre, il est l'heure de déserter le bureau la, alors je verrai ca demain
    mais après lecture rapide, ca m'éclairci déjà bien les choses.


  6. #6
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2010
    Messages : 553
    Points : 2 740
    Points
    2 740
    Par défaut
    bonjour

    je reviens a la charge avec mes problèmes de caractères accentués

    mais avant tout, la constante VK_HOME est bien la constante dont j'avais besoin à la place de VK_BEGIN.
    ensuite, en utilisant la constante VK_DEAD_CIRCUMFLEX à la place de VK_CIRCUMFLEX, je n'ai plus d'exception, mais... bah oui il faut bien un "mais".

    mais (donc) il n'y a toujours pas moyen de générer les caractères accentués qui me posaient déjà problème.
    je reprends l'exemple du "ê", j'ai essayé les combinaisons suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    robot.keyPress(KeyEvent.VK_DEAD_CIRCUMFLEX);
    robot.keyRElease(KeyEvent.VK_DEAD_CIRCUMFLEX);
    robot.keyPress(KeyEvent.VK_E);
    robot.keyRElease(KeyEvent.VK_E);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    robot.keyPress(KeyEvent.VK_DEAD_CIRCUMFLEX);
    robot.keyPress(KeyEvent.VK_E);
    robot.keyRElease(KeyEvent.VK_E);
    robot.keyRElease(KeyEvent.VK_DEAD_CIRCUMFLEX);
    et dans les 2 cas, j'obtiens un "e" simple sans accent alors que les enchainements fonctionnent si je les tape a partir de mon clavier réel.
    j'ai aussi vérifier que le code attribué a VK_DEAD_CIRCUMFLEX est bien le même que la touche proposant l'accent circonflexe et l'accent tréma, et c'est effectivement le cas: 130
    j'ai donc essayé de remplacer VK_DEAD_CIRCUMFLEX par sa valeur directement dans le code, mais comme on s'en doute, ça n'a rien fait de mieux.

    bref là je cale sévère

    si quelqu'un a une solution a ce mystère, merci de me la communiquer

    en attendant, je vais voir si je peux m'en sortir avec un copier/coller comme c'est suggéré dans le topic dont adiGuba a mis le lien dans sa première réponse

  7. #7
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2010
    Messages : 553
    Points : 2 740
    Points
    2 740
    Par défaut
    alors...

    la technique du copier/coller, c'est de la balle
    j'aurais préféré m'en sortir autrement, mais bon je vais pas faire la fine bouche.

    donc pour ceux que ça intéresse, j'explique la marche a suivre (si ca peut éviter de chercher ).

    il faut commencer par récupérer le presse papier du système:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Toolkit tk = Toolkit.getDefaultToolkit();
    Clipboard cb = tk.getSystemClipboard();
    une fois le presse papier récupéré, on peut lui envoyer une chaine de caractère avec la ligne suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cb.setContents(new StringSelection("duTexte"), null);
    enfin, on peut utiliser notre objet Robot pour coller le contenu du presse-papier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_V);
    robot.keyRElease(KeyEvent.VK_V);
    robot.keyRElease(KeyEvent.VK_CONTROL);
    (à noter: la variable VK_PASTE ne fonctionne apparemment pas avec nos configuration de clavier français, ça doit être pareil pour VK_CUT et VK_COPY mais j'ai pas testé.)

    et voila le travail...
    c'est même tellement efficace que j'utilise cette façon de faire pour tous mes caractères, ça me fait un code plus homogène.

    encore merci abiGuba pour ta précieuse aide, et si quelqu'un sait comment générer ces satanés caractères accentués en utilisant seulement les contantes de KeyEvent, je veux bien qu'il s'exprime. ça peut toujours servir

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

Discussions similaires

  1. clavier virtuel sur Formulaire
    Par db48752b dans le forum IHM
    Réponses: 9
    Dernier message: 01/03/2017, 11h30
  2. Clavier virtuel Swing
    Par SebastianPx dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 27/07/2009, 14h52
  3. Lancement du clavier virtuel
    Par rzayani dans le forum Windows
    Réponses: 1
    Dernier message: 21/08/2006, 16h16
  4. Programmer un clavier virtuel
    Par juvamine dans le forum Windows
    Réponses: 1
    Dernier message: 30/07/2006, 17h47
  5. Clavier virtuel
    Par ouquoi dans le forum MFC
    Réponses: 2
    Dernier message: 22/02/2006, 11h33

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