Attendre une frappe clavier pour réaliser une action

Attendre une frappe clavier pour réaliser une action - Java - Programmation

Marsh Posté le 29-10-2007 à 19:23:18    

Bonjour,
 
je suis en train de réaliser une application en JAVA.
C'est pas un applet, ni du swing. Je travaille en plein écran (je sais pas si ça peut avoir une importance).
Toujours est-il que je ne trouve pas le moyen de déclencher un son sur une frappe de la barre d'espace (ou de n'importe quelle touche du clavier).
 
Jusqu'à présent j'ai créé une sous-classe de Component, à laquelle j'ajoute une sous-classe de KeyAdapter par la méthode addKeyListener(). Dans cette sous-classe, j'ai bien redéfini la fonction KeyPressed pour qu'elle déclenche des sons de cette manière:
 
 
public void keyPressed(KeyEvent e){
   
   try{  
    v.play();
   } catch(Exception exception)
    {
     System.out.println("Erreur ligne 26 de GestionClavierPressed.java" );
    }
   
 }  
 
Bref, y a pas de son, alors que mes fonctions sonores marchent parfaitement par ailleurs, si je n'essaye pas de les lancer via un KeyListener.
 
Des idées ?
 
Merci d'avance pour votre aide.

Message cité 1 fois
Message édité par basile238 le 29-10-2007 à 19:23:59
Reply

Marsh Posté le 29-10-2007 à 19:23:18   

Reply

Marsh Posté le 30-10-2007 à 20:57:37    

Bon, désolé de me répondre à moi-même mais sérieux, c'est impossible en java de gérer une frappe au clavier ?
Ca fait deux jours que je cherche presque à plein temps et je n'y arrive toujours pas.
 
Je prends tous vos conseils.
 
Pour commencer et pour simplifier, j'aimerais réaliser une application qui fasse un bip quand je frappe sur n'importe quelle touche du clavier.
 
Je sais comment faire un bip: Toolkit.getDefaultToolkit().beep();
Pouvez-vous m'aider pour le reste ?
 
Je vous en prie! Je suis vraiment déséspéré.

Reply

Marsh Posté le 31-10-2007 à 20:42:34    

basile238 a écrit :

Bonjour,
 
je suis en train de réaliser une application en JAVA.
C'est pas un applet, ni du swing.


 
pas un applet, ni du swing ... ça serait plus facile si tu disais directement ce que c'est :d
 
vu le code que tu utilises plus loins avec le KeyEvent, je suppose que tu utilises donc awt.
Et je vois pas où est ton problème, une fois ton component awt défini tu n'as qu'à faire par exemple (pour la touche espace) :

Code :
  1. tonComponent.addKeyListener(new KeyListener(){
  2.   public void keyPressed(KeyEvent arg0) {
  3.    if(arg0.getKeyCode() == KeyEvent.VK_SPACE){
  4.     Toolkit.getDefaultToolkit().beep();
  5.    }
  6.   }
  7.   public void keyReleased(KeyEvent arg0) {}
  8.   public void keyTyped(KeyEvent arg0) {}
  9.  });
  10. }


 
 

basile238 a écrit :

Je travaille en plein écran (je sais pas si ça peut avoir une importance).


euuuuh ?


---------------
- mon feed-back
Reply

Marsh Posté le 10-11-2007 à 15:34:30    

C'est exactement ce que j'ai fait et ça marche pas.
Mon component est un objet Window.
Rien à faire, il ne reconnaît pas les frappes claviers.
Je suis désespéré.

Reply

Marsh Posté le 10-11-2007 à 16:23:06    

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:
 

