论坛首页 入门技术论坛

双缓冲屏外作图的问题

浏览 1939 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-01-16  
写了个“双缓冲屏外作图”小程序,遇到一个问题:
offScreen = this.createImage(1024/2, 768/2);
drawOffScreen = offScreen.getGraphics();
以上这两句代码不能在我的MyCanvas()构造函数里初始化!!!

我写的代码要求是:在一个底色为黑色屏幕里有一个白色的小球在移动,碰到四周反弹,如此不停的循环。构思是这样的:先写一个JFrame框架,在JFrame框架里add()一个Canvas画布。在这个画布里完成我上面的程序要求。代码如下:
import javax.swing.JFrame;
import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Image;
 
public class DaulBuffer extends JFrame
{
   public static void main (String[] args) 
   {
               new DaulBuffer();
    }
 
    public DaulBuffer() 
    {
                //初始化窗口的位置
         this.setLocation(1024/4, 768/4);
 
                //点击窗口右上角的叉叉结束程序
         this.setDefaultCloseOperation(EXIT_ON_CLOSE);
               
                //加入画布
        this.add(new MyCanvas());
 
                //根据画布的大小自动设置窗口的大小
        this.pack();
 
                //显示窗口                
        this.setVisible(true);
    }
    
    //画布
    class MyCanvas extends Canvas implements Runnable
    {
       public MyCanvas()
       {
                //设置画布的大小  
           this.setSize(1024/2, 768/2);

               //要画的白色圆球在画布里的初始位置
           x = 0;
          y = 0;
 
               //圆球移动的增量
           xMove = 3;
          yMove = 3;
      
/**
 *  这就是我遇到问题的地方!
 *  如果我在这里初始化会报错,错误如下:
 *           Exception in thread "main" java.lang.NullPointerException
 *  at DaulBuffer$TopCanvas.<init>(DaulBuffer.java:48)
 *  at DaulBuffer.<init>(DaulBuffer.java:30)
 *  at DaulBuffer.main(DaulBuffer.java:22)
 *
 *   
 *   错误第二行的“48”指的就是:drawOffScreen = offScreen.getGraphics();
 *   在我的计算机上运行是 48
 *   
 *   错误的意思是为空,我就搞不明白为什么为空了,我明明产生了实体啊?
 *   
 */
        //offScreen = this.createImage(1024/2, 768/2);
        //drawOffScreen = offScreen.getGraphics();
        
                Thread t = new Thread(this);
                t.start();
       }
      
       public void run()
       {
           while(true)
           {
                 repaint();
          
                 try
                 {
                     Thread.sleep(41);
                 }
                 catch(InterruptedException e){}
        
                 x += xMove;
                 y += yMove;
      
                   //下面的四个 if 语句是对圆球碰壁的判断    
                      if(x >= (1024/2 - 30)
                   {
                       x = 1024/2 - 30;
                       xMove = -xMove;
                   }
 
                   if(x < 0)
                   {
                        x = 0;
                        xMove = -xMove;
                   }
          
                   if(y >= (768/2 - 30))
                   {
                        y = 768/2 - 30;
                        yMove = -yMove;
                   }
 
                   if(y < 0)
                   {
                         y = 0;
                         yMove = -yMove;
                   }
           }
      }
      
       public void update(Graphics g)
       {
           //出问题的两句要放在这里初始化才行????
             offScreen = this.createImage(1024/2, 768/2);
           drawOffScreen = offScreen.getGraphics();
    
           //先画一个黑色的背景
             drawOffScreen.setColor(Color.BLACK);
           drawOffScreen.fillRect(0, 0, 1024/2, 768/2);
      
           //再画一个白色的圆球  
             drawOffScreen.setColor(Color.WHITE);
           drawOffScreen.fillOval(x, y, 30, 30);
        
           paint(g);
         
       }
      
       public void paint(Graphics g)
       {  
           //把缓冲区的图象画到用户能看到的屏幕上  
             g.drawImage(offScreen, 0, 0, this);
       }
      
       int x;
       int y;
       int xMove;
       int yMove;
       Image offScreen;//次级画面
       Graphics drawOffScreen;
    
    }
    
}



offScreen = this.createImage(1024/2, 768/2);
drawOffScreen = offScreen.getGraphics();
这两句也可以放在paint()中,就是不能放在MyCanvas()中,郁闷了,请知道的朋友告诉我原因何在???
不胜感激!!! 谢谢先。
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics