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

Composants Java Discussion :

KeyEvent: Comment gérer simplement le clavier ?


Sujet :

Composants Java

  1. #1
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2006
    Messages : 36
    Par défaut KeyEvent: Comment gérer simplement le clavier ?
    Bonjour;

    je suis entrain de travailler sur un application qui permet la saisie de texte. (jusque la pas trop dur)

    mon objectif et de capter tout les modifications apporté à un document pour pouvoir transmettre ses modifications en temps réel à mon serveur sous forme de mini "requête" style "ajout(charater, offset);

    je n'arrive pas a gérer de manière simple les touches du clavier. je voudrais pouvoir distinguer facilement les touches 'abcde...' del backspace enter...
    mais aussi ctrl+c, ctrl+v ctrl+a...

    mon code actuel "marche":
    (le but est de taper du code dans la zone de gauche et il apparait dans la zone de droite)
    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
     
     
    package testApplet;
     
    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.GridBagLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
     
    import javax.swing.JFrame;
    import javax.swing.JTextPane;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.SimpleAttributeSet;
    import javax.swing.text.StyledDocument;
     
    import ressource.GBC;
     
    public class TextDisplayer extends JFrame{
     
        private JTextPane left;
        private JTextPane right;
        protected StyledDocument documentLeft;
        protected StyledDocument documentRight;
     
        public TextDisplayer(){
            super();
            build();
        }
    private void build(){
     
            this.setSize(new Dimension(600,400));
            this.setTitle("plop");
            this.setLocationRelativeTo(null);
     
     
            this.left = new JTextPane();
            this.right = new JTextPane();
     
            documentLeft = left.getStyledDocument();
            documentRight = right.getStyledDocument();
     
            this.left.setEditable(true);
            this.left.setFocusable(true);
     
     
            this.right.setEditable(true);
            this.right.setFocusable(true);
     
        class MySuperListener implements KeyListener, ActionListener{
     
                public MySuperListener(){
                    super();
                }
                /** Handle the key typed event from the text field. */
                public void keyTyped(KeyEvent e) {
                    //    displayInfo(e, "KEY TYPED: ");
                }
     
                /** Handle the key pressed event from the text field. */
                public void keyPressed(KeyEvent e) {
                    displayInfo(e, "KEY PRESSED: ");
                }
     
                /** Handle the key released event from the text field. */
                public void keyReleased(KeyEvent e) {
                    //    displayInfo(e, "KEY RELEASED: ");
                }
     
                /** Handle the button click. */
                public void actionPerformed(ActionEvent e) {}
     
                private void displayInfo(KeyEvent e, String keyStatus){
     
                    if(e.getModifiers() == KeyEvent.CTRL_MASK && e.getKeyCode() == KeyEvent.VK_C)
                        System.out.println("je copie");
                    if(e.getModifiers() == KeyEvent.CTRL_MASK && e.getKeyCode() == KeyEvent.VK_V)
                        System.out.println("je colle");
                    if(e.getModifiers() == KeyEvent.CTRL_MASK && e.getKeyCode() == KeyEvent.VK_X)
                        System.out.println("je coupe");
                    if(e.getModifiers() == KeyEvent.CTRL_MASK && e.getKeyCode() == KeyEvent.VK_A)
                        System.out.println("je selectionne tout");
     
                    switch(e.getKeyCode())
                    {
                    case KeyEvent.VK_BACK_SPACE :
                        infoDiplayer(KeyBoardOperation.DEL, null, left.getCaretPosition()-1, 1);
                        break;
                    case KeyEvent.VK_A :
                    case KeyEvent.VK_B :
                    case KeyEvent.VK_C :
                    case KeyEvent.VK_D :
                    case KeyEvent.VK_E :
                    case KeyEvent.VK_F :
                    case KeyEvent.VK_H :
                    case KeyEvent.VK_I :
                    case KeyEvent.VK_J :
                    case KeyEvent.VK_K :
                    case KeyEvent.VK_L :
                    case KeyEvent.VK_M :
                    case KeyEvent.VK_N :
                    case KeyEvent.VK_O :
                    case KeyEvent.VK_P :
                    case KeyEvent.VK_Q :
                    case KeyEvent.VK_R :
                    case KeyEvent.VK_S :
                    case KeyEvent.VK_T :
                    case KeyEvent.VK_U :
                    case KeyEvent.VK_V :
                    case KeyEvent.VK_W :
                    case KeyEvent.VK_X :
                    case KeyEvent.VK_Y :
                    case KeyEvent.VK_Z :
                        infoDiplayer(KeyBoardOperation.ADD, "" + e.getKeyChar(), left.getCaretPosition(), -1);
                        break;
                    case KeyEvent.VK_DELETE:
                        infoDiplayer(KeyBoardOperation.DEL, null, left.getCaretPosition(), 1);
                        break;
     
     
                    default :
                    }
                private void infoDiplayer(KeyBoardOperation op, String s, int offset, int length){
                    try{
                        switch(op){
                        case ADD:
                            documentRight.insertString(offset, s, new SimpleAttributeSet());
                            break;
                        case DEL:
                            documentRight.remove(offset, length);
                            break;
                        default:
                            break;
                        }
     
                    } catch (BadLocationException e1) {
                        e1.printStackTrace();
                    }
                }
            }
        left.addKeyListener(new MySuperListener());
     
            getContentPane().setLayout(new GridBagLayout());
            Container cp =  getContentPane();
            cp.add(this.left, new GBC(0,0).setFill(GBC.BOTH).setWeight(100, 100).setAnchor(GBC.WEST).setInsets(1));
            cp.add(this.right, new GBC(1,0).setFill(GBC.BOTH).setWeight(100, 100).setAnchor(GBC.EAST).setInsets(1));
     
            this.setVisible(true);
     
        }
     
    }
    Mais voila je pense que mon approche actuel n'est pas la meilleur. Est ce que quelqu'un à des idées?

    mon objectif est de récupérer et de transmettre les modifications faite au document de type texte en temps réel (plus ou moins) donc j'ai pense à récupérer le les KeyEvent

    si quelqu'un a une autre approche?

  2. #2
    Membre chevronné
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2007
    Messages : 301
    Par défaut
    Je survolé ton code et je pense que tu devrais utiliser la classe Character : http://java.sun.com/j2se/1.4.2/docs/...Character.html. Elle permet d'effectuer des vérifications pour savoir si c'est ou non une lettre, etc.

  3. #3
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Utilise un DocumentListener pour piste les changements même sur le Document (insertion, modif, suppression de chaines).

    Puis pour ce qui est raccourcis il te faut jouer avec le couple InputMap/ActionMap de ton Composant.

  4. #4
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2006
    Messages : 36
    Par défaut
    Re bonjour tout le monde,

    alors le document listner marche nickel pour ce que je veus faire comme manip

    mais malheureusement je suis tomber sur un autre problème : la protection contre la boucle infini...

    le lsitener détecte les changements et insérer du text est un changement, listener le redétecte etc etc

    donc je suis passer au document filter (qui après pas mal de modification dans mon code) font les fonctions dont j'ai besion.

    mais je tombe dans le cas d'un boucle infini et j'ai du mal a m'en débarrasser.

    quelqu'un as une idée ?

  5. #5
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    C'est un peu bizarre : lorsque tu utilises un listener, tu n'as pas besoin de renvoyer l'évènement à sa source, heureusement ; donc là dans le DocumentListener, n'écris pas dans le document à partir de lui, normalement swing le fait pour toi.

    Pour le DocumentFilter, il faut utiliser super.(laMéthodeConcernée).

    Tout cela donne l'impression de quelqu'un qui ne lit pas les docs, mais je dois me tromper ?... Tiens, cela tombe bien, en voilà justement une : Text Component Features.

  6. #6
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2006
    Messages : 36
    Par défaut
    Re bonjour tout le monde

    j'ai finalement trouver mon bonheur avec du document filter et des booleans qui me serve à empecher les appels problématiques.

    gifffftane

    je suis pas un expert en java, en swing ou en réseaux et j'aime pas lire la doc, mais je deteste déranger les sur un forum si j'ai pas chercher à fond avant.

    en relisant ce que j'ai écris je n'ai pas expliciter ce que je faisais:
    je travail sur un logiciel de travail collaboratif supportant l'éditions textes d'images (en lecture et en modification) et dans un future proche des flux audio et vidéo.

    et donc voila la réponse au mystère, je n'injecte pas mon code dans le document source mais je l'envoie chez les autres clients qui ont le même document avec le même listener

    je m'excuse si je n'étais pas claire dans mes propos mais je suis actuellement entrain de bosser tout seul (mes "collègues" de lab parle pas anglais et je parle pas assez bien japonais) plus de 16 h (oui je vis littéralement dans mon lab à dormir dans le futon) par jours sur cette application, et donc j'ai oublié de préciser cette contrainte.

    encore merci pour vos réponses et à bientôt pour mon prochain problème

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

Discussions similaires

  1. comment gérer les évenements clavier ?
    Par nogard dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 13/06/2011, 17h44
  2. Comment gérer des clics sur les touches du clavier:
    Par choko83 dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 11/03/2008, 11h15
  3. [Débutant]Comment gérer les erreurs simplement ?
    Par nahouto dans le forum Langage
    Réponses: 3
    Dernier message: 29/11/2006, 21h55
  4. Réponses: 5
    Dernier message: 25/07/2005, 09h29
  5. Comment gérer les espaces blancs?
    Par Lambo dans le forum XML/XSL et SOAP
    Réponses: 10
    Dernier message: 16/05/2003, 09h44

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