我要在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);
}
}
}
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);
}
}
}
解决方案 »
- 谁有ava访问数据库后导出csv格式的文件
- 请大家解答下Graphics或Graphics2D的drawString方法是在那里实现的
- 用贪婪法解决翻译匹配的问题(大量字符串替换)
- 在java文件中怎样调用jar命令
- 如何把Applet的运行机制运用到Application中?
- 如何读取二进制文件?
- 请问大家是如何设定错误代码的?
- 哪里有Java 开发宝典下载呀???
- ######紧急求助!!!用java程序访问https站点的问题!!!!######
- c#出来后,java会受多大的冲击?
- 欢迎大家讨论一下MLDN 魔乐在线
- tableviewer中不用鼠标点击怎样获得celleditor的焦点
楼主【internetman】截止到2008-07-04 17:47:04的历史汇总数据(不包括此帖):
发帖的总数量:10 发帖的总分数:250
结贴的总数量:10 结贴的总分数:250
无满意结贴数:0 无满意结贴分:0
未结的帖子数:0 未结的总分数:0
结贴的百分比:100.00% 结分的百分比:100.00%
无满意结贴率:0.00 % 无满意结分率:0.00 %
敬礼!
在图片显示之前还有一个创建图片的过程,这个过程就会花费时间,所以会出现闪烁的现象不知道我说的对不对,你的代码给的不全,双缓冲我没看有什么问题,所以我觉得是生成图片的过程有问题
你把所有的图片对象预先生成并存在一个Image数组中应该就会好了
{
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);
}
{
Thread.sleep(200);
}
catch(Exception e)
{
e.printStackTrace();
}这句什么意思?动画不是这么动起来地,你叫绘图线程休眠不闪才怪。
sagezk我让线程休眠一下,是因为从远程读取image需要时间的。在休眠之前图片已经重绘了所以不存在,它仍然是动画。就是每次图片一变化他就会闪呵呵~~
ilysony 写的不太明白~~
kuyesuifeng 我是每次Myjxta.image生成好了之后才调用repaint()方法的所以也没有问题
ilrxx pilishou 没有仔细看我的问题~~~
呵呵 继续等待高人回答~~弄了半天还是不行 呵呵~ 或者不用双缓冲也行,反正只要image变化的时候label别闪就ok了!!!呵呵~
我知道你的程序能使动画动起来,但阻塞 AWT 线程十分危险,你这样处理思路有问题。
我试验了,我把那几句休眠取了~~还是一样~~~!!!!突然感觉用不着双缓冲,因为image已经是内存中已经完全绘好的图片了,直接显示出来就完了~,但是当image变化的时候 还是会闪~
原来你是通过网络读取的啊.难怪!!在连续播放一组图像实现动画,尤其通过网络传输播放图像时,由于getImage()方法仅仅是生成一个Image对象
返回给调用者,它并不表示图像数据已经被装载到内存,如果程序同时产生另一个线程去真正读取该图像文件,
因为网络传输速度问题,造成图像数据还没有完全传输到内存,就开始显示图像,使播放画面出现不完整,闪烁
等现象,为避免这种现象的发生,应该使用MediaTracker来跟踪图像等数据,检测所有的使用数据是否完全传输到
内存中,以便决定播放动画的开始时间
但是我现在用canvas就不闪了~~呵呵~原来的确是JLabel的问题,主要是那时候考虑canvas不能使用JScrollPane()加不成滚动条才用JLabel的,显示图像还是用专门的图像控件来的好~~哈哈~
结贴!!!