Raccourcit clavier.

nonoz Messages postés 57 Date d'inscription mercredi 29 janvier 2003 Statut Membre Dernière intervention 23 juin 2004 - 21 juin 2004 à 12:20
nonoz Messages postés 57 Date d'inscription mercredi 29 janvier 2003 Statut Membre Dernière intervention 23 juin 2004 - 23 juin 2004 à 11:51
Bonjour,

j'ai un certain nombre de boutons dans mon application. Je souhaiterais mettre des raccourcit clavier dessus. Pour cela j'ai utilise le code suivant:
  requestFocus();

   public void keyPressed(KeyEvent evt){  System.out.println("nom");}
   public void keyReleased(KeyEvent evt){}
   public void keyTyped(KeyEvent evt)
   {
     String nom = ((JButton)evt.getSource()).getText();
     System.out.println("nom" + nom);
    }

jButton1.setMnemonic('C');
jButton1.setMnemonic('c');
jButton9.setMnemonic(KeyEvent.VK_R);

Mais ca marche pas, si quelqu'un avait une idee du pourquoi?

Petite description de mon prog.
C'est une calculatrice.
Elle est constitue de 3 classes:
- la principale qui gere le calcul
- la econde qui me sert de memoire
- la troisieme qui affiche les boutons.

Si vous voulez jeter un coup d'oeil dessus

 // je recuepere tous les import dont j'ai besoin
import java.awt.* ;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.event.*;

