我用NetBean实现的,需要在JPanel上显示多个JPG照片,可以显示出来的内容,有时特别混乱。如下图所示。但有时又是好的。不知是否是我的代码中有什么问题?相关代码由于繁杂,在此只能贴出一部分,可各位高手参考。
如果谁有这方面较好的例子子,可以发给我看一看,多谢了!
简单介绍一下:我要实现的功能是显示多幅照片,并且能在JPanel上显示拖动多幅照片等。在JPanel的继承类中
  
 主要变量:
    private BufferedImage bufferImage = null;
    public static Graphics gbuffer;初始化时执行了:this.setDoubleBuffered(true);   
        bufferImage = new BufferedImage(BUFFER_IMAGE_WIDTH, BUFFER_IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);
        gbuffer = bufferImage.getGraphics();
有以下方法,以实现图像的刷新。别的地方调用repaint(),即可执行到此处代码。
 @Override protected void paintComponent(Graphics g) {
           if(RepaintBusy==true) return;
           RepaintBusy=true;
            gbuffer.setColor(StaticParams.BACKGROUND);
            gbuffer.fillRect(0, 0, BUFFER_IMAGE_WIDTH, BUFFER_IMAGE_HEIGHT);
            ThisGridManager.GridVec.Draw(gbuffer);//这是我的业务实现用的代码,功能是向BufferImage上写内容。
            g.drawImage(bufferImage, 0, 0, this);
            System.gc();
            RepaintBusy=false;
            return;
    }

解决方案 »

  1.   

    单看你这点代码,发现几个问题
    1.你业务的代码为什么要写在paintComponent方法中呢,你完全可以将他提出,毕竟这个方法主要是负责页面显示的方法
    2.你为什么要主动去调用gc(),这是一个很不明智的做法,既得不到你想要的立即回收,又添加了系统cpu的使用
    3.建议你重写这个画图的方法的时候,最好在该方法的第一句调用super.paintComponent(g);的方法,以免破坏JDK原有的结构,出现不可预料的问题
      

  2.   

    2.使用双缓冲创建动画的程序 
    (1)程序功能:使用双缓冲来建立动画的效果,清除闪烁的现象。 
    (2)编写LX8_7.java 程序文件,源代码如下。 
    import java.awt.*; 
    import java.applet.*; 
    public class LX8_7 extends Applet { 
    Image buffer,img,star; 
    Graphics g1; 
    Thread td; 
    int x=0; 
    public void init() { 
    buffer=createImage(getWidth(),getHeight());//创建图像缓冲区 
    g1=buffer.getGraphics();//创建绘图区 
    img=getImage(getCodeBase(),"image/飞机.gif"); 
    star=getImage(getCodeBase(),"image/天空.JPG"); 

    public void paint(Graphics g) { 
    g1.drawImage(star,0,0,this); //将图像先画到缓冲区 
    g1.drawImage(img,310-x,20,this); //将图像先画到缓冲区 
    g.drawImage(buffer,0,0,this);//将缓冲区占的图像画出 
    try { 
    Thread.sleep(10); 
    x+=2; 
    if (x==310) { 
    x=2; 
    Thread.sleep(1000); 

    } catch (InterruptedException e) {} 
    repaint(); 

    public void update(Graphics g) { 
    paint(g); 


    (5)程序说明: 
    改进后的程序比原程序增加了Image 类对象buffer 和Graphics 类对象g1。覆盖了
    update 方法。换帧速度提高到100(1000/10),飞机每次移动2 个点,动画效果更加平滑
    而且无闪烁。 
    新增的buffer 对象,用作屏幕缓冲区。新增的g1 对象,用作屏幕绘图区。在init 方
    法中,程序调用Image 对象的createImage 方法,按照Applet 的宽度和高度创建了屏幕缓
    冲区,然后调用getGraphics 方法创建了Image 对象buffer 的绘图区。在paint 方法中通
    过g1.drawImage 改变了图像输出的方向,图像被画在屏幕缓冲区内。由于屏幕缓冲区不可
    见,使得画面交替时的闪烁现象也不 
    可见。当屏幕缓冲区上的画图完成以后,再调用g.drawImage 方法将整个屏幕缓冲区拷
    贝到屏幕上,这个过程是直接覆盖,不会产生闪烁。上述方式被称为图形双缓冲技术。 
    图形双缓冲技术实际上是创建了一个不可见的后台屏幕,进行幕后操作,图像画在后台屏幕
    上,画好之后再拷贝到前台屏幕上。这种技术圆满解决了画面交替时的闪烁,但图像显示速
    度变慢,内存占用较大,用户离开网页后,嵌入的Applet 会继续运行,占用CPU 时间。