`

Java SWT Image 图像 —— 动态显示 Snippet141

 
阅读更多

Snippet141 能够动态打开一个GIF文件。

 

public class Snippet141 {
	static Display display;
	static Shell shell;
	static GC shellGC;
	static Color shellBackground;
	static ImageLoader loader;
	static ImageData[] imageDataArray;
	static Thread animateThread;
	static Image image;
	static final boolean useGIFBackground = false;
	
	public static void main(String[] args) {
		display = new Display();
		shell = new Shell(display);
		shell.setSize(300, 300);
		shell.open();
		shellGC = new GC(shell);
		shellBackground = shell.getBackground();

		FileDialog dialog = new FileDialog(shell);
		dialog.setFilterExtensions(new String[] {"*.gif"});
		String fileName = dialog.open();
		if (fileName != null) {
			loader = new ImageLoader();
			try {
				imageDataArray = loader.load(fileName);
				if (imageDataArray.length > 1) {
					animateThread = new Thread("Animation") {
						public void run() {
							/* Create an off-screen image to draw on, and fill it with the shell background. */
							Image offScreenImage = new Image(display, loader.logicalScreenWidth, loader.logicalScreenHeight);
							GC offScreenImageGC = new GC(offScreenImage);
							offScreenImageGC.setBackground(shellBackground);
							offScreenImageGC.fillRectangle(0, 0, loader.logicalScreenWidth, loader.logicalScreenHeight);
								
							try {
								/* Create the first image and draw it on the off-screen image. */
								int imageDataIndex = 0;	
								ImageData imageData = imageDataArray[imageDataIndex];
								if (image != null && !image.isDisposed()) image.dispose();
								image = new Image(display, imageData);
								offScreenImageGC.drawImage(
									image,
									0,
									0,
									imageData.width,
									imageData.height,
									imageData.x,
									imageData.y,
									imageData.width,
									imageData.height);

								/* Now loop through the images, creating and drawing each one
								 * on the off-screen image before drawing it on the shell. */
								int repeatCount = loader.repeatCount;
								while (loader.repeatCount == 0 || repeatCount > 0) {
									switch (imageData.disposalMethod) {
									case SWT.DM_FILL_BACKGROUND:
										/* Fill with the background color before drawing. */
										Color bgColor = null;
										if (useGIFBackground && loader.backgroundPixel != -1) {
											bgColor = new Color(display, imageData.palette.getRGB(loader.backgroundPixel));
										}
										offScreenImageGC.setBackground(bgColor != null ? bgColor : shellBackground);
										offScreenImageGC.fillRectangle(imageData.x, imageData.y, imageData.width, imageData.height);
										if (bgColor != null) bgColor.dispose();
										break;
									case SWT.DM_FILL_PREVIOUS:
										/* Restore the previous image before drawing. */
										offScreenImageGC.drawImage(
											image,
											0,
											0,
											imageData.width,
											imageData.height,
											imageData.x,
											imageData.y,
											imageData.width,
											imageData.height);
										break;
									}
														
									imageDataIndex = (imageDataIndex + 1) % imageDataArray.length;
									imageData = imageDataArray[imageDataIndex];
									image.dispose();
									image = new Image(display, imageData);
									offScreenImageGC.drawImage(
										image,
										0,
										0,
										imageData.width,
										imageData.height,
										imageData.x,
										imageData.y,
										imageData.width,
										imageData.height);
									
									/* Draw the off-screen image to the shell. */
									shellGC.drawImage(offScreenImage, 0, 0);
									
									/* Sleep for the specified delay time (adding commonly-used slow-down fudge factors). */
									try {
										int ms = imageData.delayTime * 10;
										if (ms < 20) ms += 30;
										if (ms < 30) ms += 10;
										Thread.sleep(ms);
									} catch (InterruptedException e) {
									}
									
									/* If we have just drawn the last image, decrement the repeat count and start again. */
									if (imageDataIndex == imageDataArray.length - 1) repeatCount--;
								}
							} catch (SWTException ex) {
								System.out.println("There was an error animating the GIF");
							} finally {
								if (offScreenImage != null && !offScreenImage.isDisposed()) offScreenImage.dispose();
								if (offScreenImageGC != null && !offScreenImageGC.isDisposed()) offScreenImageGC.dispose();
								if (image != null && !image.isDisposed()) image.dispose();
							}
						}
					};
					animateThread.setDaemon(true);
					animateThread.start();
				}
			} catch (SWTException ex) {
				System.out.println("There was an error loading the GIF");
			}
		}

		while (!shell.isDisposed()) {
			if (!display.readAndDispatch()) display.sleep();
		}
		display.dispose();
	}
}

 

分享到:
评论

相关推荐

    SnippetEditor

    **SnippetEditor:强大的代码片段管理工具** SnippetEditor是一款专为程序员设计的代码片段管理软件,它支持多种编程语言,如C#,以及J#, VB.NET, XML, HTML等。这款工具使得开发人员能够轻松地创建、编辑和修改...

    DotNet程序员必备的10种工具(附加使用说明)下

    FxCop:用于监视代码的——代码警察 Snippet Compiler:小型代码段编译工具 两个不同的转换器工具,ASP.NET 版本转换器(Version Switcher)和 Visual Studio .NET 项目转换器(Project Converter) Regulator:...

    DotNet程序员必备的10种工具(附加使用说明)上

    FxCop:用于监视代码的——代码警察 Snippet Compiler:小型代码段编译工具 两个不同的转换器工具,ASP.NET 版本转换器(Version Switcher)和 Visual Studio .NET 项目转换器(Project Converter) Regulator:...

    snippet辅助设计

    Visual Studio (VS) 提供了一项强大的功能——Code Snippets(代码片段),可以帮助开发者快速输入常用或复杂的代码结构,从而节省编写时间并减少出错的可能性。"snippet辅助设计" 主题正是围绕如何利用VS中的Code ...

    SnippetEditor编辑使用图文教程

    ### SnippetEditor编辑使用图文教程 #### 一、SnippetEditor简介与下载 SnippetEditor是一款用于管理及编辑代码片段的强大工具,适用于多种编程语言环境。它能够帮助开发者高效地组织、管理和使用代码片段,极大地...

    C# Snippet.zip

    使用这些代码片段,开发者可以快速构建WPF应用中的依赖属性(如`attribute.snippet`可能涉及的),实现高效的单例模式(如`shared.snippet`),以及处理各种常见的类定义和方法。将它们导入到Visual Studio或其他...

    Snippet Editor 代码段修改工具2.0

    "Snippet Editor 代码段修改工具2.0"是一款专为Visual Studio用户设计的实用工具,支持VS2005、VS2008以及VS2010版本。这款工具的核心功能是帮助开发者管理和编辑代码片段,提升编程效率。代码片段(Code Snippets)...

    Snippet Editor 代码段编辑工具

    "Snippet Editor"是一款专为编程人员设计的代码段编辑工具,它以其高效和易用性赢得了用户的高度评价。这款工具的出现旨在优化编程工作流程,提高程序员的工作效率,减少重复编码的时间消耗。通过集中管理和编辑常用...

    C#.NET自定义的几个Snippet

    这对于大型类或模块特别有用,可以隐藏不相关的部分,只显示当前关注的代码。 这些自定义的代码片段是提升开发效率的有效手段,它们根据开发者的具体需求和习惯定制,使得编写代码更加便捷和高效。通过熟练使用这些...

    Snippet Editor

    SnippetEditor,支持C#与其它语言的代码段包括J#\VB.NET\xml\html等的创建、编辑修改等,不知道为什么, vs2008 默认没有带代码段编辑器,一个非常好的编辑器,可以对Visual2005和visual2008 代码段进行编辑的工具,...

    Snippet Compiler Live 2008 Ultimate Edition for Developers (Alpha)

    "Snippet Compiler Live 2008 Ultimate Edition for Developers (Alpha)" 是一款专为开发者设计的C# 3.0代码片段编译器。这个工具允许程序员快速地编写、测试和执行C#代码片段,而无需启动整个Visual Studio或其他...

    visual studio code snippet editor

    "Visual Studio Code snippet editor" 提到的是一个专门用于创建和管理VS Code代码片段(snippets)的工具。代码片段是预定义的代码模板,可以帮助开发者快速输入常见的代码结构,提高编程效率。 在VS Code中,用户...

    SnippetEditor 2.1

    "SnippetEditor 2.1" 是一款专为Visual Studio 2008设计的代码片段编辑工具,旨在弥补原生IDE中未内置代码段编辑功能的不足。代码片段在编程中扮演着重要的角色,它们是预定义的代码块,可以方便开发者快速插入常用...

    Snippet Compiler 3.0.2 老朽痴拙汉化版(代码段编译器)

    Snippet Compiler3.0.2 老朽痴拙汉化版是一个免费的 .NET 编译和开发工具基于Windows 的小型应用程序,你可以通过它来编写、编译和运行代码。在下载Snippet Compiler后,无需进行安装,直接运行可执行文件即可。在第...

    高级java笔试题-snippet:各种语言的代码片段和一些文档

    高级java笔试题 Snippets The code snippets of all kinds of languages and some docs. () 、、、、、、、、、、、、、、、、 其它一些网站 前端开发 DOCS RESTfull API 微服务(Micro-Service) | | 点击 Other | | ...

    支持windows live writer的CodeSnippet

    支持windows live writer的CodeSnippet, 对博客文章可进行代码块,代码高亮设置。支持简体中文

    C# to Java 代码转换工具

    一个很强大的工具, 能将c#代码片段、文件甚至工程直接转换成java代码,并能彻底解决外部引用的DLL问题,最强的是支持c#工程的直接转换,生成的Java代码质量也很不错。软件已破解,去除了未注册版最多只能转换1000行的...

    Snippet Compiler

    Snippet Compiler 是一个基于 Windows 的小型应用程序,你可以通过它来编写、编译和运行代码。如果你具有较小的代码段,并且你不想创建完整的 Visual Studio .NET 项目(以及该项目附带的所有文件),则该工具会很...

Global site tag (gtag.js) - Google Analytics