代码
package javaapplication46;/**
 *
 * @author Administrator
 */
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.awt.geom.*;
public class Main
{
   public static void main(String[] args)
   {
       Win w=new Win();//这里没问题
       w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       w.show();
    }
}
class Win extends JFrame implements ActionListener
{
     Mypanel panel;
     public Win()
     {
       setTitle("Game");
       setSize(400,400);
       setLocation(200,200);       JButton b=new JButton("开始游戏");
       JPanel j=new JPanel();
       panel=new Mypanel();
       j.add(b);
       j.add(new JLabel("点击开始后开始"));
       add(panel,BorderLayout.CENTER);
       add(j,BorderLayout.NORTH);
       b.addActionListener(this);
     }
     public void actionPerformed(ActionEvent e)
        {
           panel.thread.start();
         }
}
class Mypanel extends JPanel implements KeyListener,Runnable
{
      int x=100,y=100,dir=0,num=0,flag=1;
      Thread thread;
      Rectangle2D[] snake=new Rectangle2D[10];
      Rectangle2D[] food=new Rectangle2D[10];
      public Mypanel()
      {
       setLayout(null);
       addKeyListener(this);
       setFocusable(true);
       thread=new Thread(this);
       for(int i=1;i<10;i++)
       snake[i]=new Rectangle2D.Double();
       snake[0]=new Rectangle2D.Double(100,100,10,10);
       for(int i=0;i<10;i++)
       food[i]=new Rectangle2D.Double(i*40+5,i*20+5,10,10);
       setBackground(Color.WHITE);
      }
      public void run()
     {
         while(true)
         {
           if(dir==0)
           {
            try{
            snake[0].setFrame(x,y=y+5,10,10);
            repaint();
            if(x==food[num].getX()&&y==food[num].getY())
            {
              num++;
             }
            Thread.sleep(100);}
            catch(Exception e){}
           }
           else if(dir==1)
           {
            try{
            snake[0].setFrame(x,y=y-5,10,10);
            repaint();
            if(x==food[num].getX()&&y==food[num].getY())
            {
              num++;
             }
            Thread.sleep(100);}
            catch(Exception e){}
            }
           else if(dir==2)
           {
             try{
             snake[0].setFrame(x=x-5,y,10,10);
             repaint();
             if(x==food[num].getX()&&y==food[num].getY())
            {
              num++;
             }
             Thread.sleep(100);}
             catch(Exception e){}
           }
           else if(dir==3)
           {
             try{
             snake[0].setFrame(x=x+5,y,10,10);
             repaint();
              if(x==food[num].getX()&&y==food[num].getY())
             {
              num++;
             }
             Thread.sleep(100);}
             catch(Exception e){}
            }
          for(int i=(num<10?num:9);i>0;i--)
             snake[i].setFrame(snake[i-1].getX(),snake[i-1].getY(),10,10);
            if(num==10)
            {  flag=0;
               repaint();
               break;
             }
          }
      }
    @Override
      public void paintComponent(Graphics g)
      {
       super.paintComponent(g);
       Graphics2D g2=(Graphics2D)g;
       for(int i=0;i<=(num<10?num:9);i++)
       g2.draw(snake[i]);
       g2.setPaint(Color.BLUE);
       g2.fill(snake[0]);
       g2.setPaint(Color.GREEN);
       for(int i=1;i<=(num<10?num:9);i++)
       g2.fill(snake[i]);
       g2.setPaint(Color.BLACK);
       if(num<10)
       {g2.draw(food[num]);
        g2.fill(food[num]);
       }
       if(flag==0)
       {g.drawString("~~~恭喜你:吃完了~~~",150,100);}
       }
      public void keyPressed(KeyEvent e)
      {
        int k=e.getKeyCode();
        if(k==KeyEvent.VK_DOWN){dir=0;}
        if(k==KeyEvent.VK_UP){dir=1;}
        if(k==KeyEvent.VK_LEFT){dir=2;}
        if(k==KeyEvent.VK_RIGHT){dir=3;}
      }
      public void keyReleased(KeyEvent e){}
      public void keyTyped(KeyEvent e){}
}
但是
package javaapplication47;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
/**
 *
 * @author Administrator
 */
public class Snaker {    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Myframe frame;
        frame=new Myframe();//这里怎么说静态方法不能引用非静态的this,上面和这里有什么不同??
        // TODO code application logic here
    }
class Myframe extends JFrame {
   public Myframe(){
        super("贪吃蛇游戏");
        setLayout(new BorderLayout());
        JButton button=new JButton("开始游戏");
        JLabel label=new JLabel("点击开始,开始游戏");
        JPanel j=new JPanel();
        JPanel panel=new JPanel();
        j.add(button);
        j.add(label);
        add(j,BorderLayout.NORTH);
        add(panel,BorderLayout.CENTER);
    }
}}

解决方案 »

  1.   

    怎么没人啊。难道代码太多吓跑了。其实只需看这两个。。比较清楚吧??
     Win w=new Win();//这里没问题
    Myframe frame;
            frame=new Myframe();//这里怎么说静态方法不能引用非静态的this,上面和这里有什么不同??谢谢。希望有人回答。。等一下午了。。
      

  2.   

    你的第二段代码MyFrame是个内部类,是故意的,还是不小心把花括号搞错了?
    不知道我这样说你明白了没!
      

  3.   

    static class Myframe extends JFrame {...}