Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 28/12/2012, à 13:40

compte supprimé

[Java] Prendre en compte plusieurs touches appuyées. [Résolu]

Bonjour,

Comme le titre le suggère, je voudrais prendre en compte plusieurs touches appuyées en java.

Voici un petit programme que je viens tout juste d'écrire.. il déplace un cercle au centre! ^^

TestPanel.java (là o`u tout se trouve)

import java.awt.Frame;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.TextField;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;


import java.awt.Panel;

import java.awt.BorderLayout;

public class TestPanel extends Frame{
        static final int dep = 10; //constante pour le déplacement.
        static final long serialVersionUID = 1l; // Mauvaise facon mais j'aime pas les Warnings
        private TextField tf;
        
        private Panneau pan = new Panneau();
       
        public TestPanel(){
                this.setLayout(new BorderLayout()); // Layout
                
                this.setTitle("Titre de ma fenêtre Test.");
                
                this.setBackground(Color.gray);
                this.tf = new TextField(); // Un textfield
                this.tf.setEditable(false); // non editable
                this.tf.addKeyListener(new RecepteurClavier()); // auquel on rajoute un recepteur clavier
                this.add(this.tf, BorderLayout.NORTH); // Ajout de ce textfield a la fenetre
                
                
                //this.pan.addKeyListener(new RecepteurClavierPan());
                this.add(this.pan, BorderLayout.CENTER);
                
                //this.pack(); // adaptation de la taille
                
                this.addWindowListener(new WindowAdapter(){ // Permet de fermer la frame
                        public void windowClosing(WindowEvent e){System.exit(0);}
                });
                
                
                
                this.setVisible(true); // affichage
                
                this.setSize(300,300);
        }
        public TextField getTf(){return this.tf;};
        
        public Panneau getPan(){return this.pan;}

        public static void main(String[] args){ 
            TestPanel t = new TestPanel();   
        
            //t.setSize(300,300);
        }
       
        public class RecepteurClavier implements KeyListener{
                /**
                 * Touche enfoncée
                 * @param event
                 */
                public void keyPressed(KeyEvent event){
                        int source = event.getKeyCode();
                        //int source2 = event.getKeyCode();
                        TestPanel testActu = TestPanel.this;
                        /*if((source==KeyEvent.VK_UP)||(source2==KeyEvent.VK_UP)){
                                testActu.getTf().setText("Haut");
                                testActu.getPan().setPosY(testActu.getPan().getPosY()-dep);
                        }
                        else if((source==KeyEvent.VK_DOWN)||(source2==KeyEvent.VK_DOWN)){
                                testActu.getTf().setText("Bas");
                                testActu.getPan().setPosY(testActu.getPan().getPosY()+dep);
                        }
                        else if((source==KeyEvent.VK_RIGHT)||(source2==KeyEvent.VK_RIGHT)){
                                testActu.getTf().setText("Droite");
                                testActu.getPan().setPosX(testActu.getPan().getPosX()+dep);
                        }
                        else if((source==KeyEvent.VK_LEFT)||(source2==KeyEvent.VK_LEFT)){
                                testActu.getTf().setText("Gauche");
                                testActu.getPan().setPosX(testActu.getPan().getPosX()-dep);
                        }
                        else if(source==KeyEvent.VK_A){
                                testActu.getTf().setText("A");
                        }*/
                        if((source==KeyEvent.VK_UP)){
                                testActu.getTf().setText("Haut");
                                testActu.getPan().setPosY(testActu.getPan().getPosY()-dep);
                        }
                        else if((source==KeyEvent.VK_DOWN)){
                                testActu.getTf().setText("Bas");
                                testActu.getPan().setPosY(testActu.getPan().getPosY()+dep);
                        }
                        else if((source==KeyEvent.VK_RIGHT)){
                                testActu.getTf().setText("Droite");
                                testActu.getPan().setPosX(testActu.getPan().getPosX()+dep);
                        }
                        else if((source==KeyEvent.VK_LEFT)){
                                testActu.getTf().setText("Gauche");
                                testActu.getPan().setPosX(testActu.getPan().getPosX()-dep);
                        }
                        else if(source==KeyEvent.VK_A){
                                testActu.getTf().setText("A");
                        }
                        testActu.getPan().repaint();
                 }
               
                /**
                 * Touche relachée
                 * @param event
                 */
                 public void keyReleased(KeyEvent event){}
                
                 /**
                  * Cractere tappé
                  * @param event
                  */
                 public void keyTyped(KeyEvent event){}
               
        }
        
        
                    
}   
       

Panneau.java (un panneau sur lequel on affiche notre cercle)

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GradientPaint;
import javax.swing.JPanel;
 
public class Panneau extends JPanel {
  private int posX = 0;
  private int posY = 0;

  public void paintComponent(Graphics g){
    //On choisit une couleur de fond pour le rectangle
    Graphics2D g2d = (Graphics2D) g;
    GradientPaint gp1 = new GradientPaint(0, 0, Color.RED, this.getWidth(), this.getHeight(), Color.CYAN, true);
    g2d.setColor(Color.white);
    g2d.setPaint(gp1);
    //On le dessine de sorte qu'il occupe toute la surface
    g2d.fillRect(0, 0, this.getWidth(), this.getHeight());
    //On redéfinit une couleur pour le rond
    g2d.setColor(Color.red);
  
    //On le dessine aux coordonnées souhaitées
    g2d.fillOval(posX, posY, 50, 50);  }

  public int getPosX() {
    return posX;
  }

  public void setPosX(int posX) {
    this.posX = posX;
  }

  public int getPosY() {
    return posY;
  }

  public void setPosY(int posY) {
    this.posY = posY;
  }
}

Dernière modification par ChrisLeturc (Le 28/12/2012, à 20:27)

#2 Le 28/12/2012, à 19:07

compte supprimé

Re : [Java] Prendre en compte plusieurs touches appuyées. [Résolu]

Pour les petits nouveaux qui se demandent comme moi comment gérer plusieurs événements en même temps.

Voici une réponse que je propose puisque personne ne m'a répondu..

Créer une liste dans laquelle on stocke les touches appuyées!

Merci pour toutes ces réponses! ^^'
Je me suis senti soutenu.. comme quoi, parfois, il faut se prendre par la main tout seul et avancer. *huhu*
J'avoue que sur ce coup là, j'ai été un peu phénophobe. (peur de réfléchir = XD)

Toutes critiques sur ma méthode sera la bienvenue!


J'ai réussi à faire planter mon programme quand j'appuie sur toutes les touches de mon clavier..
Je choppe tout plein d'exceptions! big_smile

84 65 90 69 82 73 80 72 66 
84 65 90 69 82 73 80 72 66 
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
	at java.util.ArrayList.elementData(ArrayList.java:338)
	at java.util.ArrayList.remove(ArrayList.java:415)
	at TestPanel$RecepteurClavier.keyReleased(TestPanel.java:159)
	at java.awt.Component.processKeyEvent(Component.java:6350)
	at java.awt.Component.processEvent(Component.java:6166)
	at java.awt.TextComponent.processEvent(TextComponent.java:675)
	at java.awt.TextField.processEvent(TextField.java:588)
	at java.awt.Component.dispatchEventImpl(Component.java:4750)
	at java.awt.Component.dispatchEvent(Component.java:4576)
	at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1895)
...

Remarque: j'ai eu beaucoup de mal à dépasser les quatre touches appuyées?
(les numéros sont les valeurs des touches appuyées. )

Dernière modification par ChrisLeturc (Le 28/12/2012, à 19:42)