我们很多用Java中的g.drawImage()方法导入图像时,如果我们将当前窗口转变成非当前窗口状态,再从非当前窗口恢复到当前窗口状态,有时,某些绘制好的图像会消失,除非我们重新刷新窗口,显示才会恢复正常。此外,当我们移动窗口或者其他的窗口在上移动的时候,图像会有些闪烁。这是怎么一回事呢?这就要涉及到Canvas中的paint方法的绘图机制了。产生这种现象的主要原因是:
1、由于在显示所绘制的图像时,调用了repaint方法。repaint方法被调用时,需要清除整个背景,然后才调用paint方法显示画面。这样,在清除背景和绘制图像的短暂时间间隔内被用户看见的就是闪烁。
2、由于paint()方法需要进行复杂的计算,图像中包含着多个图形,不同图形的复杂程度及其所需要的绘制时间不同,因此,图像中的各个像素值不能同时产生,使得图形的生成频率低于显示器的刷新频率,从而造成闪烁。
下面两种方法可以明显地消除或减弱闪烁:
1、重载update方法
当AWT接收到Canvas重新绘制的请求时,调用Canvas的update方法。默认情况下,update方法清除Canvas的背景,然后调用paint方法。重载update方法,就可以将以前在paint方法中的绘图代码包含在update方法中,从而避免每次重新绘制时将整个区域清除。
2、双缓冲技术
双缓冲技术在很多动画中被采用。主要原理是创建一幅BufferedImage图像,将每一帧画入图像,然后调用drawImage方法,将整个BufferedImage图像一次画到屏幕上去。这种方法的优点在于大部分绘制是在BufferedImage进行的。将BufferedImage绘制的图像一次绘制到屏幕上。首先通过调用new BufferedImage方法生成合适的缓冲区,然后获得在缓冲区的绘图环境(即Graphics类对象)。
综上所述,我们导入图像的思路是:不直接在paint方法中调用各种绘制方法,而是采用重载update方法及双缓冲技术,生成一个图像的缓冲区,获得该缓冲区中的绘图环境后,将该绘图环境读入内存。paint方法不再负责图像的绘制工作,即paint方法不再装入任何的图像绘制代码。我们在paint方法中,直接调用update方法,在内存缓冲区的绘图环境下进行图像的绘制工作,当所有的图像绘制工作完成后,最后将缓冲区的内容一次性地写入Canvas并在窗口中直接显示出来。这种方法很巧妙地解决了图像丢失和闪烁的问题。
例子代码如下:
package org.lyndon.test;
import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
public class MyCanvas extends Canvas {
private static final long serialVersionUID = 1L;
// 窗体的宽与高
public static final int WIDTH = 480;
public static final int HEIGHT = 480;
private Image screen = createImage(WIDTH, HEIGHT, true);// 双缓冲
private Graphics graphics = screen.getGraphics();
private Image resultImage;
/**
* 生成一个BufferImage
* 生成一个BufferImage BufferImage是Image的子类,左上角坐标都为 (0, 0)
* 第三个参数是代码Image图形类型,分为14种,以位数又分为1,2或4位
*
* @param width
* @param height
* @param flag
* @return
*/
final static public BufferedImage createImage(int width, int height,
boolean flag) {
if (flag) {
return new BufferedImage(width, height, 2);
} else {
return new BufferedImage(width, height, 1);
}
}
public MyCanvas() {
// 设定初始构造时面板大小
setPreferredSize(new Dimension(WIDTH, HEIGHT));
// 初始导入一张图片
ImageIcon icon = new ImageIcon("image/floor.gif");
resultImage = icon.getImage();
}
//
@Override
public void update(Graphics g) {
graphics.drawImage(resultImage, 0, 0, this);
g.drawImage(screen, 0, 0, null);// 最后个参数一定要用null,这样可以防止drawImage调用update方法
g.dispose();
}
public void paint(Graphics g) {
update(g);//我们在paint方法中,直接调用update方法
}
}
分享到:
相关推荐
总结来说,Java双缓冲技术是解决屏幕闪烁问题的关键。通过在内存中创建一个额外的缓冲区,可以先在缓冲区中完成所有绘制,然后再一次性将缓冲区内容绘制到屏幕上,从而避免了频繁的屏幕刷新,显著提升了动画的视觉...
Java双缓冲技术 Java双缓冲技术是计算机动画处理中的传统技术,广泛应用于Java游戏编程和多媒体动画处理中。该技术的主要作用是消除屏幕闪烁,以提高动画的流畅度和用户体验。 Java双缓冲技术的原理是将屏幕分为...
Java双缓冲技术是一种提高图形界面性能的策略,尤其在绘制复杂的UI组件时,能有效避免闪烁现象,提供平滑的视觉体验。双缓冲的核心思想是将屏幕上的绘图操作先在一个临时缓冲区进行,待全部操作完成后再一次性将缓冲...
Java双缓冲技术是一种图形渲染优化策略,主要用于提高GUI(图形用户界面)的性能和减少屏幕闪烁,提升用户体验。在Java中,它主要应用于Swing和JavaFX等图形库。本教程将深入探讨Java双缓冲技术的原理,并通过实例...
### Java 双缓冲技术详解与实例 #### 一、引言 在Java图形用户界面(GUI)编程中,经常会遇到由于频繁更新屏幕显示而导致的视觉闪烁问题,这不仅影响用户体验,还会降低应用程序的整体质量。为了解决这一问题,...
Java 双缓冲技术详解 Java 双缓uffer 技术是 Java 游戏编程和多媒体动画处理中的重要技术之一。它可以解决屏幕闪烁的问题,使得屏幕显示更加流畅。下面我们将详细介绍 Java 双缓存技术的原理和实现方法。 一、问题...
### Java双缓冲技术详解 #### 一、双缓冲技术简介 在Java图形界面编程中,双缓冲技术是一种常用的提高绘制效率的技术。它通过减少屏幕闪烁和提高绘制速度来提升用户体验。双缓冲技术的核心思想是在内存中创建一个...
在深入探讨Java双缓冲技术之前,首先需要对双缓冲技术有一个基本的理解。双缓冲技术是一种常见的图形渲染技术,用于减少或消除在屏幕上绘制图形时出现的闪烁现象,特别适用于需要频繁更新画面的应用程序,例如动画和...
### Java双缓冲消除闪烁 #### 一、问题的引入与分析 在进行Java游戏开发或者多媒体动画处理时,经常会遇到屏幕闪烁的问题。这种现象不仅影响视觉体验,还可能降低应用程序的专业性和用户满意度。屏幕闪烁主要发生...
在计算机图形学中,双缓冲技术是一种优化图形绘制的方法,特别是在动态游戏或者实时渲染场景中,它可以显著减少图像闪烁,提高用户体验。本篇文章将深入探讨如何使用Java语言来实现一个带双缓冲绘图的俄罗斯方块游戏...
总结一下,双缓冲技术在Java中的应用可以显著提升GUI程序的画图性能和用户体验,防止画面闪烁,提供流畅的动画效果。通过重写`paintComponent`方法和利用`Graphics2D`对象,开发者可以实现自定义的画图功能,创建出...
这样,每次窗口需要重绘时,都会自动应用双缓冲技术。 此外,Java Swing提供了更好的绘图组件JComponent,它的 paintComponent 方法已经内置了双缓冲机制,所以如果你使用Swing,无需手动实现双缓冲,只需重写`...
双缓冲技术是计算机图形学中一种优化显示更新的技术,尤其在游戏开发和用户界面设计中广泛应用。它旨在解决屏幕闪烁和图像撕裂问题,提供更流畅的视觉体验。本教程结合源码,将深入讲解双缓冲的工作原理及其应用。 ...
在这个名为"JAVA人物动画.rar"的压缩包中,我们重点探讨的是如何利用Java来实现生动的人物动画,特别是针对"java画人像"、"java人物动画"、"动漫人物java"和"双缓冲"这些标签所涉及的技术。 首先,让我们深入理解...
标题中的“利用双缓冲做的时钟程序”是指在编程中使用了双缓冲技术来实现一个显示实时时间的程序。双缓冲是一种图形渲染...通过深入学习和理解这些文件,开发者可以更好地掌握Java图形界面编程以及双缓冲技术的使用。
在Java编程中,尤其是在开发图形用户界面(GUI)或游戏时,双缓冲技术尤其重要。 在Java中,图形绘制主要通过Java AWT(Abstract Window Toolkit)和Swing库来实现。这些库提供了丰富的API,支持文字处理、图形绘制...
以最简单明了的代码结构来阐述双缓冲技术的核心本质,最巧妙的设计在于利用update将双缓冲部分与绘图功能部分相分离,代码虽短,却蕴含丰富的Java设计思想和设计模式,特供免费下载分享,供大家一起学习,共同进步,...
总结起来,1.0.1版俄罗斯方块通过双缓冲绘图技术实现了更流畅的游戏体验,展示了Java在游戏开发领域的应用潜力。同时,开放源码的做法为学习者提供了实践和学习的平台,有助于培养新一代的编程爱好者。无论是从游戏...
为了解决这个问题,双缓冲技术应运而生。 双缓冲的工作原理如下: 1. 创建两个缓冲区:一个前端缓冲区和一个后端缓冲区。前端缓冲区是屏幕实际显示的内容,而后端缓冲区则用于绘制新图像。 2. 当需要更新图像时,...