KeyListener isn't working?
-
17-06-2021 - |
سؤال
Ok, so I have this key listener for my game and it isn't working but when I made a new project just to test does it work at all for me it did? So here's some code of my game:
public class GameKeyListener implements KeyListener {
private void pressMainWeapon() {
Constants.MAIN_WEAPON_PRESSED = Constants.MAIN_WEAPON_PRESSED ? true : false;
}
private void pressSecondaryWeapon() {
Constants.SECONDARY_WEAPON_PRESSED = Constants.SECONDARY_WEAPON_PRESSED ? true : false;
}
private void pressSkillsButton() {
Constants.SKILLS_BUTTON_PRESSED = Constants.SKILLS_BUTTON_PRESSED ? true : false;
}
private void gameKeyPressed(int keyCode) {
switch (keyCode) {
case KeyEvent.VK_Q:
pressMainWeapon();
break;
case KeyEvent.VK_E:
pressSecondaryWeapon();
break;
case KeyEvent.VK_TAB:
pressSkillsButton();
break;
case KeyEvent.VK_W:
Constants.CHARACTER_Y -= 5;
break;
case KeyEvent.VK_A:
Constants.CHARACTER_X -= 5;
break;
case KeyEvent.VK_S:
Constants.CHARACTER_Y += 5;
break;
case KeyEvent.VK_D:
Constants.CHARACTER_X += 5;
break;
}
}
private void gameKeyReleased(int keyCode) {
}
private void gameKeyTyped(char keyChar) {
}
@Override
public void keyPressed(KeyEvent e) {
gameKeyPressed(e.getKeyCode());
System.out.println(e.getKeyChar());
}
@Override
public void keyReleased(KeyEvent e) {
gameKeyReleased(e.getKeyCode());
}
@Override
public void keyTyped(KeyEvent e) {
gameKeyTyped(e.getKeyChar());
}
and
public class GraphicsMain {
static JFrame f = new JFrame("Gurillia");
private static GameCanvas gc = new GameCanvas();
public static void startGraphics() throws IOException {
f.setVisible(true);
f.setIgnoreRepaint(true);
f.setContentPane(gc);
gc.setPreferredSize(new Dimension(Constants.GAME_WIDTH, Constants.GAME_HEIGHT));
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setResizable(false);
f.addKeyListener(new GameKeyListener());
}
but this did work:
public class testkeylistener implements KeyListener {
@Override
public void keyPressed(KeyEvent arg0) {
System.out.println(arg0.getKeyChar());
}
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
public static void main(String args[]) {
JFrame f = new JFrame("test");
f.setSize(1000,1000);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
f.pack();
f.addKeyListener(new testkeylistener());
}
So what is the problem?
المحلول
The problem is you work with KeyListener
s while Swing was designed to use KeyBindings. The difference might be due to different focus behavior.
See for example this question where a KeyListener
only occasionally worked
نصائح أخرى
Try adding the listener to the child (canvas), not the JFrame itself. The key is fired on the element which has currently focus.
JFrames almost never have focus.
The KeyListener should be added to the canvas, and to setFocusable because required Focus
لا تنتمي إلى StackOverflow