Ces évènements sont très simple, je veux simplement récupérer le code caractère de la touche frappée, cela suffit à mes besoins.
J'ai pas mal cherché et j'ai utilisé un tutoriel expliquant comment gérer des rectangles vectoriellement (je les déplace librement). Ca marche bien.
Le problème est que je n'arrive pas à récupérer les évenements clavier de ma fenêtre
J'ai le code suivant (de main.java)
package testuih2;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import testuih2.GUIHelper;
import testuih2.IDrawable;
import testuih2.JCanvas;
import testuih2.RectangleDrawable;
public class Main implements KeyListener{
static JCanvas jc = new JCanvas();
IDrawable rect2;
public Main () { }
public static void main (String[] args) {
jc.setBackground(Color.WHITE);
jc.setPreferredSize(new Dimension(400,200));
Dimension dim =new Dimension(40,60);
IDrawable rect = new RectangleDrawable(Color.RED,new Point(10,10),dim);
jc.addDrawable(rect);
GUIHelper.showOnFrame(jc,"test JCanvas");
}
public void keyTyped(KeyEvent e) {
System.out.print ("Event clavier trouvé");
System.out.print (e.getKeyChar ());
Dimension dim2 =new Dimension(40,60);
rect2 = new RectangleDrawable(Color.RED,new Point(25,30),dim2);
}
public void keyPressed(KeyEvent e) {
System.out.print ("KEY PRESSED: ");
System.out.print (e.getKeyChar ());
}
public void keyReleased(KeyEvent e) {
System.out.print ("KEY RELEASED: ");
System.out.print (e.getKeyChar ());
}
}
J'ai pensé que implémenter KeyListener directement dans main, me permettrait d'attraper ces foutus évenements clavier.
J'ai essayé la même chose dans Canvas, ça ne donne rien.
J'ai aussi essayé de créer une classe EcouteurClavier l'implémentant, avec les
mêmes méthodes KeyPressed, etc...
Franchement je suis bloqué, Pourriez vous SVP m'expliquer la logique, parce que je comprend pas trop là...
Merci !
# Manque le addKeyListener ?
Posté par Jean-Marc (site web personnel) . Évalué à 1.
Donc si j'ai bien suivi, il faut ajouter dans ton main :
jc.addKeyListener(this);
[^] # Re: Manque le addKeyListener ?
Posté par Ontologia (site web personnel) . Évalué à 1.
/home/montaigne/Developpement/Java/TestUIH2/src/testuih2/Main.java:47: non-static variable this cannot be referenced from a static context
jc.addKeyListener(this);
1 error
Là je vois pas, faut que je fasse une classe à part ?
« Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker
[^] # Re: Manque le addKeyListener ?
Posté par Jean-Marc (site web personnel) . Évalué à 2.
Essaye de mettre la ligne dans la méthode Main(), c'est-à-dire dans le constructeur. Le mot-clé "this" n'a aucun sens dans une méthode déclarée statique !
[^] # Re: Manque le addKeyListener ?
Posté par Jean-Marc (site web personnel) . Évalué à 2.
Donc il faut d'abord créer un objet Main puis ratacher les évènements clavier à celui-ci.
Ce devrait donner quelque chose comme ça :
public static void main (String[] args) {
jc.setBackground(Color.WHITE);
jc.setPreferredSize(new Dimension(400,200));
Dimension dim =new Dimension(40,60);
IDrawable rect = new RectangleDrawable(Color.RED,new Point(10,10),dim);
jc.addDrawable(rect);
///
Main m = new Main();
jc.addKeyListener(m);
///
GUIHelper.showOnFrame(jc,"test JCanvas");
}
[^] # Re: Manque le addKeyListener ?
Posté par Ontologia (site web personnel) . Évalué à 1.
Je suis allé voir la doc sur le addKeyListener, et je me suis rendu compte qu'il prenait un KeyListener l en argument.
J'ai donc repris mon objet ecouteurclavier
Je l'ai ensuite déclaré dans main
EcouteurClavier clav = new EcouteurClavier();
et mis jc.addKeyListener(clav);
Bam, même erreur :
Compiling 1 source file to
/home/montaigne/Developpement/Java/TestUIH2/src/testuih2/Main.java:52: non-static variable clav cannot be referenced from a static context
jc.addKeyListener(clav);
1 error
je remet donc static devant
static EcouteurClavier clav = new EcouteurClavier();
Ca compile mais ça donne rien.
Et moi qui doit présenter àça à un oral dans deux jours...
Merci pour tout quand même :) !
« Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker
[^] # Re: Manque le addKeyListener ?
Posté par Ontologia (site web personnel) . Évalué à 1.
public EcouteurClavier () {
}
en
public EcouteurClavier (JCanvas j) {
j.addKeyListener (this);
}
Ca compile mais ça donne rien.
« Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker
# modifie completement ton code
Posté par Gabriel MAGNIEZ (site web personnel) . Évalué à 3.
tout d'abord utilise ta classe Main (c'est vrai que c'est vraiment mal choisi comme nom) donc je dit bien la classe et pas la méthode, donc le code de la classe :
package testuih2;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import testuih2.GUIHelper;
import testuih2.IDrawable;
import testuih2.JCanvas;
import testuih2.RectangleDrawable;
public class Main implements KeyListener{
private staticJCanvas jc = new JCanvas();
private IDrawable rect2;//Pense bien à définir la portée des objets que tu utilise (public/private/protected);
public Main () {
jc = new JCanvas();
jc.setBackground(Color.WHITE);
jc.setPreferredSize(new Dimension(400,200));
Dimension dim =new Dimension(40,60);
IDrawable rect = new RectangleDrawable(Color.RED,new Point(10,10),dim);
jc.addDrawable(rect);
this.addKeyListener(this);//à ajouter
GUIHelper.showOnFrame(jc,"test JCanvas");
}
public static void main (String[] args) {
Main main = new Main(); //à ajouter
}
public void keyTyped(KeyEvent e) {
System.out.print ("Event clavier trouvé");
System.out.print (e.getKeyChar ());
Dimension dim2 =new Dimension(40,60);
rect2 = new RectangleDrawable(Color.RED,new Point(25,30),dim2);
}
public void keyPressed(KeyEvent e) {
System.out.print ("KEY PRESSED: ");
System.out.print (e.getKeyChar ());
}
public void keyReleased(KeyEvent e) {
System.out.print ("KEY RELEASED: ");
System.out.print (e.getKeyChar ());
}
}
avec ça ça devrait marcher normalement
[^] # Re: modifie completement ton code
Posté par Ontologia (site web personnel) . Évalué à 1.
Merci :)
Petit problème, il me dit que this ne connait pas addKeyListener( ds la doc, il est dit que AddKeyListener est une méthode de JComponent), donc j'ai fait descendre Main de JPanel
Ce qui me donne le code suivant :
package testuih2;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import javax.swing.JPanel;
import testuih2.GUIHelper;
import testuih2.IDrawable;
import testuih2.JCanvas;
import testuih2.RectangleDrawable;
import testuih2.IMovableDrawable;
import testuih2.FormDrawable;
/**
*
* @author montaigne
*/
public class Main extends JPanel implements KeyListener {
//private EcouteurClavier machin = new EcouteurClavier();
/** Creates a new instance of Main */
private JCanvas jc;
private FormDrawable rect,rect2;
//EcouteurClavier clav = new EcouteurClavier(jc);
public Main () {
//String[] truc = new String[2];
//m.main(truc);
jc = new JCanvas();
System.out.print ("Test Sortie out");
jc.setBackground(Color.WHITE);
jc.setPreferredSize(new Dimension(400,200));
Dimension dim =new Dimension(40,60);
rect = new RectangleDrawable(Color.RED,new Point(10,10),dim);
//jc.addKeyListener(clav);
jc.addDrawable(rect);
this.addKeyListener(this);
GUIHelper.showOnFrame(jc,"test JCanvas");
for (int i = 1 ; i<35 ; i += 5)
{
int b;
rect.setPosition (new Point(rect.getPosition ().x+i,rect.getPosition ().y+i));
jc.repaint ();
}
}
/**
* @param args the command line arguments
*/
public static void main (String[] args) {
// TODO code application logic here
Main main = new Main();
}//main
public void keyTyped(KeyEvent e) {
System.out.print ("Event clavier trouvé");
System.out.print (e.getKeyChar ());
}
public void keyPressed(KeyEvent e) {
System.out.print ("KEY PRESSED: ");
System.out.print (e.getKeyChar ());
}
/** Handle the key released event from the text field. */
public void keyReleased(KeyEvent e) {
System.out.print ("KEY RELEASED: ");
System.out.print (e.getKeyChar ());
}
}
Qui ne marche pas :(
« Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker
[^] # Re: modifie completement ton code
Posté par Joris Dedieu (site web personnel) . Évalué à 1.
Souvent on préfere utiliser les nAdapter aux nListener (KeyAdapter, MouseAdapter...) parcequ'il sont une implémentation des premiers (class KeyAdapter implements KeyListener) et qu'ils ne nécessitent donc pas de réecrire l'ensemble des methodes mais juste celles dont on a besoin.
Une fois que tu auras piger le principe, c'est valable pour tout les évenements.
Autre chose pour enfoncer le clou. Java est un language Objet. D'une maniere generale (on deviens plus subtil par la suite) l'attirbut static ne dois être utilisé que pour le main. Cela veux dire que tout le reste doit être objet (C'est évidament faux, mais ça aide à piger)
Ne pas écrire : Mais plustôt:Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.