Code :
  1. import java.util.*;
  2. import java.awt.*;
  3. import java.awt.image.*;
  4. public class PleinEcran{
  5. /* fonction passant en plein écran et renvoyant un objet Graphics  
  6. * permettant de dessiner dessus
  7. */
  8. public static Window ECRAN_PRINCIPAL = null;
  9. public static Graphics pleinEcran(){
  10. //Récupération de l’environnement graphique disponible à notre //application
  11. GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
  12. //Récupération de l’écran
  13. GraphicsDevice gd = ge.getDefaultScreenDevice();
  14.    // Création des fenêtres d’affichage
  15.    Frame frame = new Frame(gd.getDefaultConfiguration());
  16.      Window win = new Window(frame);
  17. // Passage au mode plein écran
  18.    gd.setFullScreenWindow(win);
  19.         win.requestFocus();
  20. //Sélection de la résolution et de la profondeur de couleur
  21.  DisplayMode[] affichages = gd.getDisplayModes();
  22. for(int i=0;i<affichages.length;i++){
  23.       if((affichages[i].getWidth()==1025)&&(affichages[i].getHeight()==768)&&(affichages[i].getBitDepth()==32)){
  24.    gd.setDisplayMode(affichages[i]);
  25.   }
  26. }
  27. //Taille de l’écran
  28.         int screenWidth = win.getWidth();
  29.         int screenHeight = win.getHeight();
  30. // Récupération de l’instance de ‘Graphics’ correspondant à l’écran
  31. Graphics graphicwindow = win.getGraphics();
  32. // Création du tampon qui représentera les pixels de
  33. // ‘MemoryImageSource’
  34.     int size = screenWidth * screenHeight;
  35. int[] pixels = new int[size];
  36. //Création de la ‘MemoryImageSource’
  37. MemoryImageSource source = new MemoryImageSource(screenWidth, screenHeight, pixels, 0, screenWidth);
  38. //Spécifie qu’il s’agit d’une animation avec une succession d’images
  39. source.setAnimated(true);
  40.        //A chaque fois qu’il y’aura un changement on mets à jour toute
  41.        //l’image
  42. source.setFullBufferUpdates(true);
  43. //Création de l’image associée à ‘MemoryImageSource’
  44. Image offscreen = Toolkit.getDefaultToolkit().createImage(source);
  45. ECRAN_PRINCIPAL = win;
  46. return graphicwindow;
  47. }


 
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:
 

Code :
  1. import java.awt.*;
  2. import java.awt.event.*;
  3. public class EcranMerde extends KeyAdapter{
  4. public void keyReleased(KeyEvent e){
  5.  Toolkit.getDefaultToolkit().beep();
  6. }
  7. public static void main(String[] args){
  8.  PleinEcran.pleinEcran();
  9.  PleinEcran.ECRAN_PRINCIPAL.addKeyListener(new EcranMerde());
  10. }
  11. }


 
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à.

Reply

Marsh Posté le 10-11-2007 à 18:25:32    

J'ai modifié 2 truc dans ton code, et ça marche :) :
 
dans EcranMerde.java :

Code :
  1. PleinEcran.ECRAN_PRINCIPAL.getOwner().addKeyListener(new EcranMerde());


 
dans PleinEcran.java :

Code :
  1. frame.setVisible(true);


 
Ce qui donne au final :
 

Code :
  1. import java.awt.*;
  2. import java.awt.event.*;
  3. public class EcranMerde extends KeyAdapter {
  4. public void keyReleased(KeyEvent e) {
  5.  Toolkit.getDefaultToolkit().beep();
  6. }
  7. public static void main(String[] args) {
  8.  PleinEcran.pleinEcran();
  9.  PleinEcran.ECRAN_PRINCIPAL.getOwner().addKeyListener(new EcranMerde());
  10. }
  11. }


 
et
 

Code :
  1. import java.util.*;
  2. import java.awt.*;
  3. import java.awt.image.*;
  4. public class PleinEcran {
  5. /*
  6.  * fonction passant en plein écran et renvoyant un objet Graphics permettant
  7.  * de dessiner dessus
  8.  */
  9. public static Window ECRAN_PRINCIPAL = null;
  10. public static Graphics pleinEcran() {
  11.  // Récupération de l’environnement graphique disponible à notre
  12.  // //application
  13.  GraphicsEnvironment ge = GraphicsEnvironment
  14.    .getLocalGraphicsEnvironment();
  15.  // Récupération de l’écran
  16.  GraphicsDevice gd = ge.getDefaultScreenDevice();
  17.  // Création des fenêtres d’affichage
  18.  Frame frame = new Frame(gd.getDefaultConfiguration());
  19.  Window win = new Window(frame);
  20.  // Passage au mode plein écran
  21.  gd.setFullScreenWindow(win);
  22.  win.requestFocus();
  23.  // Sélection de la résolution et de la profondeur de couleur
  24.  DisplayMode[] affichages = gd.getDisplayModes();
  25.  for (int i = 0; i < affichages.length; i++) {
  26.   if ((affichages[i].getWidth() == 1025)
  27.     && (affichages[i].getHeight() == 768)
  28.     && (affichages[i].getBitDepth() == 32)) {
  29.    gd.setDisplayMode(affichages[i]);
  30.   }
  31.  }
  32.  // Taille de l’écran
  33.  int screenWidth = win.getWidth();
  34.  int screenHeight = win.getHeight();
  35.  // Récupération de l’instance de ‘Graphics’ correspondant à l’écran
  36.  Graphics graphicwindow = win.getGraphics();
  37.  // Création du tampon qui représentera les pixels de
  38.  // ‘MemoryImageSource’
  39.  int size = screenWidth * screenHeight;
  40.  int[] pixels = new int[size];
  41.  // Création de la ‘MemoryImageSource’
  42.  MemoryImageSource source = new MemoryImageSource(screenWidth,
  43.    screenHeight, pixels, 0, screenWidth);
  44.  // Spécifie qu’il s’agit d’une animation avec une succession d’images
  45.  source.setAnimated(true);
  46.  // A chaque fois qu’il y’aura un changement on mets à jour toute
  47.  // l’image
  48.  source.setFullBufferUpdates(true);
  49.  // Création de l’image associée à ‘MemoryImageSource’
  50.  Image offscreen = Toolkit.getDefaultToolkit().createImage(source);
  51.  ECRAN_PRINCIPAL = win;
  52.  frame.setVisible(true);
  53.  return graphicwindow;
  54. }
  55. }


 
Chez moi l'appel à Toolkit.getDefaultToolkit().beep(); ne marche pas (aucun beep ne se fait entendre :d) alors pour tester j'ai remplacé par System.out.println("beep!" ); et ça s'affiche dans la console. Mais si chez toi le beep() fonctionne, alors c'est bon :)
 
