论坛首页 入门技术论坛

这些信息是什么意思?

浏览 2850 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-01-10  
写了个用双缓冲屏外做图的小程序,代码如下:

import javax.swing.JFrame;
import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Image;
import java.awt.Dimension;


public class DaulBuffer extends JFrame
{
public static void main (String[] args)
{
new DaulBuffer();
   }

    public DaulBuffer()
    {
    this.setBounds(1024/4, 768/4, 1024/2, 768/2);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.add(new TopCanvas());
    this.setVisible(true);
    }
   
    //画布
    class TopCanvas extends Canvas implements Runnable
    {
    public TopCanvas()
    {
                  //圆球的初始坐标
    x = 0;
    y = 0;
                  //圆球移动的增量
    xMove = 3;
    yMove = 3;
   
    Thread t = new Thread(this);
    t.start();
    }
   
    public void update(Graphics g)
    {
       Dimension offScreenSize = this.getSize();
           offScreen = this.createImage(offScreenSize.width,offScreenSize.height);
           drawOffScreen = offScreen.getGraphics();
           paint(drawOffScreen);
           drawOffScreen.dispose();
           g.drawImage(offScreen, 0, 0, this);
           paint(g);
        
    }
   
    public void paint(Graphics g)
    {
    drawOffScreen.setColor(Color.BLACK);
    drawOffScreen.fillRect(0, 0, 1024/2, 768/2);
   
    drawOffScreen.setColor(Color.WHITE);
    drawOffScreen.fillOval(x, y, 30, 30);
   
    g.drawImage(offScreen, 0, 0, this);
    }
   
    public void run()
    {
    while(true)
    {
    repaint();
   
    try
    {
    Thread.sleep(24);
    }
    catch(InterruptedException e){
    }
   
    x += xMove;
    y += yMove;
   
    if(x >= (1024/2 - 30))
    {
    x = 1024/2 - 30;
    xMove = -xMove;
    }
    if(x < 0)
    {
    x = 0;
    xMove = -xMove;
    }
   
    if(y >= (768/2 - 60))
    {
    y = 768/2 - 60;
    yMove = -yMove;
    }
    if(y < 0)
    {
    y = 0;
    yMove = -yMove;
    }
    }
    }
   
    int x;
int y;
int xMove;
int yMove;
Image offScreen;//次级画面
Graphics drawOffScreen;//绘制次级画面的Graphics实例

    }
   
}


编译能通过也能正常运行,但是会有如下的信息,不知道为什么:

--------------------Configuration: <Default>--------------------
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at DaulBuffer$TopCanvas.paint(DaulBuffer.java:82)
    at sun.awt.RepaintArea.paintComponent(RepaintArea.java:248)
    at sun.awt.RepaintArea.paint(RepaintArea.java:224)
    at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:254)
    at java.awt.Component.dispatchEventImpl(Component.java:4031)
    at java.awt.Component.dispatchEvent(Component.java:3803)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)

Process completed.







~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

还有请告诉我这样写双缓冲屏外作图的方法是否最优?我写的这个程序是参考了一个Applet例子的。它其中主要的步骤是这样的:
       Image OffScreen     = createImage(width,height); //次级画面
      Graphics drawOffScreen = OffScreen.getGraphics();//绘制次级画面的Graphics实例
两句是放在  init()方法中的,paint()方法和上面的代码一样。

可是我如发炮制时编译通不过要报错:
--------------------Configuration: <Default>--------------------
Exception in thread "main" java.lang.NullPointerException
    at DaulBuffer$TopCanvas.<init>(DaulBuffer.java:43)
    at DaulBuffer.<init>(DaulBuffer.java:27)
    at DaulBuffer.main(DaulBuffer.java:20)

Process completed.

我是把
      Image OffScreen     = createImage(width,height); //次级画面
      Graphics drawOffScreen = OffScreen.getGraphics();//绘制次级画面的Graphics实例
这两句加在我的public TopCanvas()构造函数里的,代码如下:

public TopCanvas()
    {
                  //圆球的初始坐标
    x = 0;
    y = 0;
                  //圆球移动的增量
    xMove = 3;
    yMove = 3;
   
                  Image OffScreen     = createImage(width,height);
                     Graphics drawOffScreen = OffScreen.getGraphics();


    Thread t = new Thread(this);
    t.start();
    }

paint方法没有变动。

以上的种种问题不知道为什么。请知道的朋友指点一二,不胜感激!!!
   发表时间:2007-01-10  
哦,忘了说明这个程序就是在一个底色为黑色的窗口中有一个白色的球在其中不停的移动,碰壁则反弹,如此不停的循环。
0 请登录后投票
论坛首页 入门技术版

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