Graphics解决闪烁问题的方法

  最近在写工具的时候,忽然发现了一个老生常谈的闪烁问题,要知道这样的问题在Java Swing里只要把DoubleBuffer设置为true基本上是不会发生的,但在C#上却怎么也搞不定,竟然连双缓冲都有问题,GDI+不会这么脆弱吧。

  偶再一次被微软的花头给戏弄了,无奈只好踏上了漫漫搜索之路,也不知道搜了多少帖子,找了多少资料,基本上都是无功而返,更可气的是网上有些资料还骗人,偶试了试基本上都不行的,该闪的照样闪的欢。有些方法像脏矩阵一样要Invalide部分更新区域,偶嫌他麻烦,幸好偶找到了一篇文章,讲闪烁原理的,虽然偶过去自认为了解闪烁原理,比如什么刷新周期,显存之类的,不过偶还是耐着性子看了一遍,收获颇丰,看来孔夫子的温故而知新颇有道理!

  于是偶按照原理自己改起了代码,没想到还真让我给解决了。C#控件之所以会闪烁,是因为Refresh会把整个控件给清成背景色,然后再把图像绘制上去,就算先把所有待画的图像绘制到缓冲上,然后再Render到控件上,因为清屏时的颜色,相当于中间插了一空白帧,当刷新过快时也是会有闪烁的。

  偶的做法是:

  1.每帧控件创建一个Graphics,记得一定是CreateGraphics而不是通过Paint函数的那个参数e获得。

  2.把待绘制的图像绘制到缓冲上,缓冲大小为控件大小。

  3.刷新的时候调用Invalidate(new Rectangle(0, 0, 1, 1));

  4.在Paint函数绘制缓冲,搞定!

  哈哈,相信大家看了都会了解,Invalidate(new Rectangle(0, 0, 1, 1));相当于调用Paint函数,但却不重绘控件,这样中间那个空白帧就没有了,闪烁当然就消失啦!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
屏幕闪烁问题通常是由于页面重绘引起的。在 Java 中,可以采用双缓冲技术来解决这个问题。具体来说,可以通过以下步骤实现: 1. 创建一个缓冲区,用于绘制页面; 2. 在缓冲区中绘制页面; 3. 将缓冲区中的内容复制到屏幕上,完成页面的显示。 这样做可以避免页面重绘时的闪烁问题。 具体实现可以参考以下代码: ```java import java.awt.*; import javax.swing.*; public class DoubleBuffer extends JPanel { private Image dbImage; private Graphics dbg; public void paint(Graphics g) { // 创建双缓冲 if (dbImage == null) { dbImage = createImage(getSize().width, getSize().height); dbg = dbImage.getGraphics(); } // 在缓冲区中绘制页面 dbg.setColor(getBackground()); dbg.fillRect(0, 0, getSize().width, getSize().height); dbg.setColor(getForeground()); paintComponent(dbg); paintChildren(dbg); // 将缓冲区中的内容复制到屏幕上 g.drawImage(dbImage, 0, 0, this); } // 绘制页面的具体实现 protected void paintComponent(Graphics g) { // ... } // 测试 public static void main(String[] args) { JFrame frame = new JFrame("Double Buffer"); DoubleBuffer db = new DoubleBuffer(); frame.add(db); frame.setSize(400, 300); frame.setVisible(true); } } ``` 在上述代码中,`paint` 方法用于创建双缓冲,绘制页面和复制缓冲区中的内容到屏幕上;`paintComponent` 方法用于绘制页面的具体实现,可以根据需要进行修改;`main` 方法用于测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值