Détecter une frappe au clavier

Signaler
Messages postés
3
Date d'inscription
mardi 30 octobre 2007
Statut
Membre
Dernière intervention
14 octobre 2008
-
Messages postés
14
Date d'inscription
dimanche 3 novembre 2002
Statut
Membre
Dernière intervention
25 juin 2009
-
Bonjour,

je vous contacte avant d'appeler l'hôpital pour qu'on m'interne.
Sérieusement: depuis 2 jours je cherche simplement à déclencher une action sur une frappe du clavier. Peu importe la touche!

N'y parvenant pas, j'essaye en ce moment de faire une chose très simple: une application qui émet un bip dès qu'on frappe sur une touche du clavier.

Je sais comment faire un bip: Toolkit.getDefaultToolkit().beep()

Malgré tous mes efforts avec ces foutus KeyListener, KeyAdaptor, Component et que sais-je encore, c'est un échec ahurissant.

Je vous en prie: aidez-moi avant que je m'en prenne à mon mobilier.
A voir également:

5 réponses

Messages postés
5351
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
17 août 2020
97
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" />
<title>
</title>
<meta name="GENERATOR" content="OpenOffice.org 2.3 (Linux)" />
<style type="text/css">
<!--
@page { size: 21cm 29.7cm; margin: 2cm }
P { margin-bottom: 0.21cm }
-->
</style>
Salut,

si ton composant contient
d'autres composants et que tu veux que l'action soit faite n'importe
où dans la fenêtre, il te faut utiliser la méthode
registerKeyboardAction héritée de JComponent (de
préférence tu l'attaches au container principal)

dans
l'exemple ci-dessous il suffit de faire ALT+ENTER, CTRL+C ou CTRL+V
pour afficher un message :



import java.awt.Event;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.KeyStroke;

public class Test extends JPanel implements ActionListener {
    private static final long    serialVersionUID    = -4312447806272150211L;

    // constantes pour simplifier l'utilisation des commandes
    private static final String    ALT_ENTER            = "ALT+ENTER";
    private static final String    CTRL_C                = "CTRL+C";
    private static final String    CTRL_V                = "CTRL+V";

    public Test() {
        registerKeyboardAction(this, ALT_ENTER, KeyStroke.getKeyStroke(
                KeyEvent.VK_ENTER, Event.ALT_MASK),
                JComponent.WHEN_IN_FOCUSED_WINDOW);
        registerKeyboardAction(this, CTRL_C, KeyStroke.getKeyStroke(
                KeyEvent.VK_C, Event.CTRL_MASK),
                JComponent.WHEN_IN_FOCUSED_WINDOW);
        registerKeyboardAction(this, CTRL_V, KeyStroke.getKeyStroke(
                KeyEvent.VK_V, Event.CTRL_MASK),
                JComponent.WHEN_IN_FOCUSED_WINDOW);

        // création de quelques composants pour le fun
        for (int i = 1; i < 51; ++i)
            add(new JButton("Button " + i));
    }

    /**
     * pour le test
     */
    public static void main(String[] args) {
        final JFrame f = new JFrame("Test registerKeyboardAction");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(800, 600);
        f.setLocationRelativeTo(null);
        f.setContentPane(new Test());
        f.setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource().equals(this)) {// pour le cas ou il y ai d'autres
                                            // composants
            // gestion de l'action
            String msg = "";
            if (e.getActionCommand().equals(ALT_ENTER))
                msg = ALT_ENTER;
            else if (e.getActionCommand().equals(CTRL_C))
                msg = CTRL_C;
            else if (e.getActionCommand().equals(CTRL_V))
                msg = CTRL_V;
            JOptionPane.showMessageDialog(this, msg + " pressed", "Info",
                    JOptionPane.INFORMATION_MESSAGE);
        }
    }
}

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
Messages postés
3
Date d'inscription
mardi 30 octobre 2007
Statut
Membre
Dernière intervention
14 octobre 2008

Merci pour ta réponse.
Malheureusement, cela ne m'a pas aidé car je  n'utilise pas du tout javax.swing, mais un component Window que je mets en plein écran.
Comme ça fait 15 jours que je ne trouve pas la solution, bien entendu cela ruine mon moral. Pour l'instant, c'est mon géranium qui subit ma colère mais pour combien de temps ?

