为什么我的KeyListener不工作?

时间:2013-07-27 02:41:35

标签: java swing keylistener

这是我的代码。

基本上,我创建了一个操纵动画的player对象;但GameController通过公共静态方法发送Player命令。

但是,由于我的keyPressedkeyReleasedkeyTyped无效,因此我遇到了问题。

我输入了打印语句来检查KeyEvent是否会显示任何内容但是没有显示。我还用mouseListener检查了我的代码。因此,我不确定我做错了什么。

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

public class GameController extends WindowController implements KeyListener, MouseListener {

   Player player;

   public GameController() {

      super();

   }

   public void begin() {

      Image sprite0 = getImage("1.png"); 
      canvas.addKeyListener(this);
      canvas.addMouseListener(this);
      player = new Player (250, 0, sprite0 ,canvas);

   }

   public void keyPressed(KeyEvent e) {

      System.out.println(e.getKeyChar());

   }

   public void keyReleased(KeyEvent e) {

      System.out.println(e.getKeyChar());

   }

   public void keyTyped(KeyEvent e) {

   }

   public void mouseEntered( MouseEvent e ) { }
   public void mouseExited( MouseEvent e ) { }
   public void mousePressed( MouseEvent e ) {

      if (Player.canJump && !Player.falling) {

         Player.canJump = false;
         Player.falling = false;
         Player.jumping = true;

      }

   }

   public void mouseReleased( MouseEvent e ) { }
   public void mouseClicked( MouseEvent e ) {
   }   

}

2 个答案:

答案 0 :(得分:2)

最可能的问题是您注册密钥监听器的组件要么无法关注,要么没有焦点。

只有当注册的组件实际上具有键盘焦点(并且可以获得键盘焦点)时,才能通知键侦听器。

相反,请使用key bindings API

答案 1 :(得分:2)

您的组件似乎无法集中精力。使用KeyListener必须具有重点,必须成为焦点。

相反,您可以使用KeyBindings绑定特定操作的密钥。

简单示例:

AbstractAction escapeAction = new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent e) {
         //code here example
         ((JComponent)e.getSource()).setVisible(Boolean.FALSE);
    }};
 String key = "ESCAPE";
 KeyStroke keyStroke = KeyStroke.getKeyStroke(key);
 component.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(keyStroke, key);
 component.getActionMap().put(key, escapeAction);

您可以使用这些JComponent常量

WHEN_ANCESTOR_OF_FOCUSED_COMPONENT 
WHEN_FOCUSED 
WHEN_IN_FOCUSED_WINDOW

另外检查Single Responsability Principle似乎你的gameController太多了,MouseListener KeyListener还有WindowController。而不是考虑如果不是更好,你的班级中有私人班级,例如

public class GameController extends WindowController{

  private class MyMouselistener implements MouseListener{
          //code here
  }

}