这个是我挖出KEYPRESSED事件的代码,这个能显示我的键盘事件确实可用啊/*
 * 创建日期 2004-12-22
 *
 * TODO 要更改此生成的文件的模板,请转至
 * 窗口 - 首选项 - Java - 代码样式 - 代码模板
 */
import javax.swing.*;
import java.awt.event.*;
/**
 * @author canuo
 *
 * TODO 要更改此生成的类型注释的模板,请转至
 * 窗口 - 首选项 - Java - 代码样式 - 代码模板
 */
public class snaketest {
int key = 38;
public snaketest(){
JFrame frame = new JFrame();
frame.addKeyListener(new keylisten(key));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200,200);
frame.show();


} public static void main(String[] args) {
new snaketest();
}
}
class keylisten extends KeyAdapter{
int keys;
public keylisten(int i){
keys = i;
}
public void keyPressed(KeyEvent ke){
int keycode = ke.getKeyCode();
switch(keycode){
case 38: if (keys != 40) keys = 38;break;
case 40: if (keys != 38) keys = 40;break;
case 37: if (keys != 39) keys = 37;break;
case 39:  if (keys!=37) keys = 39;break;
}
System.out.println(keys);
}
}

解决方案 »

  1.   

    原因就是当FRAME上没有控件的时候,FRAME有焦点,他是可以接受键盘事件的
    当FRAME上有控件的时候,接收键盘事件的是有焦点的控件,而不是FRAME了!!
      

  2.   

    给第个按钮都加上键盘事件,这样就好了,如下:/*
     * Created on 2004-12-22
     *
     * To change the template for this generated file go to
     * Window>Preferences>Java>Code Generation>Code and Comments
     */
    package test;/**
     * @author Administrator
     *
     * To change the template for this generated type comment go to
     * Window>Preferences>Java>Code Generation>Code and Comments
     */
    import java.awt.*;
    import java.awt.event.*;import javax.swing.*;public class snake implements ActionListener
    { JFrame frame;
    javax.swing.Timer timer;
    int num = 4;
    JButton[] btn = new JButton[80];
    int key = 39; //38~40表示左上右下键值~
    public snake()
    {
    frame = new JFrame();
    Container con = frame.getContentPane();
    con.setLayout(null);
    frame.addKeyListener(new keylisten(key));
    timer = new javax.swing.Timer(500, this);
    for (int i = 1; i < num; i++)
    {
    btn[i] = new JButton();
    btn[i].setBounds(100, 250 + i * 20, 20, 20);
    con.add(btn[i]);
    }
    btn[0] = new JButton();
    btn[0].setSize(20, 20);
    addbutton(con);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(405, 350);
    frame.setResizable(false);
    frame.setVisible(true);
    timer.start();
    timer.setRepeats(true); } void addbutton(Container c)
    {
    num = num + 1;
    int x = ((int) (Math.random() * 20)) * 20;
    int y = ((int) (Math.random() * 15)) * 20 + 50;
    for (int i = 1; i < num - 1; i++)
    {
    if (btn[i].getX() == x & btn[i].getY() == y)
    {
    num = num - 1;
    addbutton(c);
    }
    else
    {
    btn[num - 1] = new JButton();
    btn[num - 1].setBounds(x, y, 20, 20);
    }
    }
    btn[num - 1].addKeyListener(new keylisten(key));
    c.add(btn[num - 1]);
    } public static void main(String args[])
    {
    new snake(); } public void actionPerformed(ActionEvent ae)
    {
    if (ae.getSource() == timer)
    {
    switch (key)
    {
    case 38 :
    move(1);
    break;
    case 40 :
    move(2);
    break;
    case 37 :
    move(3);
    break;
    case 39 :
    move(4);
    break;
    }
    }
    } public void move(int d)
    {
    switch (d)
    {
    case 1 :
    btn[0].setLocation(btn[1].getX(), btn[1].getY() - 20);
    for (int i = num - 2; i > 0; i--)
    {
    btn[i].setLocation(btn[i - 1].getX(), btn[i - 1].getY());
    }
    break; case 2 :
    btn[0].setLocation(btn[1].getX(), btn[1].getY() + 20);
    for (int i = num - 2; i > 0; i--)
    {
    btn[i].setLocation(btn[i - 1].getX(), btn[i - 1].getY());
    }
    break; case 3 :
    btn[0].setLocation(btn[1].getX() - 20, btn[1].getY());
    for (int i = num - 2; i > 0; i--)
    {
    btn[i].setLocation(btn[i - 1].getX(), btn[i - 1].getY());
    }
    break; case 4 :
    btn[0].setLocation(btn[1].getX() + 20, btn[1].getY());
    for (int i = num - 2; i > 0; i--)
    {
    btn[i].setLocation(btn[i - 1].getX(), btn[i - 1].getY());
    }
    break;
    }
    }}class keylisten extends KeyAdapter
    {
    int keys;
    public keylisten(int i)
    {
    keys = i;
    }
    public void keyPressed(KeyEvent ke)
    {
    int keycode = ke.getKeyCode();
    switch (keycode)
    {
    case 38 :
    if (keys != 40)
    keys = 38;
    break;
    case 40 :
    if (keys != 38)
    keys = 40;
    break;
    case 37 :
    if (keys != 39)
    keys = 37;
    break;
    case 39 :
    if (keys != 37)
    keys = 39;
    break;
    }
    System.out.println(keys); }
    }
      

  3.   

    谢谢了!让我了解了更多,不过我的程序就算接收了键盘事件,那它为什么不按我的键盘对应的方向键而上下左右移动啊,还望救人救到底,help me one more time