:hello:


---------------
- mon feed-back
Reply

Marsh Posté le 11-11-2007 à 10:42:28    

Salut et merci pour ta réponse,
 
tu es sûr que ça marche chez toi ?
Parce-que j'ai fait la modif que tu proposes et ça ne fonctionne toujours pas.
J'ai ensuite même copié-collé exactement les sources que tu me donnes (au cas où tu ais fait une modif que tu aurais oublié de mentionner). Résultat: c'est toujours pareil.
Ni bip, ni écriture de "beep!" dans la console (oui, j'ai aussi essayé en remplaçant le beep par un System.out.println).
 
Là vraiment, je ne comprends plus rien. Si ça marche chez toi et qu'en copiant-collant exactement ce que tu as fait (sans rajouter rien d'autre, juste ces deux fichiers, exactement et seulement les mêmes fichiers), ça ne marche pas chez moi, que puis-je conclure à part que je suis maudit ?


Message édité par basile238 le 11-11-2007 à 10:42:55
Reply

Marsh Posté le 11-11-2007 à 18:34:24    

ben ouai ça marche :d
 
je suis sur eclipse, jre 1.6.0_03 :)
 
tu cliques sur la fenêtre qui arrive en full screen avant de taper sur les touches ? parcequ'il faut que la fenêtre ait le focus


---------------
- mon feed-back
Reply

Marsh Posté le 13-11-2007 à 16:48:53    

Oui, je cliquais bien sur la fenêtre et ça marchait pas.
Mais maintenant, j'ai trouvé: je fait alt-tab, je cliques sur la frame,puis je double clique sur la fenêtre iconisée et... ça marche! Le logiciel est destiné uniquement à mon travail perso donc ça ne m'ennuie pas de faire ce petit cérémonial à chaque fois.
 
En tout cas, merci beaucoup pour ton aide. Sans les lignes que tu as modifiée/rajoutée, ça ne marcherait pas.
Merci à toi!!!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed