Итак, у меня есть 2 класса под названием Viewer и PaintWindow. В моем случае класс Viewer действует как контроллер, в то время как я использую класс PaintWindow для рисования вещей на JPanel.Как получить Keyevent из другого класса?
Теперь я пытаюсь собрать небольшую игру, но я не понимаю, как реализовать KeyListener, чтобы иметь возможность контролировать игру. Я хочу, чтобы слушатель перечислил ключевой случай, чтобы я мог решить, что произойдет. Это как мой код выглядит следующим образом:
Viewer:
public void run() {
System.out.println("Viewer Run");
cloud1 = new ImageIcon("src/images/cloud.png");
cloud2 = new ImageIcon("src/images/cloud.png");
background1 = new ImageIcon("src/images/background.png");
playerStill = new ImageIcon("src/images/still.png");
playerRight = new ImageIcon("src/images/right.png");
playerLeft = new ImageIcon("src/images/left.png");
paintWindow = new PaintWindow(background1);
paintWindow.showImage(playerStill, 30, 370);
paintWindow.addKeyListener(new KeyTimerListener());
paintWindow.startAlarm();
}
/*
* Lyssnar på vad som händer när man trycker en viss knapp
*/
private class KeyTimerListener implements KeyListener {
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if(keyCode == 37){
System.out.print("Left");
}
else if (keyCode == 39){
System.out.print("Right");
}
else if (keyCode == 32){
System.out.print("JUMP");
}
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}
}
}
Это часть моего класса PaintWindow:
public void addKeyListener(KeyListener listener){
this.listener.add(listener);
}
private class AT extends Thread {
KeyEvent keyevent;
public void run() {
try {
Thread.sleep(1);
}catch(InterruptedException e) {
}
for(KeyListener al : listener) {
al.keyPressed(keyevent);//<-----------------------------
}
thread = null;
}
}
public void startAlarm() {
if(thread==null) {
thread = new AT();
thread.start();
}
}
я получаю исключение NullPointer как мой KeyEvent нулевой. Конечно, я мог бы определить его как конкретный ключ, но мне это действительно не помогает.
Что я пропустил?
Какой _Component_ является PaintWindow? – Berger
@Berger Что вы имеете в виду? PaintWindow - это просто класс, который создает фрейм и JPanel и рисует на нем с помощью объектов Graphics. – Baxtex
Пользовательский объект не получает никаких ключевых событий, _java.awt.Component_ делает, или вы можете зарегистрировать глобальный слушатель, см .: http://stackoverflow.com/questions/5344823/how-can-i-listen-for- key-presses-in-java-swing-through-all-components – Berger