-3

这是我的代码。

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

但是,由于我keyPressedkeyReleased, 和keyTyped不工作,我在这部分遇到了麻烦。

我输入了打印语句以检查是否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 ) {
   }   

}
4

2 回答 2

2

最可能的问题是您注册关键侦听器的组件不可聚焦或没有焦点。

只有当它注册的组件实际上具有键盘焦点(并且可以接收键盘焦点)时,才能通知键监听器事件。

相反,使用键绑定API

于 2013-07-27T03:15:17.227 回答
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 东西太多了,是 aMouseListener KeyListener也是WindowController. 而不是考虑如果不是更好,例如在您的班级中有一个私人班级

public class GameController extends WindowController{

  private class MyMouselistener implements MouseListener{
          //code here
  }

}
于 2013-07-27T03:54:10.400 回答