//这个是我做的一个贪吃蛇  但是在处理键盘事件的时候却遇到了很大的麻烦 
先做的时候我让TestSneak 直接继承了JFRame   但是键盘跟本就不起作用 然后 
有改成现在这样  但是扩展性感觉特别差 谁有一个类似于键盘事件模型之类的
请指导一下 谢谢import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
public class TestSneak extends JPanel implements KeyListener,Runnable{
  
  final int width=30;
  final int height=20;
  int x=0,y=0;
  int a[][]=new int[21][31];
  int direction=4;
  final int up=1;
  final int down=3;
  final int left=2;
  final int right=4;
  final int length=8;//初始化长度
  final int initx=8;
  final int inity=5;
  Node node;
  Thread thread;
  Food food=new Food();
  LinkedList linklist;
  SpecialThread st;
  int count;
  JLabel label;
  boolean pause=true;
  public TestSneak(){
   this.setBackground(Color.black);
  //this.setSize(400,320);
  this.addKeyListener(this);
    this.setLayout(new BorderLayout());
    this.setOpaque(true);
 
  }
  
  public void init()
  {
    arrayIni();
    direction=4;
    count=0;
    linklist=new LinkedList();
    
    for(int i=10;i>=inity;i--)
    {
     node=new Node(initx,i);
     a[initx][i]=1;
     linklist.add(node);
    
    }
    for(int j=0;j<=30;j++){
     a[0][j]=3;
     a[20][j]=3;
    }
    for(int i=0;i<=20;i++){
     a[i][0]=3;
     a[i][30]=3;
    }
    
 
    
    this.creatFood();
  }
  public void arrayIni()
  {
   for(int i=0;i<20;i++)
   {
   for(int j=0;j<30;j++)
   {
   a[i][j]=0;
   }
   }
  }
  public void creatFood()
  {
   do
    food.creatFood();
    while(a[food.randomx][food.randomy]==1||a[food.randomx][food.randomy]==3);
    a[food.randomx][food.randomy]=2;
    count++;
    ///label.setText(String.valueOf(count));
  }
  
 
  
  
  public void changeDirection(int i)
  {
   if((i%2)!=(direction%2))
   {
   direction=i;
   }
  }
  
  public boolean go()
  {
   Node node1=(Node)linklist.getFirst();
    
    x=node1.x;
    y=node1.y;
  
   switch(direction)
   {
  
   case up:
           //x=node1.x;
           x--;break;
   case down:
           //x=node1.x;
           x++;break;
       case right:
               //y=node1.y;
               y++;break;
       case left:
               //y=node1.y;
               y--;break;
               
   }
  
   if((x>=20)||(y>=30)||(x<0)||(y<0)||(a[x][y]==1)||(a[x][y]==3))
   {
       
      //System.out.println(x+"         "+y);
      JOptionPane.showMessageDialog(null,"a 啊 不行了 ");
      init();
   return false;
   }
  
   else
   {
  
   if(a[x][y]==2)
   {
   linklist.addFirst(new Node(x,y));
   a[x][y]=1;
   creatFood();
  
  
   }
  
     else if(a[x][y]==0)
   {
   // System.out.println("asdf");
   linklist.addFirst(new Node(x,y));
   a[x][y]=1;
   Node node=(Node)linklist.removeLast();
   a[node.x][node.y]=0;
   //System.out.println(node.x+"ok"+node.y+"  "+a[node.x][node.y]);
  
   }
  
  
   repaint();
   return true;
   }
  
  }
  
   public void  keyPressed(KeyEvent e)
{
       //System.out.println("change");
   if(e.getKeyCode()==KeyEvent.VK_UP)
   {
  
   changeDirection(up);
   }
   if(e.getKeyCode()==KeyEvent.VK_DOWN)
   {
   changeDirection(down);
   }
   if(e.getKeyCode()==KeyEvent.VK_LEFT)
   {
   changeDirection(left);
   }
   if(e.getKeyCode()==KeyEvent.VK_RIGHT)
   {
   changeDirection(right);
   }
   }
   public void keyReleased(KeyEvent e){}
   public void keyTyped(KeyEvent e){}
   public void run()
   {
   init();
  
   while(true)
   {
   try
   {
   if(pause)
   {
  
   Thread.sleep(100);
        go();
       
         //System.out.println("is go");
    }
  
   }catch(Exception e){System.out.println(e.getMessage());}
  
   }
  
  
   }
  
   public void creatSpecial()
   {
  
  
   }
  
