2011-06-18 4 views
0

Je veux pouvoir enregistrer un événement enfoncé par une touche qui déclenche une variable booléenne. Je l'ai fait dans ma classe principale, mais maintenant j'essaie de le mettre dans les classes, et ça ne semble pas fonctionner.Les événements Key Listener ne se déclenchent pas?

Voici la classe de héros:

public class Hero extends Main { 
private boolean downPressed; 
private boolean leftPressed; 
private boolean rightPressed; 

public void init() { 
} 

public void paint(Graphics g, int x_pos, int y_pos) { 

    if (isDownPressed() && isLeftPressed()) { 
     this.sprite = hero225; 
    } else if (isDownPressed() && isRightPressed()) { 
     this.sprite = hero135; 
    } else if (isUpPressed() && isRightPressed()) { 
     this.sprite = hero45; 
    } else if (isUpPressed() && isLeftPressed()) { 
     this.sprite = hero315; 
    } else if (isLeftPressed() == true) { 
     this.sprite = hero270; 
    } else if (isRightPressed() == true) { 
     this.sprite = hero90; 
    } else if (isUpPressed() == true) { 
     this.sprite = hero; 
     System.out.println("Succsess"); 
    } else if (isDownPressed() == true) { 
     this.sprite = hero180; 
    } 

    // this.sprite will contain value set on last "movement" 
    g.drawImage(this.sprite, x_pos, y_pos, this); 
} 

public void keyPressed(KeyEvent e) { 
    if (e.getKeyCode() == KeyEvent.VK_LEFT) { 
     setLeftPressed(true); 
     System.out.println("keyPressed"); 
    } 
    if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 
     setRightPressed(true); 

    } 
    if (e.getKeyCode() == KeyEvent.VK_UP) { 
     setUpPressed(true); 
    } 
    if (e.getKeyCode() == KeyEvent.VK_DOWN) { 
     setDownPressed(true); 
    } 

} 

public void keyReleased(KeyEvent e) { 

    if (e.getKeyCode() == KeyEvent.VK_LEFT) { 
     setLeftPressed(false); 
    } 
    if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 

     setRightPressed(false); 
    } 
    if (e.getKeyCode() == KeyEvent.VK_UP) { 
     setUpPressed(false); 

    } 
    if (e.getKeyCode() == KeyEvent.VK_DOWN) { 
     setDownPressed(false); 
    } 
} 

public void keyTyped(KeyEvent e) { 

} 

public void mouseClicked(MouseEvent e) { 
    System.out.println("HIT!"); 

} 

public void mouseEntered(MouseEvent e) { 
    // TODO Auto-generated method stub 

} 

public void mouseExited(MouseEvent e) { 
    // TODO Auto-generated method stub 

} 

public void mousePressed(MouseEvent e) { 
    boolean isButtonPressed = true; 

} 

public void mouseReleased(MouseEvent e) { 
    boolean isButtonPressed = false; 

} 


public void setDownPressed(boolean downPressed) { 
    this.downPressed = downPressed; 
} 

public boolean isDownPressed() { 
    return downPressed; 
} 

public void setLeftPressed(boolean leftPressed) { 
    this.leftPressed = leftPressed; 
} 

public boolean isLeftPressed() { 
    return leftPressed; 
} 

public void setRightPressed(boolean rightPressed) { 
    this.rightPressed = rightPressed; 
} 

public boolean isRightPressed() { 
    return rightPressed; 
} 

public void setUpPressed(boolean upPressed) { 
    this.upPressed = upPressed; 
} 

public boolean isUpPressed() { 
    return upPressed; 
} 

Et est ici la classe de niveau qu'il appelle:

public class Level extends Main { 
Hero hero = new Hero(); 

public void paint(KeyEvent e, Graphics g, double x_pos, double x_pos2) { 
    repaint(); 
} 

Et est ici la fonction de la peinture dans la classe principale qui appelle que:

public void paint(Graphics g) { 
    Level level = new Level(); 
    level.paint(e, g, x_pos, y_pos); 

Le problème à l'origine de ce problème ne semble pas évident.

Répondre

2

Vous devez implémenter l'interface java.awt.event.KeyListener dans la classe (s) que vous souhaitez écouter les événements, dans ce héros de cas, donc:

public class Hero extends Main implements java.awt.event.KeyListener 

puis inscrivez-vous pour les événements dans une méthode, peut-être INITou quelque part d'autre en utilisant:

addKeyListener(this); 
//rest of your code 

Ou si vous voulez écouter seulement quelques événements, vous pouvez au lieu de mettre en œuvre le KeyListener d'interface, inscrivez-vous un adaptateur:

addKeyListener(new java.awt.KeyAdapter() 
{ 
    public void keyPressed(java.awt.KeyEvent e) 
    { 
     //handle just this event 
    } 
} 
); 
//rest of of your code 
+0

Je reçois cette erreur lorsque je suis la deuxième étape: La méthode addEventListener (Hero) n'est pas définie pour le type Hero – Derek

+0

J'ai édité ma réponse, donc vous pouvez la tester –

+0

J'ai réussi à la faire fonctionner dans la classe Hero (Woop!) Mais cela ne fonctionne pas dans la classe Level. Ce que j'ai fait était mettre un System.out.println ("keyPressed"); dans le if (isDownPressed() && isLeftPressed()) {. Mais quand je charge le niveau et appuyez sur gauche rien ne se passe dans la console :( – Derek

1

Cela ressemble à un problème de mise au point: Seul le composant actif aura KeyEvents.

Il existe plusieurs façons de résoudre ce problème, mais j'ai trouvé this tutoriel couvre assez bien les idées. Mais si vous voulez un rapide et sale (sale? Pas sûr, facile et simple n'est pas mauvais je pense, juste un peu gonflé pour les grands projets) solution que vous pourriez simplement implémenter un écouteur pour chaque composant et transmettre les événements à une classe générale qui le gère.

+0

+1 "Pour déclencher des événements clavier, un composant doit avoir le focus du clavier. "- [How to Write a Key Listener] (http://download.oracle.com/javase/tutorial/uiswing/events/keylistener.html) – trashgod

Questions connexes