#1 Le 28/12/2012, à 12: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, à 19:27)
#2 Le 28/12/2012, à 18: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!
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, à 18:42)