★ 双缓冲工作原理
(图片来自http://www.vckbase.com/document/viewdoc/?id=1612,更多文字介绍请参阅该短文)
★ 不用双缓冲为什么产生闪烁
我们知道屏幕的工作方式可以简化理解为,定时扫描显存并将之通过显像管成像映射到屏幕上。我们在绘制图像时通常采用替代方式:首先用背景色或背景图片将之前内容抹掉,然后再在背景色或背景图片上绘制新内容。则,如下图所示将一副笑脸的图片替换为大笑(横坐标轴为屏幕刷新,红线和绿线代表不同的绘制时序):
红线是闪烁的情况:在扫描1时,我们看到笑脸;扫描2时,我们看到纯背景色,扫描3时,我们看到大笑;绿色是不闪烁的情况:在扫描1和2时,我们看到笑脸,扫描3时,我们看到大笑。闪烁是由于我们交替看到了背景色和前景。
由此我们看出,需要绘制场景的复杂度并不是闪烁产生的关键因素,即使是很简单的绘制由于扫描和绘制的时序配合不当也会产生闪烁。而双缓冲的应用则使得笑脸和大笑之间的纯背景色绘制在offscreen中进行,从而消除了闪烁。
另一方面,闪烁的产生是由于使用了替代的绘制方式。如果我们只是使用增量的绘制方式,即只是单纯的向画板添加新内容而不使用背景色或背景图片清除原内容,也可以避免闪烁的产生。简单的原理可以参阅http://www.cnitblog.com/fangyuanning/archive/2009/07/19/60204.aspx,该短文指出了在绘制区域极其规整和集中的时的处理方法;下文关于update()的说明也会有避免闪烁很好的演示。
★ paint(),repaint() and update()
一个包含更多内容的AWT&Swing绘制内容应该参阅官方文章<Painting in AWT and Swing>,该文详细的介绍了我们在处理AWT&Swing的painting过程中应该关心的问题。本文上文提到的增量方式避免闪烁的例子出现在Painting in the AWT -> The Paint Method 章节的倒数第2段,但同时应当注意到,由于该文后面提到的原因——Swing并不使用update()方法,增量防止闪烁的做法在Swing是不可行的。该文章叙述“the opaque property is primarily a contract with the repaint system”是对Jcomponent组件的opaque属性很好的诠释,同样的还有对OptimizedDrawingEnabled属性也做出了很好的解释。看完该全文我想对于SWT与Swing绘制的主题就不会有更多疑问了。
Good luck, though.
- 大小: 11.9 KB
分享到:
相关推荐
Java中Graphics的paint和repaint方法.pdf 学习资料 复习资料 教学资源
Graphics 与 repaint 方法
Java绘制不规则几何图形,比如划曲线,写字,线条随意画,如截图所示,甚至可以写出文字: 不规则图形的绘制代码: public class IrregularShapeDemo extends JFrame { GeneralPath gPath= new ...
对于轻量级和重量级组件的区别,和repaint函数中重量级组件打的处理
import java.applet.Applet; import java.awt.Color; import java.awt.Graphics; import java.awt.Rectangle; /** An applet that displays a simple animation */ public class BouncingCircle extends ...
qt 中更新界面和重绘的问题
import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.StringSelection; import ...
Java图片拉伸变形实例,其实和图片缩放十分相似,图片翻折,绘制图像的Image对象和Grahpics对象,得到MediaTracker实例,for(int i=0; i(imageHeight/2); i ) { //实现图片的翻折效果 thread.sleep(30); //线程...
主要介绍了Java Swing实现窗体添加背景图片的2种方法,结合实例形式较为详细的分析了Swing实现窗体添加背景图片的方法,并总结分析了Swing重绘中repaint与updateUI的区别,需要的朋友可以参考下
Java 2实用教程(第三版)实验指导与习题解答 清华大学出版社 (编著 耿祥义 张跃平) 实验模版代码 建议使用文档结构图 (选择Word菜单→视图→文档结构图) 上机实践1 初识Java 4 实验1 一个简单的应用程序 ...
public void paint(Graphics g) { g.clearRect(0, 0, 900, 900); // System.out.print(drawl.length); if (audioData != null) { drawl = new int[audioData.length]; for (int i = 0; i ; i++) { ...
repaint();} else { seconds = calendar.get(Calendar.HOUR) * 60 * 60 + calendar.get(Calendar.MINUTE) * 60 + calendar.get(Calendar.SECOND); repaint();} } } 的小程序,大家可以看看,
hill no repaint for mt4
Java实现图片透明效果,从演示截图可看到,上层图片与下层图片互相重叠,也就是上层图片透明了,看到了下层以的图片,具体的代码实现: public class HalfTransparentImageDemo extends JFrame { private ...
表盘式时钟,并显import java.awt.*; import java.awt.event.*; import javax.swing.*; import sun.util.calendar.Gregorian; import java.util.Calendar; import java.util.GregorianCalendar; public class ...
Java绘制不规则图形的源代码,类似于一个Java小画板,可以画出一些基于线条的图形,比如曲线,直线,还可用来写字,示例截图如上图所示。以下是相关源代码: protected void processMouseEvent(MouseEvent e) { //...
Java根据URL读取图像并显示,给出一个图片的URL地址,本代码会显示出该图片。 JTextField jtfUrl; //输入图像地址url JButton jbGetImage; //取图像按钮 Image image; //获取的图像 Toolkit toolKit; //...
this indicator to optimized analyse forex trading for all pair and any time frame
JAVA语言与面向对象程序设计单选题 applet的主要方法 在Java Applet程序用户自定义的Applet子类中,一般需要重载父类的( )方法来完成主类实例的初始化工作。 A.A. start( ) B. B. stop( ) C. C. init( ) D. D. paint...
Java读取网址URL中的图片并显示,这是个很简单的例子,从网络取得图象,通过Java解析URL,过滤出图片地址,并读取远程URL中的图片内容,显示在JAVA的窗口中。本例主要是通过Toolkit对象,用于获取图像。编写时,我们...