﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-winlinglin-随笔分类-J2ME</title><link>http://www.blogjava.net/winlinglin/category/40133.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 07 Jun 2009 17:15:55 GMT</lastBuildDate><pubDate>Sun, 07 Jun 2009 17:15:55 GMT</pubDate><ttl>60</ttl><item><title>MIDlet的生命周期</title><link>http://www.blogjava.net/winlinglin/archive/2009/06/07/280457.html</link><dc:creator>winlinglin</dc:creator><author>winlinglin</author><pubDate>Sun, 07 Jun 2009 11:10:00 GMT</pubDate><guid>http://www.blogjava.net/winlinglin/archive/2009/06/07/280457.html</guid><wfw:comment>http://www.blogjava.net/winlinglin/comments/280457.html</wfw:comment><comments>http://www.blogjava.net/winlinglin/archive/2009/06/07/280457.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/winlinglin/comments/commentRss/280457.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/winlinglin/services/trackbacks/280457.html</trackback:ping><description><![CDATA[&nbsp;
<p>MIDlet<span style="font-family: 宋体">的生命周期：</span></p>
<p><span style="font-family: 宋体">当</span>JAM<span style="font-family: 宋体">需要改变</span>MIDlet<span style="font-family: 宋体">状态的时候，需要调用对应方法，在方法调用成功以后，</span>MIDlet<span style="font-family: 宋体">的状态最终才会发生改变。<br />
<img height="153" alt="" src="http://www.blogjava.net/images/blogjava_net/winlinglin/MIDlet1.png" width="461" border="0" /><br />
</span></p>
<p><span style="font-family: 宋体">除了</span>JAM<span style="font-family: 宋体">可以改变</span>MIDlet<span style="font-family: 宋体">的状态，</span>MIDlet<span style="font-family: 宋体">自身也可以调用一些方法，改变自身的状态。然后再通过</span>Notify<span style="font-family: 宋体">的系列函数通知</span>JAM<span style="font-family: 宋体">，</span>MIDlet<span style="font-family: 宋体">的状态需要进行改变。<br />
</span></p>
<p><span style="font-family: 宋体"><img height="145" alt="" src="http://www.blogjava.net/images/blogjava_net/winlinglin/MIDlet2.png" width="430" border="0" /><br />
一个</span>MIDlet<span style="font-family: 宋体">对象有三个状态，分别是：运行状态、暂停状态、终止状态。</span></p>
<p>JAM<span style="font-family: 宋体">通过调用</span>startApp()<span style="font-family: 宋体">函数使</span>MIDlet<span style="font-family: 宋体">进入到开始状态，也就是说把我们的游戏进入开始状态；</span>JAM<span style="font-family: 宋体">通过调用</span>pauseApp()<span style="font-family: 宋体">使</span>MIDlet<span style="font-family: 宋体">进入暂停状态；通过调用</span>destroyApp ()<span style="font-family: 宋体">使之停止掉。</span></p>
<p>MIDlet<span style="font-family: 宋体">不允许直接调用</span>System.exit()<span style="font-family: 宋体">或</span>Runtime.exit()<span style="font-family: 宋体">来结束</span>MIDlet<span style="font-family: 宋体">的生命周期，这种方式会引起</span>Java<span style="font-family: 宋体">的安全异常。当</span>MIDlet<span style="font-family: 宋体">需要自己结束生命周期的时候，首先调用</span>destroyApp()<span style="font-family: 宋体">，然后通过</span>notifyDestroyed()<span style="font-family: 宋体">通知</span>JAM<span style="font-family: 宋体">结束</span>MIDlet<span style="font-family: 宋体">的运行。</span></p>
<p>MIDlet<span style="font-family: 宋体">类的其他功能：</span></p>
<p style="background: white; text-align: left" align="left"><span style="font-family: 宋体">除了生命周期相关的操作以外，</span>MIDlet<span style="font-family: 宋体">类中还提供了其他一些系统级的操作，例如：</span></p>
<p style="background: white; text-align: left; tab-stops: list 41.95pt" align="left">&nbsp;getAppProperty<span style="font-family: 宋体">——读取</span>jad<span style="font-family: 宋体">文件中属性的设置。说明：</span>jad<span style="font-family: 宋体">文件是</span>J2ME<span style="font-family: 宋体">程序发布时的描述文件，在其中可以存储一些常用的属性信息。</span></p>
<p style="background: white; text-indent: 5.25pt; text-align: left; tab-stops: list 41.95pt" align="left">platformRequest(String URL)<span style="font-family: 宋体">——平台请求方法，该方法需要</span>MIDP2.0<span style="font-family: 宋体">，例如可以实现如下两个系统功能：</span></p>
<p style="background: white; text-indent: 5.25pt; text-align: left; tab-stops: list 41.95pt" align="left">1.<span style="font-family: 宋体">拨打电话实现：</span></p>
<p style="background: white; margin-left: 41.95pt; text-align: left" align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; platformRequest(&#8220;tel:1860&#8221;);</p>
<p style="background: white; text-indent: 5.25pt; text-align: left; tab-stops: list 62.95pt" align="left">2.<span style="font-family: 宋体">打开指定网页</span></p>
<p style="background: white; margin-left: 41.95pt; text-align: left" align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; platformRequest(&#8220;http://www.test.com&#8221;);</p>
<img src ="http://www.blogjava.net/winlinglin/aggbug/280457.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/winlinglin/" target="_blank">winlinglin</a> 2009-06-07 19:10 <a href="http://www.blogjava.net/winlinglin/archive/2009/06/07/280457.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2ME的体系结构</title><link>http://www.blogjava.net/winlinglin/archive/2009/06/07/280456.html</link><dc:creator>winlinglin</dc:creator><author>winlinglin</author><pubDate>Sun, 07 Jun 2009 11:05:00 GMT</pubDate><guid>http://www.blogjava.net/winlinglin/archive/2009/06/07/280456.html</guid><wfw:comment>http://www.blogjava.net/winlinglin/comments/280456.html</wfw:comment><comments>http://www.blogjava.net/winlinglin/archive/2009/06/07/280456.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/winlinglin/comments/commentRss/280456.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/winlinglin/services/trackbacks/280456.html</trackback:ping><description><![CDATA[&nbsp;
<p style="background: white; line-height: 180%; text-align: left" align="left"><span style="font-size: 9pt; color: black; line-height: 180%; font-family: 宋体">在J2ME的两个基本配置CDC和CLDC是按照如下的标准进行区分的。<br />
CLDC：</span></p>
<p style="background: white; line-height: 180%; text-align: left" align="left"><span style="font-size: 9pt; color: black; line-height: 180%; font-family: 宋体">512 KB </span><span style="font-size: 9pt; color: black; line-height: 180%; font-family: 宋体">以下内存 <br />
有限能源供应（通常使用电池） <br />
有限或非持续网络连接 <br />
简单的用户界面<br />
16位或者32位的处理器<br />
CDC：</span></p>
<p style="background: white; line-height: 180%; text-align: left" align="left"><span style="font-size: 9pt; color: black; line-height: 180%; font-family: 宋体">2M</span><span style="font-size: 9pt; color: black; line-height: 180%; font-family: 宋体">以上内存<br />
具有网络连接能力，通常为无线网络 <br />
需要实现java虚拟机规范的全部功能<br />
32位或者64位的处理器<br />
<br />
&nbsp;&nbsp;&nbsp; 从上述的要求中我们不难看出CLDC主要针对那些资源非常受限的设备比如手机、PDA、双工寻呼机等。而CDC主要面对那些家电产品，比如机顶盒、汽车导航系统等。<br />
&nbsp;&nbsp;&nbsp;&nbsp;下面我们来看看J2ME平台的结构图：<br />
<img height="279" alt="" src="http://www.blogjava.net/images/blogjava_net/winlinglin/CLDC.png" width="270" border="0" /></span></p>
<span style="font-size: 9pt; color: black; font-family: 宋体"><br />
&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9pt; color: black; font-family: 宋体">我们可以看出J2ME的核心是Configuration，在它里面定义了java的虚拟机，通过它来和底层的Host OS打交道。Profile提供了访问设备的IO或者图形界面的能力，这样Configuration和Profile共同构成了J2ME的运行环境。比如CLCD/MIDP可以提供给你开发手机程序的环境。在Profile之上针对不同的设备还可以提供不同的可选开发包。<br />
&nbsp;&nbsp;&nbsp;&nbsp;由于CLDC/MIDP大家都比较熟悉了，我们下面主要介绍一下基于CDC的J2ME系统构架，同样还是看它的系统图：<br />
<img height="366" alt="" src="http://www.blogjava.net/images/blogjava_net/winlinglin/cdc.png" width="280" border="0" /><br />
<br />
&nbsp;&nbsp;&nbsp; 基于CDC的设备可以支持全部的Java2语言规范和Java虚拟机规范，它是CLDC的超集并且远大于CLDC,因此基于CLDC的程序是可以无修改的移植到基于CDC的设备的。Foundation Profile是对CDC进行扩展的Profile，但是他并没有提供GUI的开发包，GUI是在Personal Basic Profile中进行定义的，它提供了AWT的一个子集给开发人员。它还提供了Xlet应用程序模式——针对java TV。Personal Profile是Personal Basci Profile的超集。他提供了对Applet的支持，丰富了AWT的组件，添加了java.awt.datatransfer包。</span>
<img src ="http://www.blogjava.net/winlinglin/aggbug/280456.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/winlinglin/" target="_blank">winlinglin</a> 2009-06-07 19:05 <a href="http://www.blogjava.net/winlinglin/archive/2009/06/07/280456.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基本概念</title><link>http://www.blogjava.net/winlinglin/archive/2009/06/07/280455.html</link><dc:creator>winlinglin</dc:creator><author>winlinglin</author><pubDate>Sun, 07 Jun 2009 11:01:00 GMT</pubDate><guid>http://www.blogjava.net/winlinglin/archive/2009/06/07/280455.html</guid><wfw:comment>http://www.blogjava.net/winlinglin/comments/280455.html</wfw:comment><comments>http://www.blogjava.net/winlinglin/archive/2009/06/07/280455.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/winlinglin/comments/commentRss/280455.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/winlinglin/services/trackbacks/280455.html</trackback:ping><description><![CDATA[<p>JAM<br />
&nbsp;JAM（Java应用管理器）。Java应用管理器是管理Java 应用的机制。JAM的规范主要由目标环境决定，与Java规范无关。<br />
&nbsp;JAM管理应用在手机上的生命周期，其功能包括：鉴定概要、解析JAD（应用描述文件）、应用安装、应用更新、应用列表、应用执行。&nbsp; &nbsp;<br />
&nbsp;JAM还管理JAR文件和JAD文件。JAR是Java应用档案文件，JAD是Java应用描述文件。此外，JAM还有管理Java虚拟机的功能。</p>
<p>JAR/JAD<br />
Jad&nbsp; <br />
&nbsp;jad是java应用程序的描述性文件，它所表述的内容很多，比如游戏提供商、游戏的版本号、游戏文件的大小等等，当然还有jar的地址。<br />
JAD描述文件必须提供如下属性：<br />
MIDlet-Name<br />
MIDlet-Version<br />
MIDlet-Vendor<br />
MIDlet-Jar-URL<br />
MIDlet-Jar-Size<br />
Jar<br />
&nbsp;Jar是一个压缩的文件，在文件中包含了运行游戏的class代码和资源文件（图片、声音文件等等）。<br />
一个完整的MIDP应用程序是由一个JAD文件(纯文字文件)与JAR(ZIP压缩档)所组成。在手机上安装游戏的时候，手机首先来找到jad文件，通过jad文件来解析jar文件。<br />
也就是说，任何的手机游戏在真机上只需要这两个文件，即jad和jar文件。并非每种装置在安装时都要求同时有JAD与JAR，有些装置只需要JAR即可。<br />
不过，有JAD和没有JAD的J2ME应用程序在安全性上是有差异的。</p>
<p>MF文件<br />
MF文件是配置文件（manifest），用来描述MIDlet Suite的配置，如：名称，版本，开发商等；manifest文件为纯文本文件，文件扩<br />
展名为.mf<br />
manifest必须包含以下属性：<br />
MIDlet-Name<br />
MIDlet-Version<br />
MIDlet-Vendor</p>
<p>MIDlet<br />
一个MIDP应用程序称作MIDlet——MIDP小应用程序，它不能够单独地运行，必须运行在特定的环境之中，或者说运行在一个容器中。可以把这个容器看作是个大的应用程序<br />
，它运行在Java虚拟机之上，但不能完成任何特定的任务，因此需要程序开发者编写代码以完成一项工作。<br />
通过这种形式，程序开发者就从各种运行环境、各种设备中解放出来，只需设计一个MIDlet，就可以在不同的环境上运行。比如不同的厂家、不同型号的手机，只要它支<br />
持J2ME、支持MIDP，就有这样一个容器。<br />
MIDlet中这个容器就是MIDP实现，它以SUN公司发布的CLDC规范和MIDP规范为标准，然后针对设备进行移植，从而提供给所有的MIDlet都一样的容器内部接口。编写MIDP应<br />
用程序的要求就是必须扩展MIDlet类 。<br />
当Java应用管理器将MIDlet装载进来，会生成一个MIDlet对象实例，该对象的生命周期完全由Java应用管理器控制，在需要改变MIDlet对象状态的时候，由Java应用管理<br />
器会调用MIDlet中对应的函数对这个对象进行控制。<span style="font-size: 9pt; color: black; font-family: 宋体"><span style="font-size: 9pt; color: black; font-family: 宋体"><br />
<br />
</span><br />
<br />
</span></p>
<img src ="http://www.blogjava.net/winlinglin/aggbug/280455.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/winlinglin/" target="_blank">winlinglin</a> 2009-06-07 19:01 <a href="http://www.blogjava.net/winlinglin/archive/2009/06/07/280455.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2ME开发环境的配置</title><link>http://www.blogjava.net/winlinglin/archive/2009/06/07/280454.html</link><dc:creator>winlinglin</dc:creator><author>winlinglin</author><pubDate>Sun, 07 Jun 2009 10:57:00 GMT</pubDate><guid>http://www.blogjava.net/winlinglin/archive/2009/06/07/280454.html</guid><wfw:comment>http://www.blogjava.net/winlinglin/comments/280454.html</wfw:comment><comments>http://www.blogjava.net/winlinglin/archive/2009/06/07/280454.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/winlinglin/comments/commentRss/280454.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/winlinglin/services/trackbacks/280454.html</trackback:ping><description><![CDATA[<p>J2ME开发环境的配置</p>
<p>1. JDK&nbsp;<br />
到java.sun.com/j2se&nbsp;下JDK,可以根据需要下载JDK的版本,推荐1.5,1.6.在下载之前,还要填写烦人的个人信息,还要到邮箱拿下载地址...囧一个。<br />
2. WTK<br />
到java.sun.com/j2me&nbsp;下WTK,推荐2.5版本.装之前需要JDK.这个终于不用填个人信息了.呵呵<br />
装完WTK后,有几个文件夹的内容比较重要:<br />
lib\里的是类库,cldcapi21,midpapi21这些基础类能少吗?少了怎么开发啊?<br />
bin\里的是开发时用的工具程序.emulator模拟器,用了它,就能省了买手机的钱了....<br />
docs\是midp文档,经常使用,时时使用,必须使用....<br />
apps\里的是各位天才写的实例demo,懂了后就不是小牛这么简单了....<br />
wtklib\存放J2MEWTK用到的类库和一些资源。<br />
3. IDE<br />
一般人都用eclipse加eclipseME插件。<br />
下载网址是:<br />
eclipse:&nbsp;www.Eclipse.org<br />
eclipseME:&nbsp;www.eclipseme.org<br />
装完后eclipse，记得添加eclipseME插件，接着就是建立一个midlet suite项目来添加设备，搜索WTK目录就可以找到模拟器了。呵呵....</p>
<p>所有工作干完了，歇歇就开始我们的J2ME之旅吧...</p>
<img src ="http://www.blogjava.net/winlinglin/aggbug/280454.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/winlinglin/" target="_blank">winlinglin</a> 2009-06-07 18:57 <a href="http://www.blogjava.net/winlinglin/archive/2009/06/07/280454.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2ME的双缓冲技术（转）</title><link>http://www.blogjava.net/winlinglin/archive/2009/06/07/280448.html</link><dc:creator>winlinglin</dc:creator><author>winlinglin</author><pubDate>Sun, 07 Jun 2009 09:52:00 GMT</pubDate><guid>http://www.blogjava.net/winlinglin/archive/2009/06/07/280448.html</guid><wfw:comment>http://www.blogjava.net/winlinglin/comments/280448.html</wfw:comment><comments>http://www.blogjava.net/winlinglin/archive/2009/06/07/280448.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/winlinglin/comments/commentRss/280448.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/winlinglin/services/trackbacks/280448.html</trackback:ping><description><![CDATA[关于J2ME中<a href="http://www.sunjianyes.cn/Article/tag/%e5%8f%8c%e7%bc%93%e5%86%b2%e6%8a%80%e6%9c%af">双缓冲技术</a>:<br />
双缓冲技术是编写<a href="http://www.sunjianyes.cn/Article/category/mobile-software-development/j2me-development">J2ME</a>游戏程序的关键技术之一。实际上，双缓冲技术是计算机动画的一项传统技术。造成屏幕闪烁的主要原因在于，画面在显示的同时程序又在改变它，于是画面闪烁。
<p>解决办法是在内存中开辟一片区域作为后台画面，程序对它更新、修改，完成后再显示它。这样被显示的图像永远是已经完全画好的图像，程序修改的将不是正在被显示的图像。当然还有其他方法可以解决屏幕闪烁问题，但使用双缓冲技术是一种值得推荐的解决方案。</p>
<p>有些设备本身就支持双缓冲，每次都是先把屏幕重画在<a href="http://www.sunjianyes.cn/Article/tag/%e5%8f%8c%e7%bc%93%e5%86%b2%e6%8a%80%e6%9c%af">缓冲</a>之中，然后再绘制在显示屏幕上，而不是直接绘制在显示屏幕上。可以使用<a href="http://www.sunjianyes.cn/Article/tag/j2me-canvas">Canvas</a>类的isDoubleBuffer方法判断设备是否具有双缓冲。</p>
<p>可变图像可以很容易地用作屏幕外缓冲。改写前面绘制不变图像的代码，将所有的绘制都放在可变图像中，然后一次性地将可变图像绘制到屏幕上去。</p>
<div class="hl-surround">
<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
    <li class="hl-firstline"><span style="color: green">package</span><span style="color: gray"> </span><span style="color: blue">doublebufferdemo</span><span style="color: gray">;</span>
    <li><span style="color: green">import</span><span style="color: gray">&nbsp;</span><span style="color: blue">javax</span><span style="color: gray">.</span><span style="color: blue">microedition</span><span style="color: gray">.</span><span style="color: blue">lcdui</span><span style="color: gray">.*;</span>
    <li><span style="color: green">import</span><span style="color: gray">&nbsp;</span><span style="color: blue">javax</span><span style="color: gray">.</span><span style="color: blue">microedition</span><span style="color: gray">.</span><span style="color: blue">midlet</span><span style="color: gray">.*;</span>
    <li><span style="color: green">import</span><span style="color: gray">&nbsp;</span><span style="color: blue">java</span><span style="color: gray">.</span><span style="color: blue">io</span><span style="color: gray">.*;</span>
    <li><span style="color: green">public</span><span style="color: gray">&nbsp;</span><span style="color: green">class</span><span style="color: gray"> </span><span style="color: blue">ImageCanvas</span><span style="color: gray"> </span><span style="color: green">extends</span><span style="color: gray"> </span><span style="color: blue">Canvas</span>
    <li><span style="color: olive">{</span>
    <li><span style="color: gray">&nbsp;</span>
    <li><span style="color: gray">&nbsp;&nbsp; </span><span style="color: green">private</span><span style="color: gray">&nbsp;</span><span style="color: blue">Image</span><span style="color: gray"> </span><span style="color: blue">buffer</span><span style="color: gray">;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500">//可变图像，作为绘制缓冲</span>
    <li><span style="color: gray">&nbsp;&nbsp; </span><span style="color: green">private</span><span style="color: gray">&nbsp;</span><span style="color: blue">Image</span><span style="color: gray"> </span><span style="color: blue">image</span><span style="color: gray">;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500">//不变图像，用来加载图片文件</span>
    <li><span style="color: gray">&nbsp;&nbsp; </span><span style="color: green">public</span><span style="color: gray">&nbsp;</span><span style="color: blue">ImageCanvas</span><span style="color: olive">()</span>
    <li><span style="color: gray">&nbsp;&nbsp; </span><span style="color: olive">{</span>
    <li><span style="color: gray">&nbsp; &nbsp; &nbsp; </span><span style="color: green">try</span>
    <li><span style="color: gray">&nbsp; &nbsp; &nbsp; </span><span style="color: olive">{</span>
    <li><span style="color: gray">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: blue">image</span><span style="color: gray"> = </span><span style="color: blue">Image</span><span style="color: gray">.</span><span style="color: blue">createImage</span><span style="color: olive">(</span><span style="color: #8b0000">"</span><span style="color: red">/tree.png</span><span style="color: #8b0000">"</span><span style="color: olive">)</span><span style="color: gray">;&nbsp; </span><span style="color: #ffa500">//加载图片文件</span>
    <li><span style="color: gray">&nbsp; &nbsp; &nbsp; </span><span style="color: olive">}</span><span style="color: green">catch</span><span style="color: olive">(</span><span style="color: blue">java</span><span style="color: gray">.</span><span style="color: blue">io</span><span style="color: gray">.</span><span style="color: blue">IOException</span><span style="color: gray">&nbsp;</span><span style="color: blue">e</span><span style="color: olive">)</span>
    <li><span style="color: gray">&nbsp; &nbsp; &nbsp; </span><span style="color: olive">{</span>
    <li><span style="color: gray">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: blue">System</span><span style="color: gray">.</span><span style="color: blue">out</span><span style="color: gray">.</span><span style="color: blue">println</span><span style="color: olive">(</span><span style="color: blue">e</span><span style="color: gray">.</span><span style="color: blue">getMessage</span><span style="color: olive">())</span><span style="color: gray">;&nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500">//处理I/O异常</span>
    <li><span style="color: gray">&nbsp; &nbsp; &nbsp; </span><span style="color: olive">}</span>
    <li><span style="color: gray">&nbsp; &nbsp; &nbsp; </span><span style="color: blue">buffer</span><span style="color: gray"> = </span><span style="color: blue">Image</span><span style="color: gray">.</span><span style="color: blue">createImage</span><span style="color: olive">(</span><span style="color: green">this</span><span style="color: gray">.</span><span style="color: blue">getWidth</span><span style="color: olive">()</span><span style="color: gray">, </span><span style="color: green">this</span><span style="color: gray">.</span><span style="color: blue">getHeight</span><span style="color: olive">())</span><span style="color: gray">;</span>
    <li><span style="color: gray">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500">//用一个可变图像作为绘制缓冲</span>
    <li><span style="color: gray">&nbsp; &nbsp; &nbsp; </span><span style="color: blue">Graphics</span><span style="color: gray">&nbsp;</span><span style="color: blue">bg</span><span style="color: gray"> = </span><span style="color: blue">buffer</span><span style="color: gray">.</span><span style="color: blue">getGraphics</span><span style="color: olive">()</span><span style="color: gray">;&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500">//获取缓冲的Graphics对象</span>
    <li><span style="color: gray">&nbsp; &nbsp; &nbsp; </span><span style="color: blue">bg</span><span style="color: gray">.</span><span style="color: blue">setColor</span><span style="color: olive">(</span><span style="color: maroon">0xFFFFFF</span><span style="color: olive">)</span><span style="color: gray">;</span>
    <li><span style="color: gray">&nbsp; &nbsp; &nbsp; </span><span style="color: blue">bg</span><span style="color: gray">.</span><span style="color: blue">fillRect</span><span style="color: olive">(</span><span style="color: maroon">0</span><span style="color: gray">, </span><span style="color: maroon">0</span><span style="color: gray">, </span><span style="color: blue">getWidth</span><span style="color: olive">()</span><span style="color: gray">, </span><span style="color: blue">getHeight</span><span style="color: olive">())</span><span style="color: gray">;&nbsp; &nbsp; </span><span style="color: #ffa500">//填充整个屏幕</span>
    <li><span style="color: gray">&nbsp; &nbsp; &nbsp; </span><span style="color: blue">bg</span><span style="color: gray">.</span><span style="color: blue">drawImage</span><span style="color: olive">(</span><span style="color: blue">image</span><span style="color: gray">,</span><span style="color: green">this</span><span style="color: gray">.</span><span style="color: blue">getWidth</span><span style="color: olive">()</span><span style="color: gray">/</span><span style="color: maroon">2</span><span style="color: gray">,</span><span style="color: green">this</span><span style="color: gray">.</span><span style="color: blue">getHeight</span><span style="color: olive">()</span><span style="color: gray">/</span><span style="color: maroon">2</span><span style="color: gray">,&nbsp; &nbsp; &lt;</span><span style="color: blue">a</span><span style="color: gray">&nbsp;</span><span style="color: blue">href</span><span style="color: gray">=</span><span style="color: #8b0000">"</span><span style="color: red">http://www.sunjianyes.cn/Article/tag/graphics</span><span style="color: #8b0000">"</span><span style="color: gray">&gt;</span><span style="color: blue">Graphics</span><span style="color: gray">&lt;/</span><span style="color: blue">a</span><span style="color: gray">&gt;.</span><span style="color: blue">VCENTER</span><span style="color: gray">|</span><span style="color: blue">Graphics</span><span style="color: gray">.</span><span style="color: blue">HCENTER</span><span style="color: olive">)</span><span style="color: gray">;</span>
    <li><span style="color: gray">&nbsp;&nbsp; </span><span style="color: olive">}</span>
    <li><span style="color: gray">&nbsp;&nbsp; </span><span style="color: green">public</span><span style="color: gray">&nbsp;</span><span class="hl-types">void</span><span style="color: gray"> </span><span style="color: blue">paint</span><span style="color: olive">(</span><span style="color: blue">Graphics</span><span style="color: gray"> </span><span style="color: blue">g</span><span style="color: olive">)</span>
    <li><span style="color: gray">&nbsp;&nbsp; </span><span style="color: olive">{</span>
    <li><span style="color: gray">&nbsp; &nbsp; &nbsp; </span><span style="color: blue">g</span><span style="color: gray">.</span><span style="color: blue">drawImage</span><span style="color: olive">(</span><span style="color: blue">buffer</span><span style="color: gray">,</span><span style="color: maroon">0</span><span style="color: gray">,</span><span style="color: maroon">0</span><span style="color: gray">,</span><span style="color: blue">g</span><span style="color: gray">.</span><span style="color: blue">TOP</span><span style="color: gray">|</span><span style="color: blue">g</span><span style="color: gray">.</span><span style="color: blue">LEFT</span><span style="color: olive">)</span><span style="color: gray">;&nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500">//将缓冲区上的内容绘制到屏幕上</span>
    <li><span style="color: gray">&nbsp;&nbsp; </span><span style="color: olive">}</span>
    <li><span style="color: olive">}</span></li>
</ol>
</div>
<p>编译、运行程序，其结果和前面完全相同，但是却采用了双缓冲技术。对于双缓冲的使用，可以总结出以下几点。</p>
<p>* 定义一个Graphics对象bg和一个Image对象buffer，按屏幕大小建立一个缓冲对象赋给buffer，然后取得buffer的 Graphics对象赋给bg。在这里，Graphics对象可以理解为缓冲的屏幕，Image对象则可当成缓冲屏幕上的图片。</p>
<p>* 在bg（缓冲屏幕）上用drawImage()和drawString()等语句画图，相当于在缓冲屏幕上画图。</p>
<p>* 调用repaint()语句，它的功能是告知系统调用paint()来完成真实屏幕的显示。这里需要注意的是，paint()是一个系统调用语句，不能手工调用，只能通过paint()语句来调用。</p>
<p>* 在paint(Graphics g)函数里，将buffer（缓冲屏幕上的图片）画到真实屏幕上。</p>
<p>以上的步骤虽然看似繁琐，但是本身在不支持<a href="http://www.sunjianyes.cn/Article/tag/%e5%8f%8c%e7%bc%93%e5%86%b2%e6%8a%80%e6%9c%af"><strong>双缓冲机制</strong></a>的时候是必须的，回过头来看效果还是很不错的。如果想在屏幕上显示什么东西，只要画在bg上，然后调用repaint()将其显示出来就可以了。<br />
</p>
<img src ="http://www.blogjava.net/winlinglin/aggbug/280448.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/winlinglin/" target="_blank">winlinglin</a> 2009-06-07 17:52 <a href="http://www.blogjava.net/winlinglin/archive/2009/06/07/280448.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>