public class boutons extends JPanel implements  ActionListener{

// création des éléments et du layout
   GridBagLayout gridBagLayout1 = new GridBagLayout();
   JButton jButton1 = new JButton("1");
   JButton jButton2 = new JButton("2");
   JButton jButton3 = new JButton("3");
 //(etc...)

//je declare une variable dans lequel je vais mettre mon applet.
   private Applet1 c;

//erreur ici
//

public boutons (Applet1 c) {
this.c=c;
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}

private void jbInit() throws Exception {
//creation des ecouteurs
    jButton1.addActionListener(this);
    jButton2.addActionListener(this);
    jButton3.addActionListener(this);
 //(etc...)

    //je mets tout l'affichage en place.

    this.setLayout(gridBagLayout1);

    // positionnement des éléments dans le GridbagLayout

    jButtonp.setPreferredSize(new Dimension(49, 25));
    jButtonp.setBackground(Color.green);
    jButtonp.setMaximumSize(new Dimension(41, 25));
    jButtonp.setMinimumSize(new Dimension(49, 25));
 //(etc...)

    this.add(jButton1,                                  new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
    this.add(jButton2,                                  new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0
            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
 //(etc...)

 }

      /** gestion des événements */
    public void actionPerformed(ActionEvent e) {
        //je recupere le nom du bouton puis le premier char de ce nom
        String nom = ((JButton)e.getSource()).getText();
        char nompremiercar = nom.charAt(0);

        //j'appelle resultat qui se trouve dans l'applet
        c.calcul(nompremiercar);

      }

}

//-----------------------------------------------------------

import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import javax.swing.*;

public class Applet1 extends Applet{

  boolean isStandalone = false;
  JPanel fondcalc = new JPanel();
  GridBagLayout gridBagLayout1 = new GridBagLayout();
  JLabel jLabel1 = new JLabel("Bonjour !");
  static String chiffre = "0";
  boolean bool = false;
 // private double result = 0;//contient la valeur du calcul en cours
  char operateur = '+';//contient la valeur de l'operateur

  /**Obtenir une valeur de paramètre*/
  public String getParameter(String key, String def) {
    return isStandalone ? System.getProperty(key, def) :
      (getParameter(key) != null ? getParameter(key) : def);
  }

  /**Construire l'applet*/
  public Applet1() {
  }
  /**Initialiser l'applet*/
  public void init() {

    try {
      jbInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }
  /**Initialiser le composant*/
  private void jbInit() throws Exception {

    fondcalc.setLayout(gridBagLayout1);

    boutons mazoneboutons=new boutons(this);

    jLabel1.setBackground(Color.white);
    jLabel1.setOpaque(true);
    jLabel1.setPreferredSize(new Dimension(72, 15));
    jLabel1.setVerifyInputWhenFocusTarget(true);
    jLabel1.setHorizontalAlignment(SwingConstants.RIGHT);
    jLabel1.setHorizontalTextPosition(SwingConstants.RIGHT);
    jLabel1.setVerticalTextPosition(SwingConstants.CENTER);

    fondcalc.setBackground(SystemColor.control);
    fondcalc.setMinimumSize(new Dimension(200, 200));
    fondcalc.setPreferredSize(new Dimension(400, 300));
    fondcalc.add(jLabel1,            new GridBagConstraints(0, 0, 3, 1, 0.0, 0.0
            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 5, 0), 192, 0));
  fondcalc.add(mazoneboutons,       new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
    this.add(fondcalc, null);

  }
  /**Obtenir les informations d'applet*/
  public String getAppletInfo() {
    return "Information applet";
  }
  /**Obtenir les informations de paramètre*/
  public String[][] getParameterInfo() {
    return null;
  }

  /** pour reinitialise ma varible chiffre... */
  void initia(){
    chiffre = "0";
  }

  /** pour reinitialise tout... */
  void initiatout(){
    memoirecalc = new MemoireCalc();
    operateur = '+';
    chiffre = "0";
    estegale = 0.0;
    resulta =0.0;
    bool = false;
    jLabel1.setText("Remise à "+estegale);
  }

  boolean boolcalc = false;//pour savoir si on doit faire le calcul
  /** Fait le calcul */
  static double resulta =0.0;
  static double resultb =10.0;
  static double estegale = 0.0;
  static char tempoperateur ='+';
  static double tmp;
 double test;

 private void faitlecalcul(){

    resulta = Double.parseDouble(chiffre);
    System.out.println("ici" + operateur + "temp" +tempoperateur+"res"+resulta);
    switch (operateur) {
 //(etc...)
      case '+':
        System.out.println("memoirea" + memoirecalc.resultinter());
        test = memoirecalc.resultinter();
        System.out.println("test" + test);
        test = test + resulta;
        memoirecalc = new MemoireCalc(test);
        System.out.println("memoireb" + memoirecalc.resultinter());

        jLabel1.setText("" + memoirecalc.resultinter());
        operateur = tempoperateur;
        break;

      default:
        jLabel1.setText("defaut +"+estegale+operateur+resulta+"temp"+tempoperateur);
        break;
    }
    initia();
    bool = false;
  }

/** en fonction du bouton appuye on fait differentes choses */
void calcul(char val){
    switch (val) {
      case 'O':
        initiatout();
        break;
      case '+':
        tempoperateur = '+';
        faitlecalcul();
        break;
 //(etc...)
      default:
            System.out.println("defaut" + operateur + "temp" +tempoperateur+"res"+resulta);
        if(tempoperateur=='='){
          initiatout();
        }
        if(bool == true){
          chiffre =chiffre+val;
        }else{
          chiffre = ""+val;
          bool = true;
        }

        jLabel1.setText(""+chiffre);
        break;
    }

  }

//je construit ma classe memoire
MemoireCalc memoirecalc = new MemoireCalc();
//
}

//----------------------------------------------------------------------------------------

/** conserve en memoire le resultat de mon calcul */
class MemoireCalc{
    double resultinter;//contient le resultat intermediaire
    double M1;//bouton memoire 1
    double M2;//bouton memoire 2

    MemoireCalc() {//pour surcharger ma classe
      resultinter = 0;
      M1 = 0;
      M2 = 0;
    }

    MemoireCalc(double resultinter) {//methode qui enregistre nouvelle valeur intermediaire
      this.resultinter = resultinter;
    }

    double resultinter() {//methode renvoyant la valeur du resultat intermediare
      return resultinter;
    }
}



d'avance merci

23 réponses

wargre Messages postés 649 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 9 septembre 2004 7
21 juin 2004 à 14:21
Tout en haut je vois que tu recupere un evenement sur keyTyped et oh horreur tu penses que la source est un JButton....

Ca j'y crois pas

Rien a fourtre de la source d'un keytyped
0
cid019 Messages postés 237 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 11 juillet 2006
21 juin 2004 à 14:22
pour les raccourcis clavier fait :
public class boutons extends JPanel implements ActionListener, KeyListener.

Apres dans ton gestionnaire d'evenement :

public void actionPerformed(ActionEvent e)
{
if (e.getSource() == bouton1)
action1;
...
}

public void keyReleased(KeyEvent e) { // rien a faire}
public void keyTyped(KeyEvent e){ // rien a faire}

public void keyPressed(KeyEvent e)
{
if (e.getKeyCode() == KeyEvent. ta_touche)
repete l'action faite par le bouton1
}

et ainsi de sui te pour chaque bouton

cid019
0
cid019 Messages postés 237 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 11 juillet 2006
21 juin 2004 à 14:25
au fait n'oublie pas d'ajouter la commande suivant dans ton programme avant la gestion des evenements :

setKeyListener(this)

voila....

cid019
0
nonoz Messages postés 57 Date d'inscription mercredi 29 janvier 2003 Statut Membre Dernière intervention 23 juin 2004
21 juin 2004 à 19:42
Merci cid019.

Je comprend pas bien a quoi sert le keyTyped? Meme si ca ne sert a rien pourquoi c'est une horreur de le mettre wargre ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nonoz Messages postés 57 Date d'inscription mercredi 29 janvier 2003 Statut Membre Dernière intervention 23 juin 2004
21 juin 2004 à 20:12
resalut,

Des que je rajoute , KeyListener dans
public class boutons extends JPanel implements ActionListener, KeyListener

il veut obligatoirement que ma classe soit declare en abstraite. Or cela plante mon prog. Pourquoi faut il que la classe soit abstraite?
0
cid019 Messages postés 237 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 11 juillet 2006
22 juin 2004 à 07:57
voici un exemple que j'avais fait pour un projet de pacman :

// Fenetre de lancement du programme
class FenetrePal extends Frame implements ActionListener, KeyListener

public void keyReleased(KeyEvent e) { /* RIEN A FAIRE */ }
public void keyTyped(KeyEvent e) { /* RIEN A FAIRE */ }

public void keyPressed(KeyEvent e)
{
if (e.getKeyCode() == KeyEvent.VK_P)
Jeu.getInstance().setPause(!Jeu.getInstance().getPause());
else if (e.getKeyCode() == KeyEvent.VK_Q)
{
new VerifQuit().show();
}
}

pour l'histoire de la classe abstraite je sais pas trop, peut etre as-tu oublié de déclarer une des fonctions gérant les evenements? Ou peut-etre ca vient du fait que ta classe soit 'public' mais j'y crois pas trop.

Envoie l'erreur renvoyé, ca peut toujours eclaircir la chose

cid019
0
wargre Messages postés 649 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 9 septembre 2004 7
22 juin 2004 à 08:50
c'est pas le keyTyped qui est une horreur c'est le evt.getSource() et le cast en JButton qui est pas le bienvenu
0
nonoz Messages postés 57 Date d'inscription mercredi 29 janvier 2003 Statut Membre Dernière intervention 23 juin 2004
22 juin 2004 à 09:29
a oui d'accord j'ai compris. merci wargre
0
nonoz Messages postés 57 Date d'inscription mercredi 29 janvier 2003 Statut Membre Dernière intervention 23 juin 2004
22 juin 2004 à 09:44
cid019 -> tu me disais d'utiliser setKeyListener(this) mais dans ton exemple tu ne l'utilises pas???
VK_P ca designe bien la touche P (majuscule)?
et a quel endroit et comment dois je utiliser le setKeyListener(this)? Le prog considere ca comme une methode mais je ne l'ai pas cette methode. Et si je ne le mets pas mon prog compile mais ne capte absolument pas que je tappe sur les touches.

sinon c'est bizarre j'ai pas l'impression d'avoir change quelque chose mais le prog ne me demande plus de mettre ma classe en abstract???

merci.
0
wargre Messages postés 649 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 9 septembre 2004 7
22 juin 2004 à 09:46
c'est plutot addkeyListener (du JFrame)
0
cid019 Messages postés 237 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 11 juillet 2006
22 juin 2004 à 09:52
classe de la JFrame:

public FenetrePal()
{
setTitle("Pacman");
setFocusable(true);

setLayout(new BorderLayout());
setSize(1024, 640);
place();

//creation des menus
mb = new MenuBar();
mnuFich = new Menu("Fichier");
....

Jeu.getInstance().setKeyListener(this);

....
}

et la la gestion d'evenements
cid019
0
cid019 Messages postés 237 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 11 juillet 2006
22 juin 2004 à 09:54
laisse tombre le setKeyListener, c'est un truc qu'on avait fabriqué nous, desolé
cid019
0
cid019 Messages postés 237 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 11 juillet 2006
22 juin 2004 à 09:54
mais effectivement essaie addKeyListener(this)
ca devrait marcher
cid019
0
nonoz Messages postés 57 Date d'inscription mercredi 29 janvier 2003 Statut Membre Dernière intervention 23 juin 2004
22 juin 2004 à 10:14
"Applet1.java" : Erreur No. 215 : déclaration de méthode incorrecte ; type retourné nécessaire en ligne 273, colonne 17

"Applet1.java" : Erreur No. 203 : début de type incorrect en ligne 273, colonne 18

addKeyListener(this);

:sad) snif...
0
nonoz Messages postés 57 Date d'inscription mercredi 29 janvier 2003 Statut Membre Dernière intervention 23 juin 2004
22 juin 2004 à 10:17
bon je l'ai mis dans mon jbinit pour eviter l'erreur mais bon rien ne se passe... il ne capte absolument pas les touches... :(
0
cid019 Messages postés 237 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 11 juillet 2006
22 juin 2004 à 10:25
voila le programme que je suis en trai de faire :

class FenetrePal extends JFrame implements ActionListener, KeyListener
{
.....

addKeyListener(this);

public void keyTyped(KeyEvent e){}
public void keyReleased(KeyEvent e){}

public void keyPressed(KeyEvent e)
{
if (e.getKeyCode() == KeyEvent.VK_Q)
{
System.exit(0);
MenuPal.bdd.Deconnecte();
}
}

public void actionPerformed (ActionEvent e)
{
if (e.getSource() == mnuAjout)
{
menu = 0;
new Choix(this).show();
}
else if (e.getSource() == mnuModif)
{
menu = 1;
new Choix(this).show();
}
else if (e.getSource() == mnuSuppr)
{
menu = 2;
new Choix(this).show();
}
}
}

Je viens d'essayer et ca marche

cid019
0
cid019 Messages postés 237 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 11 juillet 2006
22 juin 2004 à 10:26
au fait les raccourcis tels que VK_Q s'utilise en faisant ctrl + Q
et ainsi pour toutes les touches....
:)
cid019
0
nonoz Messages postés 57 Date d'inscription mercredi 29 janvier 2003 Statut Membre Dernière intervention 23 juin 2004
22 juin 2004 à 10:37
:big) Avec la touche control ca marche deja mieux... :)
0
nonoz Messages postés 57 Date d'inscription mercredi 29 janvier 2003 Statut Membre Dernière intervention 23 juin 2004
22 juin 2004 à 10:42
Un Grand Merci !!! :)

QUestion subsidiaire:
Que dois je mettre a la place de VK pour pouvoir utiliser les touches du pave numerique?

et sinon quand je suis dans mon navigateur il faut que je clique sur l'appli pour que ca fonctionne. Est il possible de mettre directement le focus sur l'appli?
0
cid019 Messages postés 237 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 11 juillet 2006
22 juin 2004 à 10:52
pour le focus utilise la methode setFocusalbe(true ou false) sur le composant souhaité.
Normalement ca marche. J'ai le meme probleme mais je l'ai pas resolu. J'ai du mettre l'instruction au mauvais endroit

cid019
0
Rejoignez-nous