我要在JLabel上动态显示一个从Myjxta.image得来的图像,在Myjxta中一旦image发生变化,就会调用JLabel的repaint()方法。 由于会闪烁我用了双缓冲技术,代码如下,但是还是会闪烁,不知道是什么原因,是不是哪块没有编写正确~~~请各位高人们尽快回答,急~~~~import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;import javax.swing.JLabel;public class MyLabel extends JLabel 
{

private Image offScreenImage=null;
private Graphics offScreenBuffer=null;
public void paint(Graphics g)
{ if(Myjxta.image!=null)
{

                     this.setPreferredSize(new Dimension(Myjxta.image.getWidth(),Myjxta.image.getHeight()));
g.drawImage(Myjxta.image, 0, 0, this);

}
else
{
System.out.println(Myjxta.image==null);
}
try
{
Thread.sleep(200);
}
catch(Exception e)
{
e.printStackTrace();
}
}
public void update(Graphics g)
{
  if (Myjxta.image != null) 
  {
if(offScreenBuffer==null)
{
offScreenImage =this.createImage(Myjxta.image.getWidth(),Myjxta.image.getHeight());
offScreenBuffer = offScreenImage.getGraphics();
}


paint(offScreenBuffer);
offScreenBuffer.dispose();
g.drawImage(offScreenImage,0,0,this);

  }
}

}

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【internetman】截止到2008-07-04 17:47:04的历史汇总数据(不包括此帖):
    发帖的总数量:10                       发帖的总分数:250                      
    结贴的总数量:10                       结贴的总分数:250                      
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:100.00%               结分的百分比:100.00%                  
    无满意结贴率:0.00  %               无满意结分率:0.00  %                  
    敬礼!
      

  2.   

    动态显示图片应该是每次新生成一张image来覆盖原来的
      

  3.   

    别把所有的图片都用一个image引用来画我猜你的Myjxta.image可能是用到哪到张图片的时候,动态生成这张图片,并用image引用,如果是这样的话
    在图片显示之前还有一个创建图片的过程,这个过程就会花费时间,所以会出现闪烁的现象不知道我说的对不对,你的代码给的不全,双缓冲我没看有什么问题,所以我觉得是生成图片的过程有问题
    你把所有的图片对象预先生成并存在一个Image数组中应该就会好了
      

  4.   

    if(offScreenBuffer==null)
            {
                offScreenImage =this.createImage(Myjxta.image.getWidth(),Myjxta.image.getHeight());
                offScreenBuffer = offScreenImage.getGraphics();    
            }
            
            Color c = g.getColor();
            g.setColor(xxx);
            g.fillRect(xxx):
            paint(offScreenBuffer);
            offScreenBuffer.dispose();
            g.setcolor(c);
            g.drawImage(offScreenImage,0,0,this);
            
          }
      

  5.   

    try
            {
                Thread.sleep(200);
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }这句什么意思?动画不是这么动起来地,你叫绘图线程休眠不闪才怪。
      

  6.   

    实现动画大体思路:启动一个新线程,让它以一定时间间隔将一帧动画图片绘制到缓冲图片上(写一死循环每次循环后休眠200毫秒),然后调用 JLabel 的 repaint() 方法让 JLabel 将新生成的缓冲图片通过 JLabel 的 paint 方法绘制出来。周而复始重复此过程动画就看到了。
      

  7.   

    再给解释一下我这个程序,这个程序是从远程机器抓屏存储在Myjxta.image中,然后到本地机上显示的,每当Myjxta.image发生变化的时候就会调用repaint()来重绘label。动画当然可以动,实现但是就是每次image变化后屏幕会闪,所以我用了双缓冲技术但是还是会闪。不知道是什么情况。  
          sagezk我让线程休眠一下,是因为从远程读取image需要时间的。在休眠之前图片已经重绘了所以不存在,它仍然是动画。就是每次图片一变化他就会闪呵呵~~
       ilysony 写的不太明白~~
        kuyesuifeng 我是每次Myjxta.image生成好了之后才调用repaint()方法的所以也没有问题
        ilrxx  pilishou  没有仔细看我的问题~~~
      呵呵 继续等待高人回答~~弄了半天还是不行 呵呵~ 或者不用双缓冲也行,反正只要image变化的时候label别闪就ok了!!!呵呵~
        
       
      

  8.   


    我知道你的程序能使动画动起来,但阻塞 AWT 线程十分危险,你这样处理思路有问题。
      

  9.   

    楼上的
    我试验了,我把那几句休眠取了~~还是一样~~~!!!!突然感觉用不着双缓冲,因为image已经是内存中已经完全绘好的图片了,直接显示出来就完了~,但是当image变化的时候 还是会闪~
      

  10.   

    另外绘制自己的图像使用较低级的组件 java.awt.Canvas 或继承自 java.awt.Component 或 javax.swing.JComponent 要比用 JLabel 好得多,无论是性能上还是稳定性上。JLabel 本身已经实现了一堆绘图逻辑和保存了不少内部状态,而继承后大多又没使用上,这样不少资源白白浪费了。
      

  11.   

    那你意思是让我用Canvas试试???那我试试!!
      

  12.   


    原来你是通过网络读取的啊.难怪!!在连续播放一组图像实现动画,尤其通过网络传输播放图像时,由于getImage()方法仅仅是生成一个Image对象
    返回给调用者,它并不表示图像数据已经被装载到内存,如果程序同时产生另一个线程去真正读取该图像文件,
    因为网络传输速度问题,造成图像数据还没有完全传输到内存,就开始显示图像,使播放画面出现不完整,闪烁
    等现象,为避免这种现象的发生,应该使用MediaTracker来跟踪图像等数据,检测所有的使用数据是否完全传输到
    内存中,以便决定播放动画的开始时间
      

  13.   

    楼上我是使用事件来监听的所以是不会出现你所说的问题的,当完全读完了才会重绘的~~
    但是我现在用canvas就不闪了~~呵呵~原来的确是JLabel的问题,主要是那时候考虑canvas不能使用JScrollPane()加不成滚动条才用JLabel的,显示图像还是用专门的图像控件来的好~~哈哈~
    结贴!!!