J'ai supprimé tout ce qui n'avais pas de rapport avec l 'écran et le clavier dans mon code.
Ca donne les deux fichiers suivants:

import java.util.*;
import java.awt.*; 
import java.awt.image.*;

public class PleinEcran{
    
/* fonction passant en plein écran et renvoyant un objet Graphics 
 * permettant de dessiner dessus
 */

public static Window ECRAN_PRINCIPAL = null;

public static Graphics pleinEcran(){
    
    //Récupération de l’environnement graphique disponible à notre //application
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    
    //Récupération de l’écran
GraphicsDevice gd = ge.getDefaultScreenDevice();
    
       // Création des fenêtres d’affichage
       Frame frame = new Frame(gd.getDefaultConfiguration());
        Window win = new Window(frame);

    // Passage au mode plein écran
   gd.setFullScreenWindow(win);
           win.requestFocus();

    //Sélection de la résolution et de la profondeur de couleur
     DisplayMode[] affichages = gd.getDisplayModes();        
    for(int i=0;i<affichages.length;i++){

          if((affichages[i].getWidth()==1025)&amp;&amp;(affichages[i].getHeight()==768)&amp;&amp;(affichages[i].getBitDepth()==32)){
                gd.setDisplayMode(affichages[i]);
            }
    }

    //Taille de l’écran
           int screenWidth = win.getWidth();
           int screenHeight = win.getHeight();

    // Récupération de l’instance de ‘Graphics’ correspondant à l’écran
    Graphics graphicwindow = win.getGraphics();

    // Création du tampon qui représentera les pixels de
    // ‘MemoryImageSource’
       int size = screenWidth * screenHeight;
    int[] pixels = new int[size];

    //Création de la ‘MemoryImageSource’
    MemoryImageSource source = new MemoryImageSource(screenWidth, screenHeight, pixels, 0, screenWidth);

    //Spécifie qu’il s’agit d’une animation avec une succession d’images
    source.setAnimated(true);

       //A chaque fois qu’il y’aura un changement on mets à jour toute
       //l’image
    source.setFullBufferUpdates(true);

    //Création de l’image associée à ‘MemoryImageSource’
    Image offscreen = Toolkit.getDefaultToolkit().createImage(source);

    
    
    ECRAN_PRINCIPAL = win;
    
    return graphicwindow;

}



Le fichier ci-dessus a toujours fonctionné pour tout ce qui est affichage en plein écran.

Et voici, l'aspect "gestion des frappes clavier" réduit à sa plus simple expression:


import java.awt.*;
import java.awt.event.*;

public class EcranMerde extends KeyAdapter{
    
    
    public void keyReleased(KeyEvent e){
        
        Toolkit.getDefaultToolkit().beep();
    }
    
    public static void main(String[] args){
        
        PleinEcran.pleinEcran();
        PleinEcran.ECRAN_PRINCIPAL.addKeyListener(new EcranMerde());
    }
}



Et ben ça marche pas.
Rien ne se passe  quand je frappe sur le clavier.

Rassurez-vous, j'ai bien vérifié que "Toolkit.getDefaultToolkit().beep();" fonctionne bien tout seul.
Je cherche donc à comprendre pourquoi ma fonction keyReleased n'est jamais appelée même quand j'appuie et je relâche le clavier des milliards de fois.

Pourriez-vous essayer de voir pourquoi ça ne marche pas ?

Bon, j'ai supprimé tout ce qui n'avais pas de rapport avec l 'écran et le clavier dans mon code.
Ca donne les deux fichiers suivants:

import java.util.*;
import java.awt.*; 
import java.awt.image.*;

public class PleinEcran{
    
/* fonction passant en plein écran et renvoyant un objet Graphics 
 * permettant de dessiner dessus
 */

public static Window ECRAN_PRINCIPAL = null;

public static Graphics pleinEcran(){
    
    //Récupération de l’environnement graphique disponible à notre //application
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    
    //Récupération de l’écran
GraphicsDevice gd = ge.getDefaultScreenDevice();
    
       // Création des fenêtres d’affichage
       Frame frame = new Frame(gd.getDefaultConfiguration());
        Window win = new Window(frame);

    // Passage au mode plein écran
   gd.setFullScreenWindow(win);
           win.requestFocus();

    //Sélection de la résolution et de la profondeur de couleur
     DisplayMode[] affichages = gd.getDisplayModes();        
    for(int i=0;i<affichages.length;i++){

          if((affichages[i].getWidth()==1025)&amp;&amp;(affichages[i].getHeight()==768)&amp;&amp;(affichages[i].getBitDepth()==32)){
                gd.setDisplayMode(affichages[i]);
            }
    }

    //Taille de l’écran
           int screenWidth = win.getWidth();
           int screenHeight = win.getHeight();

    // Récupération de l’instance de ‘Graphics’ correspondant à l’écran
    Graphics graphicwindow = win.getGraphics();

    // Création du tampon qui représentera les pixels de
    // ‘MemoryImageSource’
       int size = screenWidth * screenHeight;
    int[] pixels = new int[size];

    //Création de la ‘MemoryImageSource’
    MemoryImageSource source = new MemoryImageSource(screenWidth, screenHeight, pixels, 0, screenWidth);

    //Spécifie qu’il s’agit d’une animation avec une succession d’images
    source.setAnimated(true);

       //A chaque fois qu’il y’aura un changement on mets à jour toute
       //l’image
    source.setFullBufferUpdates(true);

    //Création de l’image associée à ‘MemoryImageSource’
    Image offscreen = Toolkit.getDefaultToolkit().createImage(source);

    
    
    ECRAN_PRINCIPAL = win;
    
    return graphicwindow;

}



Le fichier ci-dessus a toujours fonctionné pour tout ce qui est affichage en plein écran.

Et voici, l'aspect "gestion des frappes clavier" réduit à sa plus simple expression:


import java.awt.*;
import java.awt.event.*;

public class EcranMerde extends KeyAdapter{
    
    
    public void keyReleased(KeyEvent e){
        
        Toolkit.getDefaultToolkit().beep();
    }
    
