KeyPressed事件没有发生?

时间:2012-12-08 21:50:36

标签: java swing keylistener keyevent

此代码构建正确,一切似乎都有效,但密钥无效。我认为它是动作监听器或椭圆形不更新。我正在尝试通过初学者java游戏编程。我相信这很容易,但我没有抓住它。如果这有所不同,我在sublime text 2中使用mac。

package javagame;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class JavaGame extends JFrame {

int x, y;

public class AL extends KeyAdapter {

    public void keyPressed(KeyEvent e) {
        int keycode = e.getKeyCode();
        if(keycode == e.VK_LEFT); {
            x-= 3;
        }
        if(keycode == e.VK_RIGHT); {
            x+= 3;
        }
        if(keycode == e.VK_UP); {
            y-= 3;
        }
        if(keycode == e.VK_DOWN); {
            y+= 3;
        }
    }


    public void keyReleased(KeyEvent e) {

    }
}

public JavaGame() {
    addKeyListener(new AL());
    setTitle("Jave Game");
    setSize(700, 700);
    setResizable(false);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    x = 350;
    y = 350;
}

public void paint(Graphics g) {
    g.fillOval(x, y, 15, 15);

    repaint();
}

public static void main(String[] args) {
    new JavaGame();
}

}

2 个答案:

答案 0 :(得分:6)

您需要从if语句中删除分号:

if (keycode == e.VK_LEFT)
{
   x-= 3;
}

目前,随着分号终止这些陈述,跟随if语句的代码块将被释放。


一些Swing - 具体说明:

  • 最好使用来自子paintComponent的{​​{1}}来获得更好的颜色 性能
  • 使用Key bindings而不是JComponent来改善关键事件管理。这是example

答案 1 :(得分:2)

即使有建议的更正,您仍然可能会遇到问题。

首先,JFrame实际上包含了许多组件,即根窗格,其中包含内容和分层窗格以及玻璃窗格(通常是不可见的)。如果这些组件中的任何一个因任何原因获得了键盘焦点,那么关键监听器可能会被忽略。

更好的解决方案是使用key bindings API,它可以更好地控制焦点问题。

你也违反了油漆合同。在大多数情况下,您需要调用super.paint,事实上,不鼓励您覆盖顶级容器的绘制方法,而是从JPanel扩展并覆盖其paintComponent。而不是1}}方法。

这些绘画方法执行非常重要的工作,你不应该轻易忽略/跳过它们。请查看Painting in AWT and SwingCustom Painting in Swing了解详情