   public void paint(Graphics g)
   {
   // g.setColor(Color.white);
   // g.fillRect(0,0,150,100);
  // System.out.println(direction);
        super.paint(g);
        g.setColor(Color.BLUE);
        g.drawRect(0,0,300,200);
   for(int i=0;i<=20;i++)
   {
   for(int j=0;j<=30;j++)
   {
   if(a[i][j]==1)
   {
   g.setColor(Color.red);
   g.fillRect(10*j,10*i,9,9);
   }
   if(a[i][j]==2)
   {
   g.setColor(Color.yellow);
   g.fillOval(10*j,10*i,10,10);
   }
  
       if(a[i][j]==3)
   {
   g.setColor(Color.magenta);
   g.fillRect(10*j,10*i,9,9);
   }
  
    if(a[i][j]==4)
   {
   g.setColor(Color.green);
   g.fillRect(10*j,10*i,9,9);
   }
   }
   }
   }
  
  public static void main(String[] arg){
  
   TestSneak sm=new TestSneak();
   JFrame frame=new JFrame();
   frame.add(sm,"Center");
   frame.setUndecorated(true);
  
       frame.setBounds(300,300,310,210);
   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   frame.setVisible(true);
        sm.setFocusable(true);
   try
   {
   Thread thread =new Thread(sm);
       thread.start();
   }catch(Exception e){}
  
  
  
   }
  
  
  
   
}

解决方案 »

  1.   


    import java.awt.event.*;
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.KeyEvent;public class TestJPanel implements java.awt.event.ActionListener{
    private JPanel panel;
    private Point last;
    private java.util.Vector lines;
    private static final int SMALL_INCREMENT=4;
    private static final int LARGE_INCREMENT=8;
    int d=SMALL_INCREMENT;
    public TestJPanel() {
    last=new Point(100,100);
    lines=new java.util.Vector();
    JFrame frame=new JFrame();
    panel=new JPanel(){
    public void paintComponent(Graphics g){
    super.paintComponentPresent;
    Point pointStart,pointEnd;
    g.setColor(java.awt.Color.red);
    for(int i=0;i<lines.size()-1;i++){
    pointStart=(Point)lines.elementAtLight Bulb;
    pointEnd=(Point)lines.elementAt(i+1);
    g.drawLine(pointStart.x,pointStart.y,pointEnd.x,pointEnd.y);
    }
    }
    };
    panel.setLayout(null);
    javax.swing.JButton button=new javax.swing.JButton();
    button.setBounds(10,10,100,30);
    panel.add(button);//添加按钮
    frame.getContentPane().add(panel,java.awt.BorderLayout.CENTER);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);KeyStroke shiftup = KeyStroke.getKeyStroke(KeyEvent.VK_UP,java.awt.event.InputEvent.SHIFT_DOWN_MASK);
    panel.registerKeyboardAction(this,"shiftup",shiftup,JComponent.WHEN_FOCUSED);
    KeyStroke shiftdown = KeyStroke.getKeyStroke(KeyEvent.VK_DOWN,java.awt.event.InputEvent.SHIFT_MASK);
    panel.registerKeyboardAction(this,"shiftdown",shiftdown,JComponent.WHEN_FOCUSED);KeyStroke up = KeyStroke.getKeyStroke(KeyEvent.VK_UP,0);
    panel.registerKeyboardAction(this,"up",up,JComponent.WHEN_FOCUSED);
    KeyStroke down = KeyStroke.getKeyStroke(KeyEvent.VK_DOWN,0);
    panel.registerKeyboardAction(this,"down",down,JComponent.WHEN_FOCUSED);
    KeyStroke left = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT,0);
    panel.registerKeyboardAction(this,"left",left,JComponent.WHEN_FOCUSED);
    KeyStroke right = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT,0);
    panel.registerKeyboardAction(this,"right",right,JComponent.WHEN_FOCUSED);
    frame.setBounds(30,30,300,300);
    frame.setVisible(true);
    }
    public void add(int dx, int dy) {
    Point end=new Point(last.x+dx,last.y+dy);
    lines.add(end);
    panel.repaint();
    last=end;
    }
    public static void main (String args[]) {
    new TestJPanel();
    }
    public void actionPerformed(java.awt.event.ActionEvent actionEvent) {
    String actionName=actionEvent.getActionCommand();
    System.out.println("actionName="+actionName);
    if(actionName.equalsIgnoreCase("shiftup")){
    d=SMALL_INCREMENT;
    }
    if(actionName.equalsIgnoreCase("shiftdown")){
    d=LARGE_INCREMENT;
    }
    if(actionName.equalsIgnoreCase("up")){
    add(0,-d);
    }
    if(actionName.equalsIgnoreCase("down")){
    add(0,d);
    }
    if(actionName.equalsIgnoreCase("left")){
    add(-d,0);
    }
    if(actionName.equalsIgnoreCase("right")){
    add(d,0);
    }
    }
    }