双缓冲消除闪烁在重量级Frame和轻量级组件Jframe中的区别
来源:互联网 发布:ntfs for mac 10.12.6 编辑:程序博客网 时间:2024/05/16 19:11
以下均为个人理解,如有疏漏请指正。
1,基本调用关系
类 Component
1.paint(Graphics g)的定义:
public void paint(Graphics g)
- 绘制此组件。
应该绘制组件的内容时调用此方法;例如首次显示组件或者组件已损坏并需要修复时。
Graphics
参数中的剪贴区矩形设置为需要绘制的区域。重写此方法的Component
子类不需要调用super.paint(g)
。出于性能的考虑,首次显示宽度或高度为 0 的
Component
时认为它不需要进行绘制,并且也不需要修复。 2.update(Graphics g)的定义:
public void update(Graphics g)
- 更新组件。
如果此组件不是轻量级组件,则为了响应对
repaint
的调用,AWT 调用update
方法。可以假定未清除背景。Component
的update
方法调用此组件的paint
方法来重绘此组件。为响应对repaint
的调用而需要其他工作的子类通常重写此方法。重写此方法的 Component 子类应该调用super.update(g)
,或者直接从其update
方法中调用paint(g)
。
- 更新组件。
3.repaint()在api中的定义:
public void repaint()
- 重绘此组件。
如果此组件是轻量级组件,则此方法会尽快调用此组件的
paint
方法。否则此方法会尽快调用此组件的update
方法。 综上:
- 轻量级组件 repaint()直接调用paint()
- 重量级组建repaint()调用update()调用paint()
2.解决方案
1.Frame等重量级组件:
- 重写update()
- 私有变量 Imagine offScreenImage=null;
public void update(Graphics g) { if(offScreenImage == null) offScreenImage = this.createImage(800, 600); //新建一个图像缓存空间,这里图像大小为800*600 Graphics gImage = offScreenImage.getGraphics();//得到画笔 <span style="white-space:pre"> gImage.setColor(gImage.getColor()); </span> gImage.fillRect(0, 0, WIDTH, HEIGHT); //填充缓存图像 paint(gImage); //先绘制在缓存空间 g.drawImage(offScreenImage, 0, 0, null); //再绘制在屏幕上 } }
2.Jframe等轻量级组件:
- public void paint(Graphics g) {
- // 在重绘函数中实现双缓冲机制
- offScreenImage = this.createImage(WIDTH, HEIGHT);
- // 获得截取图片的画布
- gImage = offScreenImage.getGraphics();
- gImage.setColor(gImage.getColor());
- gImage.fillRect(0, 0, WIDTH, HEIGHT); // 填充缓冲
- super.paint(gImage);
- 用gImage绘制图形
- 代码根据具体情况
- g.drawImage(offScreenImage, 0, 0, null); //将缓冲图案绘制在屏幕上
- }
3.归纳:
以上两种方案根据repaint()调用顺序决定重写哪个方法,其基本思想都是在缓冲图像上绘制好图像一次显示在屏幕上,避免了直接绘制时由于绘制过程和清屏导致的图像遗留和闪烁。
0 0
- 双缓冲消除闪烁在重量级Frame和轻量级组件Jframe中的区别
- 调用repaint() 在重量级和轻量级组件区别
- 轻量级组件和重量级组件的区别
- JAVA中的重量级组件和轻量级组件
- java 轻量级组件和重量级组件的区别
- 轻量级组件与重量级组件的区别
- JAVA重量级组件和轻量级组件 文摘
- Java轻量级组件和重量级组件
- java消除闪烁 双缓冲
- java双缓冲消除闪烁
- java组件之重量级与轻量级区别
- java组件之重量级与轻量级区别
- 双缓冲原理在awt和swing中实现消除闪烁的方法
- Frame和JFrame的区别
- JFrame和Frame的区别
- JFrame和Frame的区别
- java的Frame和JFrame中的paint方法区别
- java的Frame和JFrame中的paint方法区别
- java-数据结构-概述
- CodeForces Gym 100989E Accepted Passwords
- mysql cpu使用高案例处理
- 人工智能的革命:道德可以被编程么?
- Sql server Group by 统计数量 order by时间
- 双缓冲消除闪烁在重量级Frame和轻量级组件Jframe中的区别
- iOS通讯模式(KVO、Notification、Delegate、Block、Target-Action的区别)
- 使用Google开源tesseract OCR用语言库报allow_blob_division解决方案
- CodeForces Gym 100989F Mission in Amman (A)
- 逻辑回归模型的评估方法
- hdu 2043 密码
- Java解析XML的方法总结
- 常规功能和模块自定义系统 (cfcmms)—055 extjs6的DateTimeField
- CodeForces Gym 100989H Queue (A)