2013-07-27 4 views
-3

Это мой код.Почему мой KeyListener не работает?

По существу, я создаю объект player, который управляет анимацией; однако GameController отправляет команды Player через общедоступные статические методы.

Однако, у меня возникли проблемы с этой частью с keyPressed, keyReleased и 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) { 
    } 

} 
+0

Является ли 'begin()' вызовом? –

+0

В вашем вопросе есть много вещей, которые помогут вам получить лучшую помощь и скоро ответьте: 1) Где кадр 2) 'canvas' - это рамка или панель? 3) Что такое 'WindowController'? – Azad

+0

Да начинается начало. Изображение правильно отображается, поэтому я предполагаю, что он вызван. WindowController используется с objectdraw. В принципе, он создает для меня «DrawingCanvas», и я запускаю appletviewer, например, appletviewer controler.html –

ответ

2

Скорее всего проблема в том, что компонент вы регистрируете свой ключ слушателя либо не фокусируемый или не имеет фокус.

Ключевой прослушиватель может быть уведомлен только о событиях, если компонент, на котором он находится, фактически имеет фокус клавиатуры (и может получать фокус клавиатуры).

Вместо этого используйте key bindings API

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 слишком много вещей, является MouseListenerKeyListener и также WindowController. Вместо того, чтобы думать о том, если не лучше, есть частный класс внутри вашего класса, например

public class GameController extends WindowController{ 

    private class MyMouselistener implements MouseListener{ 
      //code here 
    } 

} 
+0

Спасибо! Я понял это: –

+0

Принимая ответ как правильный и выставляющий всех, кто вам помогает – nachokk

Смежные вопросы