    public static void main(String[] args){
        
        PleinEcran.pleinEcran();
        PleinEcran.ECRAN_PRINCIPAL.addKeyListener(new EcranMerde());
    }
}



Et ben ça marche pas.
Rien ne se passe  quand je frappe sur le clavier.

Rassurez-vous, j'ai bien vérifier que "Toolkit.getDefaultToolkit().beep();" fonctionne bien tout seul.
Je cherche donc à comprendre pourquoi ma fonction keyReleased n'est jamais appelée même quand j'appuie et je relâche le clavier des milliards de fois.

Merci aux âmes d'une infinité bonté qui voudront bien essayer de m'aider à sortir de là.
Messages postés
14
Date d'inscription
dimanche 3 novembre 2002
Statut
Membre
Dernière intervention
25 juin 2009

up !   meme probleme

pannelTest

.addMouseListener(
new CliquePannel());
pannelTest

.addKeyListener(
new TextePannel());
.
.
.

class

CliquePannel extends MouseAdapter {

public
void
mouseClicked(MouseEvent e) {

bonPannel= (JPanel) e.getSource();

bonPannel.setBorder(
bordureClique );

bonPannel.addKeyListener(
new
TextePannel());

}

}

class TextePannel extends KeyAdapter {

public
void
keyTyped(KeyEvent key) {

System.

out .println(
"touche : "
+key.getKeyChar());

}

}

 



Le MouseAdapter marche trés bien mais le KeyAdapter ne fonctionne pas du tout, je ne vois vraiment pas pourquoi..
     
Merci d'avance !! :)

=)
Messages postés
3
Date d'inscription
mardi 30 octobre 2007
Statut
Membre
Dernière intervention
14 octobre 2008

Salut,

j'avais "à moitié" résolu le problème à l'époque.
C'est à dire que maintenant mon programme détecte bien les frappes de clavier mais je suis quand  même obligé de faire alt-Tab deux fois puis de cliquer sur l'écran avec la souris juste après le démarrage du programme, sinon ça marche pas.

La semi solution était donc:
1) Remplacer bidule.addKeyListener(truc)  par  bidule.getOwner().addKeyListener(truc) et
2) Rajouter une ligne frame.setVisible(true)

après la création de ma frame
Messages postés
14
Date d'inscription
dimanche 3 novembre 2002
Statut
Membre
Dernière intervention
25 juin 2009

J'ai enfin trouvé la solution si ça peut aider certains :
(merci à celui qui a poster cette réponse sur un autre forum)

JPanel panel = new JPanel();

panel.setFocusable(true);

panel.requestFocus();

//A de maintenant, ton JPanel  gerer lesle KeyListener

 

=)