`
Now7!
  • 浏览: 7783 次
  • 性别: Icon_minigender_1
  • 来自: 济南
文章分类
社区版块
存档分类
最新评论

[Java 2D/Swing基础] 双缓冲;paint()、repaint()与update()

阅读更多

★ 双缓冲工作原理

 

(图片来自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双缓冲消除闪烁

    双缓冲在Java中有两种常用的实现方式:一种是在`update(Graphics g)`中实现,另一种是在`paint(Graphics g)`中实现。 ##### 4.1 在`update(Graphics g)`中实现双缓冲 在`update(Graphics g)`方法中,可以使用`...

    java画图(双缓冲)

    在Java中,我们可以使用Java AWT或Swing库来实现双缓冲。Swing提供了`JComponent`类,它支持自定义组件并允许我们重写`paintComponent(Graphics g)`方法进行绘图。在这个方法中,我们可以先在一个`Graphics2D`对象上...

    java2D动画效果

    Java2D是一个用于在Java平台上进行2D图形和图像处理的API,它扩展了Java的基础绘图功能,提供了更高级别的图形绘制能力,包括路径、文本、图像以及复杂的变换和混合模式。在Java2D中实现动画主要是通过不断地重绘...

    Java双缓冲技术详细讲解

    ### Java双缓冲技术详解 #### 一、双缓冲技术简介 在Java图形界面编程中,双缓冲技术是一种常用的提高绘制效率的技术。它通过减少屏幕闪烁和提高绘制速度来提升用户体验。双缓冲技术的核心思想是在内存中创建一个...

    JAVA2D开发实例

    在Java 2D开发中,Graphics类是核心组件,它提供了丰富的绘图功能,用于在Java应用的组件上绘制图形、文本和图像。以下是对Java 2D高级绘图技术的详细解释: 1. **Graphics类**:Graphics类位于java.awt包中,它是...

    JAVA双缓冲绘图源码

    此外,Java Swing提供了更好的绘图组件JComponent,它的 paintComponent 方法已经内置了双缓冲机制,所以如果你使用Swing,无需手动实现双缓冲,只需重写`paintComponent(Graphics g)`方法进行绘图即可。 通过以上...

    java2D超经典例程(包含2D各个方面,附源码)

    本教程的标题"java2D超经典例程(包含2D各个方面,附源码)"暗示了这是一份全面的Java 2D编程教程,覆盖了从基础到高级的各种主题,并且提供了完整的源代码示例,对于学习和实践Java 2D技术非常有帮助。 在Java 2D...

    java双缓冲技术————包含实例及技术详解,适合新手

    单缓冲与双缓冲的区别 - **单缓冲**:直接在屏幕上绘制图像,每次绘制都会覆盖之前的图像,如果绘制过程耗时较长,则可能会出现闪烁现象。 - **双缓冲**:先在一个内存中的“离屏”缓冲区中完成所有绘制操作,待...

    Java双缓冲技术.pdf

    在Swing应用程序中,我们可以通过重写update()和paint()方法,并使用Graphics对象在一个BufferedImage对象上进行绘制,来实现双缓冲技术。这种方法可以提升用户体验,特别是在需要快速更新界面的应用中,如动画和...

    Java中Graphics的paint和repaint方法.pdf

    而`paint`和`repaint`方法则是Java GUI编程中与图形更新紧密相关的两个关键方法。 `paint`方法是一个受保护的抽象方法,通常由Java的组件类(如JComponent或Component)定义。当需要对组件进行实际的绘图操作时,...

    飞机大战Java版javaSwing

    综上所述,"飞机大战Java版Java Swing"是一个结合了Java基础、GUI编程、面向对象设计、事件处理、多线程以及资源管理等多个编程技术的综合实践项目。通过学习和实现这样的游戏,开发者可以深入理解Java Swing的特性...

    《java+swing图形界面开发与案例详解》源代码

    总的来说,这个"《java+swing图形界面开发与案例详解》源代码"资源提供了全面的学习材料,涵盖了从基础组件使用、事件处理、数据展示到高级主题如线程管理和UI定制。通过深入研究这些源代码,开发者不仅能掌握Java ...

    java调用swing生成柱状图

    Java Swing 是Java GUI(图形用户界面)库的一部分,用于创建桌面应用程序。在这个特定的问题中,我们需要使用Swing来创建一个图形界面,展示用户输入文件中字母的频率统计,以柱状图的形式呈现。以下是实现这一功能...

    Graphics 与 repaint 方法

    "Graphics 与 repaint 方法" Graphics 与 repaint 方法是图形编程中两个非常重要的概念。Graphics 是一个抽象类,提供了基本的绘图方法,如画直线、曲线等,而 repaint 方法则是用于触发图形组件的重绘。 ...

    Java绘制2D图形

    Java绘制2D图形是Java GUI编程中的一个重要部分,它允许开发者在屏幕上创建各种复杂的视觉元素。在本项目中,我们看到一个实现,它在构造的面板上随机绘制了20个图形,这些图形是由`MyShape`抽象类及其多个子类来...

    java swing绘制正弦曲线

    在这个场景中,我们讨论的是如何使用Java Swing来绘制正弦曲线,这对于理解和掌握图形绘制以及数学与编程的结合非常有帮助。下面将详细阐述这个话题。 首先,Java Swing中的`javax.swing.JFrame`是所有窗口的基础,...

    java 2D 用代码画图 用代码画动画

    这些API包括`java.awt`和`javax.swing`包中的类,如`Graphics2D`、`Shape`、`Color`、`Font`等,它们为开发者提供了绘制线条、曲线、填充区域、添加文字以及处理图像的能力。 1. **Graphics2D对象**:这是Java 2D...

    QT update和repaint

    在探讨QT中的`update`与`repaint`方法之前,我们先来理解一下这两个方法的基本概念及其在QT框架中的作用。 ### 基本概念 #### `update` 方法 `update`方法主要用于触发一个控件的重绘过程。当调用`update`时,它会...

    坦克大战JavaSwing 实现_java

    在本文中,我们将深入探讨如何使用Java Swing库来复刻经典的小游戏——坦克大战。Java Swing是Java标准版(Java SE)的一部分,提供了一套丰富的组件和工具,用于构建具有图形用户界面(GUI)的应用程序,包括游戏。...

Global site tag (gtag.js) - Google Analytics