Вы можете использовать AWTEventListeners. Они ловят любое Событие, независимо от того, какой Компонент в конечном итоге его получит (нет необходимости прослушивать какие-либо Компоненты, я протестировал его с одним JLabel
в JFrame
). Если абсолютно необходимо использовать KeyListener
, вам нужно выполнить ручное преобразование. Пример такого преобразования для MouseListener
(должно быть аналогично KeyListener
):
if(event.getID() == MouseEvent.MOUSE_PRESSED) {
listener.mousePressed(mouseEvent);
}
Примечание: я тоже создал Swing Games, и пока он работает, вы столкнетесь с проблемами с производительностью, если попытаетесь рендерить множество вещей, а повышение эффективности рендеринга изображений может стать очень сложным. Так что если у вас есть, например, Tiled Map, которая создает десятки квадратных изображений только для местности, а затем добавляет несколько npcs и множество пуль, ваша игра, скорее всего, будет неиграемой. Вот небольшой пример, который печатает коды клавиш при нажатии клавиши / мыши и координаты мыши при ее перемещении. Также выходит из приложения, если нажата ESCAPE
:
Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
@Override
public void eventDispatched(AWTEvent event) {
if(event instanceof KeyEvent){
KeyEvent keyEvent = (KeyEvent) event;
if(keyEvent.getID() == KeyEvent.KEY_PRESSED){
System.out.println("Key pressed: " + keyEvent.getKeyCode());
if(keyEvent.getKeyCode() == KeyEvent.VK_ESCAPE){
System.exit(0);
}
}
}else if(event instanceof MouseEvent){
MouseEvent mouseEvent = (MouseEvent) event;
if(mouseEvent.getID() == MouseEvent.MOUSE_PRESSED){
System.out.println("Mouse pressed: " + mouseEvent.getButton());
}else if(mouseEvent.getID() == MouseEvent.MOUSE_MOVED){
System.out.println("Mouse moved to " + mouseEvent.getXOnScreen() + "/" + mouseEvent.getYOnScreen());
}
}
}
}, AWTEvent.KEY_EVENT_MASK + AWTEvent.MOUSE_EVENT_MASK + AWTEvent.MOUSE_MOTION_EVENT_MASK);