2015-05-03 2 views
2

Вот что внутри моей keyPressed:KeyListener - мне нужно вызвать метод KeyPressed в моей основной?

public class Movie extends JFrame implements KeyListener { 

public static Sprite star1 = new Sprite("Assets/star1.png"); 
public static Sprite star2 = new Sprite("Assets/star2.png"); 
public static Sprite star3 = new Sprite("Assets/star3.png"); 

public void init(){ 
    this.addKeyListener(this); 
} 
@Override 
public void keyReleased(KeyEvent e) { 
    // TODO Auto-generated method stub 

} 
@Override 
public void keyTyped(KeyEvent e) { 
    // TODO Auto-generated method stub 

} 
public void keyPressed(KeyEvent e) { 

    System.out.println("KEY PRESSED: " + e.getKeyChar()); 
    animation window = new animation(500, 450); //length , height 

    if (e.getKeyCode() == KeyEvent.VK_DOWN) 
    { 
     setFocusable(true); 
     Movie.star1.setPosition(Movie.star1.getXposition() -100, 0); 
     window.frameFinished(); 
    } 
    else if (e.getKeyCode() == KeyEvent.VK_UP) 
    { 
     setFocusable(true); 
     Movie.star1.setPosition(Movie.star1.getXposition() +100, 0); 
     window.repaint(); 
    } 

} 

Мой объект не перемещается при нажатии клавиш со стрелками нажимаются.

Все, что я хочу знать - это потому, что мне нужно называть метод keyPressed(KeyEvent e) в моей основе? Когда я называю это, я получаю сообщение об ошибке, которое утверждает:

не может быть решена в переменной

Объекты, которые я хочу, чтобы переместить находятся в гигантском цикле.

+0

К чему вы добавили слушателя? – immibis

+0

Вы реализовали KeyListener? – svarog

+0

Непосредственно, но вы можете вместо этого использовать Key Bindings. Прочитайте [эту тему] (http://stackoverflow.com/questions/15290035/key-bindings-vs-key-listeners-in-java) для сравнения между ними и KeyListeners. – PakkuDon

ответ

3

Если вы никогда не добавляете прослушиватель клавиш к некоторому компоненту Swing, он никогда не получит события.

KeyListener сам по себе не волшебный и не слушает нажатия клавиш. Что вы делаете с KeyListener: вы указываете другой компонент Swing (например, окно или текстовое поле) для вызова вашего KeyListener при нажатии клавиши. Компонент - это то, что ищет нажатия клавиш, а не слушателя.

В вашем случае, это выглядит, как вы имели в виду, чтобы добавить ключ слушателя к окну, с this.addKeyListener(this); (так как в вашем случае this является одновременно KeyListener и JFrame).

Однако, если ничего не вызывает ваш init метод, то код внутри вашего метода init (как и любой метод) никогда не работает, так что ключ слушатель не добавляется к окну, так что окно не называет его, когда нажата клавиша!

Одним из возможных решений было бы позвонить по телефону init после создания нового Movie (вы не указали код, где это происходит).

Другим решением было бы использовать конструктор, вместо метода, например:

public Movie() { 
    this.addKeyListener(this); 
} 

- Конструкторы запускаются при создании объекта, так что путь, addKeyListener будет вызываться всякий раз, когда Movie объекта созданный без того, чтобы создатель не забыл позвонить init.

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