`
歆渊
  • 浏览: 307822 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

蹩脚的AWT/SWING GIF显示

阅读更多
很早就知道AWT/SWING组件可以直接通过 Graphics.drawImage() 来显示 GIF 动画, 但是一直不太做界面程序, 也就没有仔细用过. 现在做 WoW Traverser, 因为修改是异步提交到服务器, 所以有必要对正在提交的更改进行界面提示, 打算做个黄色alpha混和的渐变闪动效果来实现, 于是第一反应是做一个透明度不断变化的纯黄色GIF, 画到界面上去. 但是用GIMP总是做出来效果不对, 于是想干脆自己写程序实现, 反正就是加个黄色的混和, 利用AWT显示GIF相同的机制, 效率和稳定性应该也不会差. 最后花了一天时间研究AWT的动画机制. 虽然也了解了一些原本不知道的细节, 但是结果还是让我很失望, 原来drawImage时就是把当前Component注册为该图片的ImageObserver, 这样GIF的下一帧到了需要显示的时间时, 通过 imageUpdated() 通知这个组件, 最终是在 java.awt.Component.imageUpdated() 中处理这个问题. 令人非常失望的是, Java都到了1.5了, AWT中这个地方的处理还是那么蹩脚, 它只是检查了一下更新频率有没有超过系统规定的上限, 只要没超过, 那么它就对Component发一个完全的repaint()请求, 甚至都没有去计算该图片的覆盖区域, 设置一个Clip区域以减少不必要的绘图操作. 更甚者, 即使之后你不再显示这个GIF了, AWT也不会自动从这个『曾经』显示的图片的ImageObserver列表中去掉这个Component, 最终导致的结果, 就是即使不再显示那个GIF, 这个Component还是会以那个GIF的刷新频率不断的毫无必要的去repaint() !! 这不但蹩脚, 简直都有点龌龊. 而且费了半天劲, 连手工去取消ImageObserver的接口都没有找到, 也就是说: 如果不是永久性的显示一个GIF, 千万不要通过java.awt.Toolkit.createImage() 构造 GIF 的 java.awt.Image对象然后往你自己的Component上画, 否则这个GIF图片将长时间占用内存以及 ImageFetcher 线程的CPU资源, 同时耗费CPU时间和GUI资源用来丝毫没有必要的反复repaint你的Component.
分享到:
评论
2 楼 lattimore 2007-08-06  
写的满详细的 分析得很透

要是能给点具体的解决方案就好了(好贪心)
:)
1 楼 lattimore 2007-08-06  
写的不错
不过要是提供点好的解决方案就好了。。。。。

呵呵
  lattimore

相关推荐

    使用java的AWT或者swing来做任务栏菜单

    在Java编程环境中,AWT(Abstract Window Toolkit)和Swing是两个重要的图形用户界面(GUI)库,它们允许开发者创建丰富的桌面应用程序。本篇将详细探讨如何使用Java的AWT和Swing来实现任务栏菜单的功能,这在很多...

    Image中显示动态图片Gif

    例如,在Java中,我们可以使用Java AWT或Swing库中的`javax.imageio.ImageIO`类来读取GIF文件,并将其显示在一个`JLabel`组件上,通过设置组件的`Icon`属性。而在Android开发中,可以利用`Glide`或`Picasso`这样的...

    java Swing读取图片

    当我们需要在Swing应用中展示图片时,可以利用特定的方法来读取并显示图像。本篇文章将详细讲解如何在Java Swing中读取和显示图片,以及与之相关的知识点。 首先,我们需要了解Java中的图像处理类。`java.awt.Image...

    Java动画图标源码(显示GIF图像)

    2. **ImageIcon类**:AWT中的ImageIcon类是用于在组件上显示图像的类,它可以处理各种格式的图片,包括GIF。但是,ImageIcon默认不支持动画GIF,它只能显示静态的GIF图像。 3. **Java GIF动画处理**:由于Java标准...

    Jav动画图标源码(显示GIF图像)

    在Java编程中,显示GIF图像,特别是动态GIF,是一项常见的需求,因为它们常用于创建生动的用户界面。这个资源包"Jav动画图标源码(显示GIF图像)"提供了一种方法来实现这一功能。让我们深入探讨Java中显示GIF图像的...

    显示gif图像

    在Java编程环境中,可以使用Apache Commons IO库或者Java AWT/Swing库来处理GIF图像。例如,使用Swing的`JLabel`和`javax.imageio.ImageIO`可以创建一个显示GIF的窗口: ```java import javax.swing.*; import java....

    基于Java的Jav动画图标源码(显示GIF图像).zip

    然而,标准的Java AWT和Swing库也提供了基本的GIF支持。在Swing中,我们可以使用`javax.swing.ImageIcon`类来加载和显示GIF图片,但请注意,它并不支持动画。为了显示GIF动画,我们需要使用第三方库,如Java ImageIO...

    基于Java的实例源码-Jav动画图标源码(显示GIF图像).zip

    在这个实例中,可能使用了`javax.swing.JFrame`作为主窗口,并可能使用了`javax.swing.JLabel`或`javax.swing.ImageIcon`来显示GIF图像。 2. **GIFImageIcon**: Java标准库并没有内置支持GIF动画播放的功能,但可以...

    Jav动画图标源码(显示GIF图像).rar

    它的API允许开发者轻松地将GIF图片加载到内存中,并在 Swing 或 AWT 组件上显示。例如,你可以创建一个`GIFImage`对象,然后将其绘制到`JLabel`或者`JPanel`上,实现动态显示的效果。 以下是一个基本的示例,展示了...

    JAVA教学(关于swing的使用)

    Swing是Java平台提供的用于构建桌面应用程序GUI(图形用户界面)的一种工具包,它作为AWT(Abstract Window Toolkit)的扩展,提供了更为丰富且强大的GUI组件集合。Swing组件完全由Java语言编写,与操作系统无关,被...

    基于java的Jav动画图标源码(显示GIF图像).zip

    3. **AWT或Swing组件**:Java AWT和Swing提供了图形用户界面的构建块,可以创建组件来显示图片。开发者可能会创建一个自定义组件,覆盖`paintComponent`方法,每次重绘时根据当前帧来绘制对应的图像。 为了在实际...

    java实现gif动画效果(java显示动态图片)

    本示例主要展示了如何在Java环境下显示动态图片,特别是GIF格式的动画。以下将详细介绍实现这一功能的关键步骤和相关知识点: 1. **使用`javax.swing.JFrame`作为基础窗口** `Donttai`类继承自`javax.swing.JFrame...

    java源码:Jav动画图标源码(显示GIF图像).rar

    一个常用的库是Java Advanced Imaging (JAI) API,但这个库可能比较庞大,对于只需要简单GIF显示的应用来说,可能会显得过于复杂。另一个常见的选择是使用像`gif4j`或`ImageIO-ext`这样的轻量级库。 在这个特定的...

    Jav动画图标源码(显示GIF图像).7z

    Java标准库并不直接支持GIF动画播放,但通过一些第三方库如`javax.swing.ImageIcon`、`java.awt.Toolkit`或开源库如`Java Advanced Imaging (JAI)`、`JSwing Animation Library (JSwingAL)`、`TwelveMonkeys ...

    基于Java的实例开发源码-Jav动画图标源码(显示GIF图像).zip

    综上所述,这个基于Java的实例开发源码展示了如何使用Java Swing库来显示和处理GIF动画图像,对于Java GUI开发者来说是一个宝贵的学习材料。通过理解和实践这段代码,开发者可以掌握在Java应用程序中集成动态GIF图像...

    java-gif图像与图形处理

    - 对于静态GIF,可以使用`ImageIO`读取并用`javax.swing.ImageIcon`显示在GUI组件上。 - 动画GIF的处理较为复杂,需要借助第三方库。例如,`gif4j`提供了`GifImage`类,可以获取动画的帧信息,并逐帧显示。 4. **...

    jindutiao.rar_gif_gif jinduti_java gif_java 进度条_进度条 java

    在Java中,可以使用`javax.imageio`和`java.awt.image`等包来处理和显示GIF图片。开发者可以利用这些API加载GIF文件,并将其作为进度条的背景,通过改变进度条覆盖部分的宽度来模拟进度的增加。 在Java中实现GIF...

    Java Swing 组件全演示源代码.zip

    Java Swing 是Java GUI(图形用户界面)开发的一个重要库,它是Java AWT(Abstract Window Toolkit)的扩展,提供了更为丰富的组件和更灵活的布局管理器。这个“Java Swing 组件全演示源代码.zip”文件包含了对Java ...

    java编写的类似文本编辑器的代码

    /*文件内容显示区*/ JTextArea[] fileTextAreas=new JTextArea[10];//文件区 JTextArea concloseTextArea=new JTextArea(); //控制台信息 JScrollPane [] fileScrollPanes=new JScrollPane[10];//文件视图 ...

Global site tag (gtag.js) - Google Analytics