﻿<?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-冰浪-随笔分类-J2ME</title><link>http://www.blogjava.net/bingle/category/38137.html</link><description>年轻，是我们最大的资本 － 
坚定梦想，毕生追求!</description><language>zh-cn</language><lastBuildDate>Fri, 10 Jul 2009 21:54:20 GMT</lastBuildDate><pubDate>Fri, 10 Jul 2009 21:54:20 GMT</pubDate><ttl>60</ttl><item><title>WTK下HttpConnection.open遇到全数字域名时的问题</title><link>http://www.blogjava.net/bingle/archive/2009/07/10/286303.html</link><dc:creator>冰浪</dc:creator><author>冰浪</author><pubDate>Fri, 10 Jul 2009 10:02:00 GMT</pubDate><guid>http://www.blogjava.net/bingle/archive/2009/07/10/286303.html</guid><wfw:comment>http://www.blogjava.net/bingle/comments/286303.html</wfw:comment><comments>http://www.blogjava.net/bingle/archive/2009/07/10/286303.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bingle/comments/commentRss/286303.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bingle/services/trackbacks/286303.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在WTK模拟下用HttpConnection.open测试连接全数字域名时会发生如下错误&nbsp;&nbsp;<a href='http://www.blogjava.net/bingle/archive/2009/07/10/286303.html'>阅读全文</a><img src ="http://www.blogjava.net/bingle/aggbug/286303.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bingle/" target="_blank">冰浪</a> 2009-07-10 18:02 <a href="http://www.blogjava.net/bingle/archive/2009/07/10/286303.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2ME对html的unicode实体编码的转换</title><link>http://www.blogjava.net/bingle/archive/2009/07/10/286301.html</link><dc:creator>冰浪</dc:creator><author>冰浪</author><pubDate>Fri, 10 Jul 2009 09:57:00 GMT</pubDate><guid>http://www.blogjava.net/bingle/archive/2009/07/10/286301.html</guid><wfw:comment>http://www.blogjava.net/bingle/comments/286301.html</wfw:comment><comments>http://www.blogjava.net/bingle/archive/2009/07/10/286301.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bingle/comments/commentRss/286301.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bingle/services/trackbacks/286301.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在开发j2me浏览器时，对于html的unicode实体编码，我们需要将转换才能正常显示&nbsp;&nbsp;<a href='http://www.blogjava.net/bingle/archive/2009/07/10/286301.html'>阅读全文</a><img src ="http://www.blogjava.net/bingle/aggbug/286301.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bingle/" target="_blank">冰浪</a> 2009-07-10 17:57 <a href="http://www.blogjava.net/bingle/archive/2009/07/10/286301.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>j2me内存优化</title><link>http://www.blogjava.net/bingle/archive/2009/05/04/268832.html</link><dc:creator>冰浪</dc:creator><author>冰浪</author><pubDate>Mon, 04 May 2009 08:18:00 GMT</pubDate><guid>http://www.blogjava.net/bingle/archive/2009/05/04/268832.html</guid><wfw:comment>http://www.blogjava.net/bingle/comments/268832.html</wfw:comment><comments>http://www.blogjava.net/bingle/archive/2009/05/04/268832.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bingle/comments/commentRss/268832.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bingle/services/trackbacks/268832.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/bingle/archive/2009/05/04/268832.html'>阅读全文</a><img src ="http://www.blogjava.net/bingle/aggbug/268832.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bingle/" target="_blank">冰浪</a> 2009-05-04 16:18 <a href="http://www.blogjava.net/bingle/archive/2009/05/04/268832.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于J2ME的网络资讯浏览器</title><link>http://www.blogjava.net/bingle/archive/2009/04/22/266874.html</link><dc:creator>冰浪</dc:creator><author>冰浪</author><pubDate>Tue, 21 Apr 2009 17:21:00 GMT</pubDate><guid>http://www.blogjava.net/bingle/archive/2009/04/22/266874.html</guid><wfw:comment>http://www.blogjava.net/bingle/comments/266874.html</wfw:comment><comments>http://www.blogjava.net/bingle/archive/2009/04/22/266874.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bingle/comments/commentRss/266874.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bingle/services/trackbacks/266874.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这个程序是我的第一个J2ME作品，花了大概10天的时间。其中花得比较多的时候是在界面上，实现了低级UI部件的组件化，在一定程度上实现了重用性。其中涉及到了多线程、按键事件传递、回调机制等。&nbsp;&nbsp;<a href='http://www.blogjava.net/bingle/archive/2009/04/22/266874.html'>阅读全文</a><img src ="http://www.blogjava.net/bingle/aggbug/266874.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bingle/" target="_blank">冰浪</a> 2009-04-22 01:21 <a href="http://www.blogjava.net/bingle/archive/2009/04/22/266874.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于android手机平台的在线网络音乐播放器</title><link>http://www.blogjava.net/bingle/archive/2009/04/22/266872.html</link><dc:creator>冰浪</dc:creator><author>冰浪</author><pubDate>Tue, 21 Apr 2009 16:36:00 GMT</pubDate><guid>http://www.blogjava.net/bingle/archive/2009/04/22/266872.html</guid><wfw:comment>http://www.blogjava.net/bingle/comments/266872.html</wfw:comment><comments>http://www.blogjava.net/bingle/archive/2009/04/22/266872.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bingle/comments/commentRss/266872.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bingle/services/trackbacks/266872.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这是为应聘A8所写的GPhone手机程序，也是我的第一个Android程序，实现了音乐文件(如mp3)的边下载边播放。&nbsp;&nbsp;<a href='http://www.blogjava.net/bingle/archive/2009/04/22/266872.html'>阅读全文</a><img src ="http://www.blogjava.net/bingle/aggbug/266872.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bingle/" target="_blank">冰浪</a> 2009-04-22 00:36 <a href="http://www.blogjava.net/bingle/archive/2009/04/22/266872.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2ME程序开发全方位基础讲解</title><link>http://www.blogjava.net/bingle/archive/2009/04/09/264597.html</link><dc:creator>冰浪</dc:creator><author>冰浪</author><pubDate>Thu, 09 Apr 2009 02:50:00 GMT</pubDate><guid>http://www.blogjava.net/bingle/archive/2009/04/09/264597.html</guid><wfw:comment>http://www.blogjava.net/bingle/comments/264597.html</wfw:comment><comments>http://www.blogjava.net/bingle/archive/2009/04/09/264597.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bingle/comments/commentRss/264597.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bingle/services/trackbacks/264597.html</trackback:ping><description><![CDATA[<span style="color: blue">转于<a href="http://blog.csdn.net/Mailbomb/archive/2007/08/23/1755741.aspxhttp://blog.csdn.net/Mailbomb/archive/2007/08/23/1755741.aspx">http://blog.csdn.net/Mailbomb/archive/2007/08/23/1755741.aspxhttp://blog.csdn.net/Mailbomb/archive/2007/08/23/1755741.aspx</a><br />
<br />
一、J2ME中需要的Java基础知识</span><br />
现在有大部分人，都是从零开始学J2ME的，学习J2ME的时候，总是从Java基础开始学习，而且现在讲Java基础的书籍中都是以J2SE来讲基础，这就给学习造成了一些不必要的麻烦，下面将J2ME中用到的和不需要的Java基础知识做一个简单的说明。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;J2ME中使用到的Java基础知识：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、Java语法基础：包括基本数据类型、关键字、运算符等等<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、面向对象的思想：类和对象的概念，继承和多态等等。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3、异常处理<br />
　　4、多线程<br />
<br />
　 J2ME中没有用到的Java基础知识：<br />
<br />
　　1、JDK中javac和java命令的使用<br />
　　2、Java基础中的很多类在J2ME中没有，或者类中的方法做了大量的精简。所以建议在J2ME中熟悉类库。<br />
　　3、Applet、AWT、Swing这些知识在J2ME中根本使用不到。<br />
<br />
　　简单说这么多，希望学J2ME的朋友们能少走一些弯路，不足之处希望大家积极指正和补充。<br />
<br />
<span style="color: blue">二、J2ME中暂时无法完成的功能</span><br />
<br />
　　列一些J2ME中暂时无法完成的功能，希望大家能积极补充：<br />
　　 1、在手机中不更改代码实现移植，主要指游戏。<br />
　　 2、动态修改按钮文字。<br />
　　 3、在Canvas上接受中文输入。<br />
　　 4、操作本地资源、例如地址本、已收短信息等。<br />
　　 5、制作破坏性的手机病毒。<br />
　　 6、其他等待大家来补充。<br />
<br />
<span style="color: blue">三、J2ME的跨平台性</span><br />
<br />
　　J2ME技术源于Java，所以也具有JVM的优势，可以在支持Java的平台上进行移植，但是现在的J2ME技术在跨平台上却做的很糟糕，我们来简单看一下原因：<br />
<br />
　　1、手机的屏幕尺寸不一：<br />
<br />
　　这个主要在界面制作上。如果你使用的是高级用户界面，比如你做的是应用开发或者用户登陆、用户注册这样的通用功能时，一般没有什么问题。<br />
　　如果你使用的是低级用户界面，比如你做的是游戏，那么你就需要考虑这个问题了。<br />
<br />
　　2、厂商的扩展API不统一：<br />
<br />
　　例如Nokia的扩展API类库UI系列，在别的手机上或者没有实现，或者包名不同等等。<br />
<br />
　　3、手机平台上实现的bug：<br />
<br />
　　例如Nokia的7650在实现双缓冲上有bug，那么在这种机型上运行的软件就不能使用双缓冲。其他NOKIA上的一些bug，可以参看：<a href="http://blog.csdn.net/Mailbomb/archive/2005/03/24/329123.aspx" target="_new">http://blog.csdn.net/Mailbomb/archive/2005/03/24/329123.aspx</a><br />
<br />
　　4、手机性能问题。<br />
<br />
　　不同手机的可用内存、最大jar文件都有要求，例如Nokia S40的大部分手机支持的最大jar文件为64K，最大可用内容为210K。<br />
<br />
　　所以现在的手机软件，特别是游戏都提供支持的机型列表，也才有了手机游戏移植人员的存在。<br />
<br />
<span style="color: blue">四、学习J2ME可以从事的工作种类</span><br />
<br />
<br />
　　现在J2ME技术可以说相当的火暴，这里介绍一些学好了J2ME之后可以从事的工作的种类：<br />
<br />
　　1、J2ME游戏开发人员<br />
<br />
　　根据游戏策划或者文档要求，在某种特定的机型(以Nokia S40或S60居多)开发游戏程序。<br />
　　这是现在大部分J2ME程序员从事的工作。<br />
　　需要熟练掌握：高级用户界面、低级用户界面、线程，如果是网络游戏，还需要熟练网络编程。<br />
<br />
　　2、J2ME应用开发人员<br />
<br />
　　现在的移动应用还不是很多，但是还是出现了一些，特别是移动定位以及移动商务相关的内容。<br />
　　需要熟练掌握：高级用户界面、线程和网络编程。<br />
<br />
　　3、J2ME游戏移植人员<br />
<br />
　　参照源代码，将可以在一个平台上可以运行的游戏移植到其他平台上去。例如将Nokia S40的游戏移植到S60上，或者索爱的T618等等。<br />
<br />
　　主要是控制屏幕坐标，有些可能需要替换一些API。<br />
<br />
　　需要熟悉各平台之间的差异以及相关的技术参数，比如屏幕大小、最大jar文件尺寸等等。<br />
<br />
<span style="color: blue">五、J2ME程序设计的几个原则</span><br />
<br />
　　1、使用面向对象编程。<br />
<br />
　　虽然使用面向过程编程可以减小文件的尺寸，但是为了以后维护的方便和利于扩展，还是要使用面向对象编程。<br />
<br />
　　2、使用MVC模式<br />
<br />
　　将模型、界面和控制分离。现在很多的程序将三者合一，但是如果你做的程序比较大的话，还是建议你进行分离。<br />
<br />
　　3、自动存储用户设定<br />
<br />
　　使用RMS来存储用户的信息，例如存储用户上次输入的用户名、密码、用户对于系统的设定等，这样不仅可以减少用户的输入，而且对用户友好。很多程序甚至做了自动登陆等。<br />
<br />
　　4、一些系统设置允许用户关闭。如背景音乐、背景灯显示等。<br />
<br />
　　5、将低级用户界面的绘制动作放在一个独立的线程里面去。<br />
<br />
　　6、在需要大量时间才能完成的工作时，给用户一个等待界面。<br />
<br />
<br />
<span style="color: blue">六、从模拟器到真机测试</span><br />
<br />
　　对于J2ME开发者来说，模拟器给我们带来了很多方便，比如可以在模拟器中调试程序以及很方便的察看程序的效果，但是模拟器也给我们带来了一些问题，比如模拟器实现的bug等等，所以进行真机测试是必须的。<br />
<br />
　　1、为什么要进行真机测试？<br />
<br />
　　因为模拟器程序可能存在bug，以及真机的性能有限，所以必须进行真机测试。<br />
<br />
　　2、如何将程序传输到机器中？<br />
<br />
　　将程序传输到机器中有如下方式：<br />
　　 a)　OTA下载<br />
　　 b)　使用数据线传输<br />
　　 c)　红外传输<br />
　　 d)　蓝牙<br />
　　你可以根据条件，选择合适的方式。<br />
<br />
　　3、 真机测试主要测什么？<br />
<br />
　　真机测试的内容很多，主要测试以下几个方面：<br />
　　 a)　程序的功能<br />
　　 b)　程序的操作性，是否易操作<br />
　　 c)　程序的大小,比如Nokia S40系列的手机大部分接受的最大文件尺寸为64K<br />
　　 d)　程序运行速度，速度是否可以忍受。<br />
<br />
<span style="color: blue">七、从WTK到厂商SDK</span><br />
<br />
　　对于J2ME爱好者来说，基本上大家都是从SUN的WTK(J2ME Wireless Toolkit)开始的，但是对于实际应用来说，仅仅使用WTK是远远不够的，所以在学习过程中，必须完成从WTK到SDK的跨越。<br />
<br />
　　1、厂商SDK的下载地址？<br />
<br />
　　<a href="http://blog.csdn.net/Mailbomb/archive/2005/01/01/236606.aspx" target="_new">http://blog.csdn.net/Mailbomb/archive/2005/01/01/236606.aspx</a><br />
<br />
　　2、厂商SDK和WTK有什么不同？<br />
<br />
　　厂商SDK最简单的理解就是在WTK的基础上增加了自己的模拟器和自己的扩展API。<br />
　　也就是说，你在使用厂商的SDK时，可以使用厂商的扩展类库，例如Nokia的UI类库，和厂商自己的模拟器而已。<br />
　　每个厂商的扩展API都不多，而且不尽相同。<br />
<br />
　　3、如何使用？<br />
<br />
　　有些厂商SDK的使用都和WTK相同，例如SamSung。<br />
　　Nokia提供了独立的界面来开发，但是这个界面在实际开发中使用不多。<br />
<br />
　　4、厂商SDK的问题<br />
<br />
　　厂商SDK实现过程中，有一些bug，而且和真机实现不一致。例如NOKIA的混音播放问题等等。<br />
<br />
<br />
<span style="color: blue">八、在J2ME中获得手机IMEI的方法</span><br />
<br />
　　IMEI是Internation mobile entity identification的简称，在手机中输入*#06#可以显示该数字，长度为15位，全球唯一，永远不会冲突，所以可以作为识别用户的一个标志。<br />
<br />
　　下面是在J2ME中获得IMEI的方法：<br />
<br />
　　1、MOTO系列的手机可以通过读取系统的IMEI属性获得，代码如下：<br />
　　
<pre>String imei = System.getProperty("IMEI");</pre>
<br />
　　2、SIEMENS系列的手机可以通过读取系统的com.siemens.IMEI属性获得，代码如下：<br />
　　
<pre>String imei = System.getProperty("com.siemens.IMEI");</pre>
<br />
<br />
<span style="color: blue">九、J2ME网络连接中显示问题的解决办法</span><br />
<br />
　　在网络编程中，有些时候会出现一些在没有接收到网络数据就显示界面的，造成界面显示不符合要求（例如公告显示，会先显示公告的背景图片再显示公告信息），这里提一个简单的解决办法给大家：<br />
<br />
　　解决这种情况的方法分成三个步骤：<br />
<br />
　　1、在需要显示的界面中，调用发送网络数据的方法。每次显示时调用该构造方法，不调用Display的setCurrent方法显示。<br />
　　2、显示等待界面(例如进度条等)，给用户提示，在进行网络连接。<br />
　　3、在处理网络反馈的数据完以后，调用Display的setCurrent方法显示显示当前界面。<br />
<br />
<span style="color: blue">十、增强J2ME的String能力——分割字符串</span><br />
<br />
　　从JDK1.4以后，String类中新增了split方法来实现字符串的分割，但是在J2ME中却没有该方法(MIDP2.0中也没有实现)，但是在实际使用过程中，有些时候的确要用到这种操作，这里将我以前实现的一段代码和大家共享：<br />
<pre><br />
/**<br />
* 分割字符串，原理：检测字符串中的分割字符串，然后取子串<br />
* @param original 需要分割的字符串<br />
* @paran regex 分割字符串<br />
* @return 分割后生成的字符串数组<br />
*/<br />
<br />
private static String[] split(String original,String regex)<br />
{<br />
//取子串的起始位置<br />
int startIndex = 0;<br />
//将结果数据先放入Vector中<br />
Vector v = new Vector();<br />
//返回的结果字符串数组<br />
String[] str = null;<br />
//存储取子串时起始位置<br />
int index = 0;<br />
<br />
//获得匹配子串的位置<br />
startIndex = original.indexOf(regex); <br />
//System.out.println("0" + startIndex); <br />
//如果起始字符串的位置小于字符串的长度，则证明没有取到字符串末尾。<br />
//-1代表取到了末尾<br />
while(startIndex &lt; original.length() &amp;&amp; startIndex != -1)<br />
{<br />
String temp = original.substring(index,startIndex);<br />
System.out.println(" " + startIndex);<br />
//取子串<br />
v.addElement(temp);<br />
<br />
//设置取子串的起始位置<br />
index = startIndex + regex.length();<br />
<br />
//获得匹配子串的位置<br />
startIndex = original.indexOf(regex,startIndex + regex.length());<br />
}<br />
<br />
//取结束的子串<br />
v.addElement(original.substring(index + 1 - regex.length()));<br />
//将Vector对象转换成数组<br />
str = new String[v.size()];<br />
for(int i=0;i <br />
{<br />
str[i] = (String)v.elementAt(i);<br />
}<br />
<br />
//返回生成的数组<br />
return str;<br />
}<br />
</pre>
<br />
<br />
<span style="color: blue">十一、J2ME在低级用户界面上分行显示文字</span><br />
<br />
　　在J2ME的低级用户界面开发中，经常会遇到需要在Canvas上显示大量的文字，例如关于界面、游戏说明、游戏公告等信息。如果在设计时，将文字的内容和长度都固定，既不利于修改也不利于维护。下面介绍一个简单的方法，实现一个简单、可维护性强的方式。<br />
<br />
　　实现方法：<br />
<br />
　　 1、将需要显示的所有信息做成一个字符串。<br />
　　 2、编写一个将该字符串按照要求转换为字符串数组的方法。<br />
　　 3、将转换后的数组以循环的方式显示在Canvas上。<br />
<br />
　　通过这样三个步骤，则修改显示的信息时，只需要修改包含显示信息的字符串即可，自己书写的方法可以按照以前的标准重新分割新的字符串。如果需要修改每行显示的字符个数，则只需要修改自己书写的方法即可。<br />
<br />
　　通过这样一种实现方式，可以很方便的实现显示一些比较长的文本信息，即使是可变长度的字符串也没有问题。<br />
<br />
<br />
<span style="color: blue">十二、J2ME中使用记录存储系统(RMS)存储信息</span><br />
<br />
　　在MIDP中，没有文件的概念，所以永久存储一般只能依靠记录存储系统实现，关于记录存储系统的简介，可以参看教程：<a href="http://www-900.ibm.com/developerWorks/cn/java/j-wi-rms/index.shtml" target="_new">http://www-900.ibm.com/developerWorks/cn/java/j-wi-rms/index.shtml</a><br />
<br />
　　下面是一些记录存储系统的常用编码介绍：<br />
<br />
　　 1、打开记录集：<br />
<br />
　　打开记录集使用RecordStore里面的静态方法openRecordStore，示例代码如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;
<pre>RecordStore rs = RecordStore.openRecordStore(&#8220;username&#8221;,true);</pre>
<br />
<br />
　　这样就打开了一个名称为rs的记录集，其中username为记录集的名称，该名称可以根据需要来取，第二个参数代表是否则没有时创建新的记录集，true代表在该记录集不存在时，创建新的记录集，false代表不创建。<br />
<br />
　　如果在打开记录集时，该记录集不存在，则抛出RecordStoreNotFoundException异常，所以检测记录集是否已创建可以使用该异常。<br />
<br />
　　注意：记录集打开以后记得关闭。<br />
<br />
　　 2、向记录集中写入数据<br />
<br />
　　 2.1增加数据<br />
<br />
　　向已经打开的记录集中添加数据，需要使用addRecord方法，示例代码：<br />
&nbsp;&nbsp;&nbsp;&nbsp;
<pre><br />
byte[] bytes = {1,2,3};<br />
int id = rs. addRecord(bytes,0,bytes.length);<br />
&nbsp;&nbsp;&nbsp;&nbsp; </pre>
<br />
　　该代码将字节数组bytes的全部内容写入到记录集中，该方法的返回值为该信息的id，注意：id从1开始，而不是从0开始。<br />
　　你可以循环使用该方法向记录集中写入多条数据。<br />
<br />
　　 2.2修改数据<br />
<br />
　　修改已经存在的记录集中指定id的数据，需要使用setRecord方法，示例代码：<br />
&nbsp;&nbsp;&nbsp;&nbsp;
<pre><br />
byte[] bytes = {1,2,3};<br />
rs. setRecord(1,bytes,0,bytes.length);<br />
&nbsp;&nbsp;&nbsp;&nbsp; </pre>
<br />
　　以上代码的作用是将字节数组bytes的全部内容写入到id为1的记录集rs中。<br />
　　该操作会覆盖已有的数据。<br />
　　说明：有些时候，你需要将信息写入到记录集中的第一条记录中，则可以结合以上两个方法，则第一次时向记录集增加数据，以后来进行修改。<br />
<br />
　　 3、从记录集中读出数据<br />
<br />
　　从记录集中读取已有数据，需要使用getRecord方法，示例代码：<br />
<pre><br />
byte[] bytes = rs. getRecord(1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</pre>
<br />
　　该代码从记录集rs中读取第一条数据，将读取到的数据放在bytes数组中。<br />
　　在读取数据时，可以获得记录集中id的个数，可以使用getNumRecords方法获得<br />
　　综合代码为：<br />
<pre><br />
int number = rs. getNumRecords();<br />
int id = 1;<br />
if(id &gt;0 &amp;&amp; id &lt; number)<br />
{<br />
&nbsp;&nbsp;byte[] bytes = rs. getRecord(1);<br />
}<br />
</pre>
<br />
<br />
　　 4、从记录集中删除记录<br />
<br />
　　从记录集中删除记录的方法有两种：逻辑删除和物理删除。<br />
　　逻辑删除是指给删除的记录打标记。<br />
　　物理删除是指从物理上删除该记录，但是该记录的id不能被重用，也就是说该id不会被继续使用。例如一个记录集中有5个记录，假设你删除了id为3的数据，则剩余记录的id依然为1、2、4、5。这给便历带来了一定的麻烦。<br />
<br />
　　 5、便历记录集<br />
<br />
　　便历记录集，即访问记录集中的所有数据，有两个方法，详见：<br />
&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://gceclub.sun.com.cn/NASApp/sme/controller/teclist?tid=0103" target="_new">http://gceclub.sun.com.cn/NASApp/sme/controller/teclist?tid=0103</a><br />
<br />
　　 6、其他操作<br />
<br />
　　删除记录集<br />
　　删除记录集不同于删除记录，需要使用deleteRecordStore方法，示例代码： <br />
&nbsp;&nbsp;&nbsp;&nbsp;
<pre><br />
RecordStore. deleteRecordStore(&#8220;username&#8221;);<br />
&nbsp;&nbsp;&nbsp;&nbsp; </pre>
<br />
　　该代码删除名称为username的记录集。<br />
<br />
<span style="color: blue">十三、J2ME加密数据的一个第三方开源免费类库介绍</span><br />
<br />
　　在J2ME编程中，经常遇到一些数据在存储或者传输时需要加密，下面介绍一个第三方的加密类库的一些资料：<br />
<br />
　　加密类库的官方主页：<a href="http://www.bouncycastle.org/" target="_new">http://www.bouncycastle.org/</a><br />
　　介绍的文章：<br />
　　中文：<a href="http://18900.motorola.com/ewa_portal/develope/jc_j2messl_5_1.jsp" target="_new">http://18900.motorola.com/ewa_portal/develope/jc_j2messl_5_1.jsp</a><br />
　　英文：<a href="http://www.javaworld.com/javaworld/jw-12-2002/jw-1220-wireless.html" target="_new">http://www.javaworld.com/javaworld/jw-12-2002/jw-1220-wireless.html</a><br />
　　该文章的源代码包含使用的一些方法。<br />
　　备注：因为该类库提供的功能比较强大，所以类库的尺寸比较大，最后在发布时需要将类库中不需要的类删除<br />
<br />
<br />
<span style="color: blue">十四、如何播放声音</span><br />
<br />
　　在J2ME中，处理声音需要使用到Mobile Media API(MMAPI)，该包是MIDP1.0的可选包，在MIDP2.0中已经包含了这个包。所以如果你使用MIDP1.0的话，请确认你的运行环境是否支持。<br />
<br />
　　一般手机支持的声音文件格式为wav、mid和mpg等。具体请查阅你的手机说明文档。<br />
　　在声音处理中，有很多处理的方式，这里说一下最常用的情况，播放JAR文件中的wav文件。<br />
　　播放声音文件的流程：<br />
<br />
　　 1、按照一定的格式读取声音文件。<br />
<br />
　　播放JAR文件中的声音文件一般是将声音文件处理成流的形式。示例代码：<br />
<pre><br />
InputStream is = this.getClass().getResourceAsStream("/Autorun.wav");<br />
</pre>
<br />
其中Autorun.wav文件位于JAR文件的根目录下，如果位于别的目录，需要加上目录名称，如/res /Autorun.wav。<br />
<br />
　　 2、将读取到的内容传递给播放器。<br />
<br />
　　将流信息传递给播放器，播放器按照一定的格式来进行解码操作，示例代码：<br />
<pre><br />
Player player = Manager.createPlayer(is,"audio/x-wav");<br />
</pre>
<br />
　　其中第一个参数为流对象，第二个参数为声音文件的格式。<br />
<br />
　　 3、播放声音。<br />
<br />
　　使用Player对象的start方法，可以将声音播放出来，示例代码：<br />
<pre><br />
player.start()；<br />
</pre>
<br />
　　在播放声音时也可以设定声音播放的次数，可以使用Player类中的setLoopCount方法来实现，具体可查阅API文档。<br />
　　下面是在NOKIA S60模拟器中测试通过。代码如下：<br />
<pre><br />
package sound;<br />
import javax.microedition.midlet.*;<br />
import javax.microedition.lcdui.*;<br />
import javax.microedition.media.*;<br />
import java.io.*;<br />
<br />
public class SoundMIDlet extends MIDlet <br />
{<br />
　　private Player player = null;<br />
　　/** Constructor */<br />
　　public SoundMIDlet() <br />
{<br />
try<br />
{<br />
InputStream is = this.getClass().getResourceAsStream("/Autorun.wav");<br />
player = Manager.createPlayer(is,"audio/x-wav");<br />
}<br />
catch(IOException e)<br />
{<br />
System.out.println("1:" + e);<br />
}<br />
catch(MediaException e)<br />
{<br />
System.out.println("2:" + e);<br />
}<br />
catch(Exception e)<br />
{<br />
System.out.println("3:" + e);<br />
}<br />
}<br />
<br />
/** Main method */<br />
public void startApp() <br />
{<br />
if(player != null)<br />
{<br />
try<br />
{<br />
　　　　 player.start();<br />
}<br />
catch(MediaException e)<br />
{<br />
　　　　 System.out.println("4:" + e);<br />
}<br />
}<br />
}<br />
<br />
/** Handle pausing the MIDlet */<br />
public void pauseApp() <br />
{<br />
}<br />
<br />
/** Handle destroying the MIDlet */<br />
public void destroyApp(boolean unconditional) <br />
{<br />
}<br />
}<br />
</pre>
<br />
<br />
<span style="color: blue">十五、J2ME 3D编程的一些资料</span><br />
<br />
　　随着J2ME技术的发展，以及硬件速度的提升，3D游戏程序将慢慢的变成主流，最近想学习这一块的编程，所以收集了一些资料，和大家一起分享：<br />
<br />
　　1、JSR184<br />
　　JSR184是Nokia公司起草的一个关于3D API的规范，下载地址为：<br />
　　<a href="http://www.forum.nokia.com/main/1,,1_0_10,00.html#jsr184" target="_new">http://www.forum.nokia.com/main/1,,1_0_10,00.html#jsr184</a><br />
<br />
　　2、Nokia的3D编程资料<br />
&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.forum.nokia.com/main/1,6566,21,00.html" target="_new">http://www.forum.nokia.com/main/1,6566,21,00.html</a><br />
<br />
　　3、3D引擎<br />
　　一个简单的开放源代码的3D游戏引擎<br />
&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.j2me.com.cn/Soft_Show.asp?SoftID=19" target="_new">http://www.j2me.com.cn/Soft_Show.asp?SoftID=19</a><br />
　　国内一个合作开发3D引擎的项目：<br />
&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://gceclub.sun.com.cn/NASApp/sme/jive/thread.jsp?forum=11&amp;thread=8593" target="_new">http://gceclub.sun.com.cn/NASApp/sme/jive/thread.jsp?forum=11&amp;thread=8593</a><br />
<br />
　　4、一款3D游戏产品<br />
&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://games.sina.com.cn/newgames/2004/04/040217696.shtml" target="_new">http://games.sina.com.cn/newgames/2004/04/040217696.shtml</a><br />
<br />
　　5、支持3D的开发工具<br />
　　当前一些高端的手机支持3D开发，支持3D开发的开发工具中，通用的有SUN的J2MEWTK2.2。专用的是厂商提高的支持JSR184的SDK。<br />
<br />
<br />
<span style="color: blue">十六、3D编程——第一个3D程序</span><br />
<br />
　　参考WTK2.2提供的demo，完成了第一个3D程序，虽然很简单，而且有些问题还不是很清楚，还是把代码共享出来和愿意学习J2ME 3D编程的朋友一起学习。<br />
<br />
　　关于代码的编译和运行说明如下：<br />
　　1、以下代码在J2ME WTK2.2下面编译通过。<br />
　　2、代码分为两个文件：First3DCanvas.java和First3DMIDlet.java。<br />
　　3、使用J2ME WTK2.2建立新的工程，主MIDlet类为：first3d. First3DMIDlet<br />
　　4、将代码保存在你的工程目录下的first3d目录下。<br />
　　5、将J2ME WTK安装目录下的apps"Demo3D"res"com"superscape"m3g"wtksamples"retainedmode"content目录中的swerve.m3g文件复制到你的工程目录下的res目录下。<br />
　　6、你的工程建立后，设置工程，通过WTK界面中的&#8220;设置&#8221;按钮打开设置窗口，在&#8220;API选择&#8221;中，设置&#8220;目标平台&#8221;为：自定义；&#8220;简档&#8221;为&#8220;MIDP2.0&#8221;；&#8220;配置&#8221;为&#8220;CLDC1.1&#8221;；选中&#8220;Mobile 3D Graphics for J2ME(JSR184)&#8221;。<br />
　　7、这样你就可以编译和运行以下代码了。<br />
　　源代码如下： <br />
<pre><br />
// First3DMIDlet.java<br />
package first3d;<br />
import javax.microedition.midlet.*;<br />
import javax.microedition.lcdui.*;<br />
public class First3DMIDlet extends MIDlet <br />
{<br />
private First3DCanvas displayable = new First3DCanvas();<br />
public void startApp() <br />
{<br />
Display.getDisplay(this).setCurrent(displayable);<br />
}<br />
<br />
public void pauseApp() {}<br />
<br />
public void destroyApp(boolean unconditional) {}<br />
}<br />
<br />
// First3Dcanvas.java<br />
package first3d;<br />
import javax.microedition.lcdui.*;<br />
import javax.microedition.m3g.*;<br />
import java.util.*;<br />
/**<br />
* 第一个3D程序<br />
*/<br />
public class First3DCanvas extends Canvas implements Runnable <br />
{<br />
/**World对象*/<br />
private World myWorld = null;<br />
/**Graphics3D对象*/<br />
private Graphics3D g3d = Graphics3D.getInstance();<br />
/**Camera对象*/<br />
private Camera cam = null;<br />
private int viewport_x;<br />
private int viewport_y;<br />
private int viewport_width;<br />
private int viewport_height;<br />
private long worldStartTime = 0;<br />
//重绘时间<br />
private int validity = 0;<br />
<br />
public First3DCanvas() <br />
{<br />
//启动重绘界面的线程<br />
Thread thread = new Thread(this);<br />
thread.start();<br />
try <br />
{<br />
//导入3D图片<br />
myWorld = (World) Loader.load("/swerve.m3g")[0];<br />
viewport_x = 0;<br />
viewport_y = 0;<br />
viewport_width = getWidth();<br />
viewport_height = getHeight();<br />
cam = myWorld.getActiveCamera();<br />
//设置cam对象<br />
float[] params = new float[4];<br />
int type = cam.getProjection(params);<br />
if (type != Camera.GENERIC) <br />
{<br />
//calculate window aspect ratio<br />
float waspect = viewport_width / viewport_height;<br />
if (waspect &lt; params[1]) <br />
{<br />
float height = viewport_width / params[1];<br />
viewport_height = (int) height;<br />
viewport_y = (getHeight() - viewport_height) / 2;<br />
}<br />
else <br />
{<br />
float width = viewport_height * params[1];<br />
viewport_width = (int) width;<br />
viewport_x = (getWidth() - viewport_width) / 2;<br />
}<br />
}<br />
worldStartTime = System.currentTimeMillis();<br />
}<br />
catch (Exception e) {}<br />
}<br />
<br />
protected void paint(Graphics g) <br />
{<br />
//清除背景<br />
g.setColor(0x00);<br />
g.fillRect(0, 0, getWidth(), getHeight());<br />
//和3D对象绑定<br />
g3d.bindTarget(g);<br />
g3d.setViewport(viewport_x, viewport_y, viewport_width, viewport_height);<br />
long startTime = System.currentTimeMillis() - worldStartTime;<br />
validity = myWorld.animate((int)startTime);<br />
try <br />
{<br />
g3d.render(myWorld);<br />
}<br />
finally <br />
{<br />
g3d.releaseTarget();<br />
}<br />
}<br />
<br />
public void run() <br />
{<br />
try<br />
{<br />
while(true)<br />
{<br />
//重绘图形<br />
repaint(viewport_x, viewport_y, viewport_width, viewport_height);<br />
}<br />
}<br />
catch(Exception e){}<br />
}<br />
}<br />
</pre>
<br />
<br />
<span style="color: blue">十七、在J2ME网络编程中使用CMWAP代理</span><br />
<br />
　　在中国移动提供的网络连接中，分为CMNET和CMWAP两种，其中CMNET可以无限制的访问互联网络，资费比较贵。CMWAP类似一个HTTP的代码，只能访问支持HTTP的应用，但是资费便宜，稳定性比较差。<br />
<br />
　　在实际的J2ME网络编程中，一般需要提供以CMWAP代理的方式连接网络，在J2ME中，连接的代码和直接连接有所不同，代码如下：<br />
<pre><br />
HttpConnection http = (HttpConnection)Connector.open(("http://10.0.0.172/"+url);<br />
http.setRequestProperty("X-Online-Host",ServerName);<br />
</pre>
<br />
　　例如你需要访问的地址为：http://www.test.com/login/loginServlet则上面的代码就为：<br />
<pre><br />
HttpConnection http = (HttpConnection)Connector.open(("http://10.0.0.172/" + "login/loginServlet");<br />
http.setRequestProperty("X-Online-Host","www.test.com");<br />
</pre>
<br />
　　在实际使用过程中，只需要使用实际需要访问的地址的域名或者IP来代替ServerName，例如示例中的&#8220;www.test.com&#8221;，使用后续的地址类代替代码中的url，例如示例中的&#8220;login/loginServlet&#8221;，就可以实际的使用CMWAP代理来进行连接了。<br />
<br />
<br />
<span style="color: blue">十八、J2ME中的时间处理全攻略</span><br />
<br />
　　时间处理在程序开发中相当常见，下面对于时间处理做一个简单的说明。<br />
<br />
　　一、时间的表达方式<br />
<br />
　　时间在J2ME中有两种表达方式：<br />
<br />
　　1、以和GMT1970年1月1号午夜12点和现在相差的毫秒数来代表<br />
　　这种方式适合比较两个时间之间的差值。<br />
　　2、以对象的形式来表达<br />
<br />
　　二、时间处理的相关类<br />
<br />
　　时间处理在J2ME中涉及三个类：<br />
<br />
　　1、System类<br />
<pre><br />
long time = System. currentTimeMillis();<br />
</pre>
<br />
　　使用该方法可以获得当前时间，时间的表达方式为上面提到的第一种。<br />
　　2、Date类<br />
<pre><br />
Date date = new Date();<br />
</pre>
<br />
　　获得当前时间，使用对象的形式来进行表达。<br />
　　3、Calendar类<br />
<pre><br />
Calendar calendar = Calendar. getInstance();<br />
</pre>
<br />
<br />
　　三、时间处理的具体操作<br />
<br />
　　1、以上三种表达方式的转换：<br />
<br />
　　a)将System类获得的时间转换为Date对象<br />
<pre><br />
Date date = new Date(System. currentTimeMillis());<br />
</pre>
<br />
　　b)将Date类型的对象转换为Calendar类型的对象<br />
<pre> <br />
Calendar calendar = Calendar. getInstance();<br />
Date date = new Date();<br />
calendar.setTime(date);<br />
</pre>
<br />
<br />
　　2、使用Calendar完成一些日期操作：<br />
<br />
　　Calendar是时间处理中最常用也是功能最强大的类，可以用它来获得某个时间的日期、星期几等信息。<br />
　　获得日期：<br />
<pre><br />
Calendar calendar = Calendar. getInstance();<br />
&#8230;&#8230;<br />
int day = calendar.get(Calendar. DATE);<br />
</pre>
<br />
　　获得日期、年份、星期的操作和这个类似。<br />
　　需要注意的是：Calendar中表示月份的数字和实际相差1，即1月用数字0表示，2月用数字1表示，&#8230;&#8230;12月用数字11表示。<br />
<br />
<br />
<span style="color: blue">十九、J2ME中随机数字处理全攻略</span><br />
<br />
　　在程序中生成随机数字，用处比较，如人工智能领域等等，这里对于在J2ME中生成随机数的操作进行一个简单的整理，希望对大家能有帮助。<br />
<br />
　　J2ME和J2SE不同，不能使用Math类的random来生成随机数字，只能使用java.util包的Random类来生成随机数字。<br />
<br />
　　1、创建Random类型的对象：<br />
<pre><br />
Random random = new Random();<br />
Random random = new Random(10010010);<br />
</pre>
<br />
　　以上两种是创建Random对象的方式，第一种使用默认构造方法，和以下的代码作用完全等价：<br />
　　
<pre> Random random = new Random(System. currentTimeMillis());</pre>
<br />
　　相当与使用当前时间作为种子数字来进行创建。<br />
　　第二种方式通过自己来指定种子数字来进行创建。<br />
　　大家可以根据需要使用以上两种方式的任一种。<br />
<br />
　　2、生成随机数字：<br />
<br />
　　创建好了随机对象以后，我们就可以来生成随机数字了：<br />
　　生成随机整数：<br />
<pre><br />
int k = random.nextInt();<br />
</pre>
<br />
生成随机长整数：<br />
<pre><br />
long l = random.nextLong();<br />
</pre>
<br />
<br />
　　3、生成指定范围的数字：<br />
<br />
　　例如生成0-10之间的随机数字：<br />
<pre><br />
int k = random.nextInt();<br />
int j = Math.abs(k % 10);<br />
</pre>
<br />
　　首先生成一个随机整数k，然后用k和10取余，最后使用Math类的abs方法取绝对值，获得0-10之间的随机数字。<br />
　　获得0-15之间的随机数，类似：<br />
<pre><br />
int k = random.nextInt();<br />
int j = Math.abs(k % 15);<br />
</pre>
<br />
　　获得10-20之间的随机数字：<br />
<pre><br />
int k = random.nextInt();<br />
int j = Math.abs(k % 10) + 10;<br />
</pre>
<br />
<br />
<span style="color: blue">二十、在J2ME手机编程中使用字体</span><br />
<br />
　　在J2ME手机编程中，可以通过使用字体类——Font在低级用户界面中，获得更好的表现效果，那么如何使用Font类呢？<br />
<br />
　　首先，由于手机设备的限制，手机中支持的字体类型很有限，所以在J2ME中只能使用手机支持的默认字体来构造Font类对象。下面是创建Font类的对象时使用的方法：<br />
<pre><br />
getFont(int face,int style,int size);<br />
</pre>
<br />
例如：<br />
<pre><br />
Font font = Font.getFont(Font.FACE_SYSTEM,Font.STYLE_BOLD,Font. SIZE_MEDIUM);<br />
</pre>
<br />
　　无论哪一个参数，都只能使用系统设置的数值，这些数值具体的大小在不同的手机上可能不同。下面对于其中的三个参数的取值做详细的介绍：<br />
　　face参数指字体的外观，其的取值：<br />
　　FACE_MONOSPACE——等宽字体<br />
　　FACE_PROPORTIONAL——均衡字体<br />
　　FACE_SYSTEM——系统字体<br />
　　style参数指字体的样式，其的取值：<br />
　　STYLE_BOLD——粗体<br />
　　STYLE_ITALIC——斜体<br />
　　STYLE_PLAIN——普通<br />
　　STYLE_UNDERLINED——下划线<br />
　　STYLE_BOLD | STYLE_ITALIC——粗斜体<br />
　　STYLE_UNDERLINED | STYLE_BOLD——带下划线粗体<br />
　　STYLE_UNDERLINED | STYLE_ITALIC——带下划线斜体<br />
　　STYLE_UNDERLINED | STYLE_ITALIC | STYLE_BOLD——带下划线的粗斜体<br />
　　size参数指字体的大小，其的取值：<br />
　　SIZE_SMALL——小<br />
　　SIZE_MEDIUM——中<br />
　　SIZE_LARGE——大<br />
　　通过上面的参数的值，可以组合出你需要的字体对象。<br />
<br />
　　下面是一些常用的字体操作：<br />
　　1. 获得系统的默认字体：<br />
<pre><br />
Font font = Font.getDefaultFont();<br />
</pre>
<br />
　　2. 在panit方法内部，假设Graphics参数的名称为g，则获得当前字体的方法是：<br />
<pre><br />
Font font = g.getFont();<br />
</pre>
<br />
　　3. 在panit方法内部，假设Graphics参数的名称为g，则设置当前字体的方法是：<br />
<pre><br />
g.setFont(font);<br />
</pre>
<br />
　　其中font为你构造好的字体对象。<br />
<br />
　　4. 在MIDP2.0中，List可以设置每行的字体格式，方法是：<br />
<pre><br />
list.setFont(0,font);<br />
</pre>
<br />
　　则上面的代码是将list中的第一行设置为font类型的字体。<br />
<br />
<br />
<span style="color: blue">二十一、在J2ME手机程序开发中使用颜色</span><br />
<br />
　　在J2ME手机开发过程中，需要经常用到颜色来进行绘制，增强程序的表现效果，下面就介绍一下如何使用颜色。<br />
<br />
　　由于J2ME技术比较简单，所以没有实现专门的颜色类，而只是使用RGB的概念来代表颜色。这里简单介绍一下RGB的概念，颜色是由红(Red)、绿(Green)、蓝(Blue)三原色组成的，所以可以使用这三个颜色的组合来代表一种具体的颜色，其中R、G、B的每个数值都位于0-255之间。在表达颜色的时候，即可以使用三个数字来表达，也可以使用一个格式如0X00RRGGBB这样格式的十六进制来表达，下面是常见颜色的表达形式：<br />
<br />
　　红色：(255,0,0)或0x00FF0000<br />
　　绿色：(0,255,0)或0x0000FF00<br />
　　蓝色：(255,255,255)或0x00FFFFFF<br />
　　其他颜色也可以通过上面的方式组合出来。<br />
<br />
　　知道了颜色的表达方式以后，下面来介绍一下如何在J2ME程序中使用颜色，涉及的方法均在Graphics类中，有以下几个：<br />
<br />
　　1.getColor()：<br />
　　获得当前使用的颜色，返回值是0x00RRGGBB格式的数字。例如：<br />
<pre><br />
int color = g.getColor();<br />
</pre>
<br />
　　其中g为Graphics类型的对象。<br />
<br />
　　2.setColor(int RGB)：<br />
　　设置使用的颜色。例如：<br />
<pre><br />
g.setColor(0x00ff0000);<br />
</pre>
<br />
<br />
　　3.setColor(int red, int green, int blue)<br />
　　和上面的方法作用一样，例如：<br />
<pre><br />
g.setColor(255,0,0);<br />
</pre>
<br />
　　在设置了Graphics使用的颜色以后，再进行绘制的时候，就可以绘制指定的颜色了。<br />
<br />
<br />
<span style="color: blue">二十二、在J2ME联网应用中获得客户端的手机号码</span><br />
<br />
　　在J2ME程序开发过程中，为了一定的需要，经常需要来获得用户的手机号码，但是这个功能却在标准的J2ME类库中没有提供。<br />
<br />
　　在使用中国移动的CMWAP方式连接网络时，中国移动会将用户的手机号码放在一个名称为x-up-calling-line-id的头信息中，可以通过读取该头信息，获得用户的手机号码，具体代码如下：<br />
<pre><br />
String usermphone = http.getHeader("x-up-calling-line-id");<br />
</pre>
<br />
　　其中http是HttpConnction类型的对象。<br />
<br />
<span style="color: blue">二十三、使用J2ME发送手机短信息</span><br />
<br />
　　在程序中，发送短信息的方式一般有三种：<br />
<br />
　　1、 使用程序在网络上发送短信息，例如各大网站的短信业务。这种方式是通过程序将信息发送给运营商的网关服务器，然后通过运营商的网络发送给手机。<br />
<br />
　　2、 在计算机中，通过数据线连接到手机，然后通过手机来发送短信息。这种方式是通过使用AT指令来实现。爱立信手机的AT指令你可以在以下地址找到：<br />
<a href="http://mobilityworld.ericsson.com.cn/development/download_hit.asp" target="_new">http://mobilityworld.ericsson.com.cn/development/download_hit.asp</a><br />
<br />
　　3、 通过在手机中运行的程序来发送短信息。这个正是本文实现的方式。<br />
　　在J2ME中，如果想发送短信息，需要使用WMA包，MIDP2.0中已经包含，MIDP1.0中可以通过厂商提供的扩展API实现，和WMA的类库基本一样。<br />
<br />
下面是使用WMA向指定手机号码发送短信息的一个方法，很简单。当然WMA也提供了其他的方式来发送更多的内容。<br />
<pre><br />
// SMSUtil.java<br />
package my.util;<br />
import javax.wireless.messaging.*;<br />
import javax.microedition.io.*;<br />
/**<br />
* 发送文本短信息的方法<br />
*/<br />
public class SMSUtil<br />
{<br />
/**<br />
* 给指定号码发送短信息<br />
* @param content 短信息内容<br />
* @param phoneNumber 手机号码<br />
* @return 发送成功返回true，否则返回false<br />
*/<br />
public static boolean send(String content,String phoneNumber)<br />
{<br />
//返回值<br />
boolean result = true;<br />
try<br />
{<br />
//地址<br />
String address = "sms://+" + phoneNumber;<br />
//建立连接<br />
MessageConnection conn = (MessageConnection)Connector.open(address);<br />
//设置短信息类型为文本，短信息有文本和二进制两种类型<br />
TextMessage msg = (TextMessage)conn.newMessage(MessageConnection.TEXT_MESSAGE);<br />
//设置信息内容<br />
msg.setPayloadText(content);<br />
//发送<br />
conn.send(msg);<br />
}<br />
catch(Exception e)<br />
{<br />
result = false;<br />
//未处理<br />
}<br />
return result;<br />
} <br />
}<br />
</pre>
<br />
<br />
<span style="color: blue">二十四、使用简单的J2ME程序测试MIDlet的生命周期</span><br />
<br />
　　在MIDlet程序学习中，生命周期是一个比较抽象的概念。其实生命周期就是一个简单的规定，规定了MIDlet中的每个方法，什么时候被系统调用。下面是一个示例代码，在每个方法的内部都输出一条语句，可以根据程序的输出结果来验证各方法被调用的顺序，具体代码如下：<br />
<pre><br />
//文件名：LifeCircleMIDlet.java<br />
import javax.microedition.midlet.*;<br />
/**<br />
* 测试MIDlet的生命周期<br />
*/<br />
public class LifeCircleMIDlet extends MIDlet<br />
{<br />
/**<br />
* 默认构造方法<br />
*/<br />
public LifeCircleMIDlet()<br />
{<br />
System.out.println("默认构造方法");<br />
}<br />
/**<br />
* 启动方法<br />
*/<br />
public void startApp()<br />
{<br />
System.out.println("startApp方法");<br />
}<br />
/**<br />
* 暂停方法<br />
*/<br />
public void pauseApp()<br />
{<br />
System.out.println("pauseApp方法"); <br />
}<br />
/**<br />
* 销毁方法<br />
* @param b <br />
*/<br />
public void destroyApp(boolean b)<br />
{<br />
System.out.println("destroyApp方法"); <br />
} <br />
}<br />
</pre>
<br />
　　在J2WTK中运行该程序时，可以使用浏览器中的&#8220;MIDlet&#8221;菜单中的暂停和恢复菜单，模拟暂停事件。<br />
<br />
<span style="color: blue">二十五、使用OTA来发布你的程序</span><br />
<br />
　　众所周知，J2ME程序发布的形式主要有：OTA、数据线传输、红外和蓝牙传输等。这里简单说说如何通过OTA来发布你的程序。<br />
<br />
　　OTA是Over The Air的简写，也就是通过网络下载，这是主要的发布形式之一。现在的百宝箱都是采用这种形式。<br />
<br />
　　使用OTA来发布程序，需要如下几个步骤：<br />
　　1、在你的WEB服务器上添加对于jad和jar文件的MIME支持。<br />
　　后缀名:jad<br />
　　MIME类型:text/vnd.sun.j2me.app-descriptor<br />
　　后缀名:jar<br />
　　MIME类型:application/java-archive<br />
<br />
　　2、发布WML页面：<br />
　　例如你的jar文件名test.jad，则最简单的下载页面是：<br />
&nbsp;
<p style="margin: 0cm 0cm 0pt 39pt"><font face="Times New Roman" size="2">&lt;?xml version="1.0"?&gt; </font></p>
<p style="margin: 0cm 0cm 0pt 39pt"><font face="Times New Roman" size="2">&lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.3//EN" </font></p>
<p style="margin: 0cm 0cm 0pt 39pt"><font face="Times New Roman" size="2">"http://www.wapforum.org/DTD/wml13.dtd"&gt; </font></p>
<p style="margin: 0cm 0cm 0pt 39pt"><font face="Times New Roman" size="2">&lt;wml&gt; </font></p>
<p style="margin: 0cm 0cm 0pt 49.45pt"><font face="Times New Roman" size="2">&lt;card id="card1" title="Download Midlet"&gt; </font></p>
<p style="margin: 0cm 0cm 0pt 49.45pt; text-indent: 13.55pt"><font face="Times New Roman" size="2">&lt;a href="test.jad"&gt;test&lt;/a&gt; </font></p>
<p style="margin: 0cm 0cm 0pt 49.45pt"><font face="Times New Roman" size="2">&lt;/card&gt; </font></p>
<p style="margin: 0cm 0cm 0pt 39pt"><font face="Times New Roman" size="2">&lt;/wml&gt;</font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><span style="font-family: 宋体">你可以将以上代码保存在</span><font face="Times New Roman">WEB</font><span style="font-family: 宋体">服务器上，例如保存为</span><font face="Times New Roman">text.wml</font></font></p>
<p style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt; tab-stops: list 39.0pt"><font size="2"><font face="Times New Roman">3、&nbsp;</font><span style="font-family: 宋体">修改</span><font face="Times New Roman">jad</font><span style="font-family: 宋体">文件：</span></font></p>
<p style="margin: 0cm 0cm 0pt 39pt"><font size="2"><span style="font-family: 宋体">在</span><font face="Times New Roman">jad</font><span style="font-family: 宋体">文件中增加</span></font></p>
<p style="margin: 0cm 0cm 0pt 39pt"><font face="Times New Roman" size="2">MIDlet-Jar-URL: http://domain/directory/test.jar</font></p>
<p style="margin: 0cm 0cm 0pt 39pt"><font size="2"><span style="font-family: 宋体">其中的</span><font face="Times New Roman">http://domain/directory/test.jar</font><span style="font-family: 宋体">为你的</span><font face="Times New Roman">jar</font><span style="font-family: 宋体">文件的路径。</span></font></p>
<p style="margin: 0cm 0cm 0pt">
<p style="margin: 0cm 0cm 0pt"><font size="3"><font size="2"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><span style="font-family: 宋体">经过上面的设置，你就可以将你的</span><font face="Times New Roman">wml</font><span style="font-family: 宋体">页面路径作为你的</span><font face="Times New Roman">WAP</font><span style="font-family: 宋体">下载页面发布了。用户只需要在手机上输入这个路径就可以访问和下载你的程序了。</span></font></font></p>
<img src ="http://www.blogjava.net/bingle/aggbug/264597.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bingle/" target="_blank">冰浪</a> 2009-04-09 10:50 <a href="http://www.blogjava.net/bingle/archive/2009/04/09/264597.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2ME连连看基础功能源代码</title><link>http://www.blogjava.net/bingle/archive/2009/04/09/264592.html</link><dc:creator>冰浪</dc:creator><author>冰浪</author><pubDate>Thu, 09 Apr 2009 02:25:00 GMT</pubDate><guid>http://www.blogjava.net/bingle/archive/2009/04/09/264592.html</guid><wfw:comment>http://www.blogjava.net/bingle/comments/264592.html</wfw:comment><comments>http://www.blogjava.net/bingle/archive/2009/04/09/264592.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bingle/comments/commentRss/264592.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bingle/services/trackbacks/264592.html</trackback:ping><description><![CDATA[<div style="text-align: center">J2ME连连看基础功能源代码(含详细注释)<br />
作者：陈跃峰<br />
出自：http://blog.csdn.net/mailbomb</div>
<br />
//界面类代码<br />
import javax.microedition.lcdui.Canvas;<br />
import javax.microedition.lcdui.Graphics;<br />
<br />
/**<br />
&nbsp;* 连连看游戏界面<br />
&nbsp;*/<br />
public class LinkCanvas extends Canvas implements Runnable{<br />
&nbsp;&nbsp;&nbsp; /**游戏逻辑类*/<br />
&nbsp;&nbsp;&nbsp; GameEngine engine;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**屏幕宽度*/<br />
&nbsp;&nbsp;&nbsp; int width;<br />
&nbsp;&nbsp;&nbsp; /**屏幕高度*/<br />
&nbsp;&nbsp;&nbsp; int height;<br />
&nbsp;&nbsp;&nbsp; public LinkCanvas(){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //创建对象<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; engine = new GameEngine();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //获得屏幕的高度和宽度<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; width = getWidth();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; height = getHeight();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //启动线程<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Thread t = new Thread(this);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; t.start();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; &nbsp;* 绘制方法<br />
&nbsp;&nbsp;&nbsp; &nbsp;*/<br />
&nbsp;&nbsp;&nbsp; protected void paint(Graphics g) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //清屏<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; clearScreen(g);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //绘制地图<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; engine.paintMap(g);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //绘制选择框<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; engine.paintSelectArea(g);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //绘制连线<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; engine.paintLinkLine(g);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; &nbsp;* 清屏方法<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @param g 画笔<br />
&nbsp;&nbsp;&nbsp; &nbsp;*/<br />
&nbsp;&nbsp;&nbsp; private void clearScreen(Graphics g){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g.setColor(0xffffff);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g.fillRect(0, 0, width, height);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g.setColor(0);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public void keyPressed(int keyCode){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int action = getGameAction(keyCode);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; switch(action){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case UP:<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; engine.moveUP();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case DOWN:<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; engine.moveDown();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case LEFT:<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; engine.moveLeft();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case RIGHT:<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; engine.moveRight();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case FIRE:<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; engine.fire();//选择块<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void run() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try{<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while(true){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //延时<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Thread.sleep(100);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //每次判断逻辑<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; engine.action();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; repaint();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }catch(Exception e){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
//逻辑类源代码<br />
import java.util.*;<br />
import javax.microedition.lcdui.*;<br />
/**<br />
&nbsp;* 游戏数据和逻辑类<br />
&nbsp;*/<br />
public class GameEngine {<br />
&nbsp;&nbsp;&nbsp; /**选中块的个数*/<br />
&nbsp;&nbsp;&nbsp; private int selectTileNum = 0;<br />
&nbsp;&nbsp;&nbsp; //第一个选择块的行号和列号<br />
&nbsp;&nbsp;&nbsp; /**行号*/<br />
&nbsp;&nbsp;&nbsp; private int firstRow;<br />
&nbsp;&nbsp;&nbsp; /**列号*/<br />
&nbsp;&nbsp;&nbsp; private int firstCol;<br />
&nbsp;&nbsp;&nbsp; //第二个选择块的行号和列号<br />
&nbsp;&nbsp;&nbsp; /**行号*/<br />
&nbsp;&nbsp;&nbsp; private int secondRow;<br />
&nbsp;&nbsp;&nbsp; /**列号*/<br />
&nbsp;&nbsp;&nbsp; private int secondCol;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; //当前选择框，默认在左上角<br />
&nbsp;&nbsp;&nbsp; /**当前选择框的行号*/<br />
&nbsp;&nbsp;&nbsp; private int cRow;<br />
&nbsp;&nbsp;&nbsp; /**当前选择框的列号*/<br />
&nbsp;&nbsp;&nbsp; private int cCol;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**最大行数*/<br />
&nbsp;&nbsp;&nbsp; private final int MAX_ROW = 10;<br />
&nbsp;&nbsp;&nbsp; /**最大列数*/<br />
&nbsp;&nbsp;&nbsp; private final int MAX_COL = 10;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**地图数据，0代表空，数据1-10分别代表十种不同的结构*/<br />
&nbsp;&nbsp;&nbsp; private int[][] map = new int[MAX_ROW][MAX_COL];<br />
&nbsp;&nbsp;&nbsp; /**随机数对象*/<br />
&nbsp;&nbsp;&nbsp; private Random ran = new Random();<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; //地图区域左上角的坐标<br />
&nbsp;&nbsp;&nbsp; private final int LEFTX = 20;<br />
&nbsp;&nbsp;&nbsp; private final int LEFTY = 50;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**每个单元格的宽度*/<br />
&nbsp;&nbsp;&nbsp; private final int TILE_WIDTH = 20;<br />
&nbsp;&nbsp;&nbsp; /**每个单元格的高度*/<br />
&nbsp;&nbsp;&nbsp; private final int TILE_HEIGHT = 20;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**连线类型*/<br />
&nbsp;&nbsp;&nbsp; private int linkType;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**无法连线*/<br />
&nbsp;&nbsp;&nbsp; private final int NO_LINK = 0;<br />
&nbsp;&nbsp;&nbsp; /**水平连线*/<br />
&nbsp;&nbsp;&nbsp; private final int H_LINK = 1;<br />
&nbsp;&nbsp;&nbsp; /**垂直联系*/<br />
&nbsp;&nbsp;&nbsp; private final int V_LINK = 2;<br />
&nbsp;&nbsp;&nbsp; /**一个拐点，先移动x*/<br />
&nbsp;&nbsp;&nbsp; private final int ONE_CORNER_FIRSTX = 3;<br />
&nbsp;&nbsp;&nbsp; /**一个拐点，先移动y*/<br />
&nbsp;&nbsp;&nbsp; private final int ONE_CORNER_FIRSTY = 4;<br />
&nbsp;&nbsp;&nbsp; /**两个拐点，待完善*/<br />
&nbsp;&nbsp;&nbsp; private final int TWO_CORNER = 5;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; &nbsp;* 两次拐弯的行号和列号<br />
&nbsp;&nbsp;&nbsp; &nbsp;* 数据格式为：<br />
&nbsp;&nbsp;&nbsp; &nbsp;*&nbsp;&nbsp; 第一个拐点的行号，第一个拐点的列号，第二个拐点的行号，第二个拐点的列号<br />
&nbsp;&nbsp;&nbsp; &nbsp;*/<br />
&nbsp;&nbsp;&nbsp; int[] p = new int[4]; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public GameEngine(){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //初始化地图数据<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; initMap();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; &nbsp;* 初始化地图数据<br />
&nbsp;&nbsp;&nbsp; &nbsp;*/<br />
&nbsp;&nbsp;&nbsp; private void initMap(){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(int row = 0;row &lt; map.length;row++){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(int col = 0;col &lt; map[row].length;col++){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; map[row][col] = row + 1;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //循环打乱10次<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int tempRow;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int tempCol;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int temp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(int i = 0;i &lt; 10;i++){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(int row = 0;row &lt; map.length;row++){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(int col = 0;col &lt; map[row].length;col++){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //随机行号<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; tempRow = Math.abs(ran.nextInt() % 10);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //随机列号<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; tempCol = Math.abs(ran.nextInt() % 10);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //如果不是同一个单元格，则交换数据<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(!((tempRow == row) &amp;&amp; (tempCol == col))){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; temp = map[row][col];<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; map[row][col] = map[tempRow][tempCol];<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; map[tempRow][tempCol] = temp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; &nbsp;* 绘制地图数据<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @param g 画笔<br />
&nbsp;&nbsp;&nbsp; &nbsp;*/<br />
&nbsp;&nbsp;&nbsp; public void paintMap(Graphics g){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(int row = 0;row &lt; map.length;row++){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(int col = 0;col &lt; map[row].length;col++){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //如果没有数据，则跳过<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(map[row][col] == 0){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; continue;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }else{//绘制方块<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //绘制方框<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g.drawRect(LEFTX + col * TILE_WIDTH, LEFTY + row * TILE_HEIGHT, TILE_WIDTH, TILE_HEIGHT);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //绘制数字<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g.drawString(String.valueOf(map[row][col]), LEFTX + col * TILE_WIDTH + 5, <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; LEFTY + row * TILE_HEIGHT + 4, <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Graphics.TOP | Graphics.LEFT);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; &nbsp;* 绘制选择框<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @param g 画笔<br />
&nbsp;&nbsp;&nbsp; &nbsp;*/<br />
&nbsp;&nbsp;&nbsp; public void paintSelectArea(Graphics g){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //绘制当前选择框<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g.setColor(0xff00);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g.drawRect(LEFTX + cCol * TILE_WIDTH, LEFTY + cRow * TILE_HEIGHT, TILE_WIDTH, TILE_HEIGHT);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g.setColor(0);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //绘制选中项<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; switch(selectTileNum){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case 1:&nbsp; //选择一个<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g.setColor(0xff0000);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g.drawRect(LEFTX + firstCol * TILE_WIDTH, LEFTY + firstRow * TILE_HEIGHT, TILE_WIDTH, TILE_HEIGHT);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g.setColor(0);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case 2:&nbsp; //选中两个<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g.setColor(0xff0000);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g.drawRect(LEFTX + firstCol * TILE_WIDTH, LEFTY + firstRow * TILE_HEIGHT, TILE_WIDTH, TILE_HEIGHT);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g.drawRect(LEFTX + secondCol * TILE_WIDTH, LEFTY + secondRow * TILE_HEIGHT, TILE_WIDTH, TILE_HEIGHT);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g.setColor(0);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; &nbsp;* 绘制方块连线<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @param g 画笔<br />
&nbsp;&nbsp;&nbsp; &nbsp;*/<br />
&nbsp;&nbsp;&nbsp; public void paintLinkLine(Graphics g){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //如果无连线，则直接返回<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(linkType == NO_LINK){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //根据连线类型实现绘制<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //绘制到方块的中心点<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; switch(linkType){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case H_LINK://水平<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case V_LINK://垂直<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; paintLine(g,firstRow,firstCol,secondRow,secondCol);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case ONE_CORNER_FIRSTX://一个拐弯，先移动X<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //水平线<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; paintLine(g,firstRow,firstCol,firstRow,secondCol);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //垂直线<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; paintLine(g,firstRow,secondCol,secondRow,secondCol);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case ONE_CORNER_FIRSTY://一个拐弯，先移动Y<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //水平线<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; paintLine(g,firstRow,firstCol,secondRow,firstCol);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //垂直线<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; paintLine(g,secondRow,firstCol,secondRow,secondCol);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case TWO_CORNER:<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //块1到第一个拐点的连线<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; paintLine(g,firstRow,firstCol,p[0],p[1]);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //两个拐点之间的连线<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; paintLine(g,p[0],p[1],p[2],p[3]);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //第二个拐点到块2的连线<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; paintLine(g,p[2],p[3],secondRow,secondCol);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //逻辑代码，清除连接类型<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; linkType = NO_LINK;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; &nbsp;* 绘制两个方块中心点的连线<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @param g&nbsp; 画笔<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @param r1 方块1的行号<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @param c1 方块1的列号<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @param r2 方块2的行号<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @param c2 方块2的列号<br />
&nbsp;&nbsp;&nbsp; &nbsp;*/<br />
&nbsp;&nbsp;&nbsp; private void paintLine(Graphics g,int r1,int c1,int r2,int c2){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g.drawLine(LEFTX + c1 * TILE_WIDTH + TILE_WIDTH/2, <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; LEFTY + r1 * TILE_HEIGHT + TILE_HEIGHT/2, <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; LEFTX + c2 * TILE_WIDTH + TILE_WIDTH/2,<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; LEFTY + r2 * TILE_HEIGHT + TILE_HEIGHT/2);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; &nbsp;* 向左移动选择框<br />
&nbsp;&nbsp;&nbsp; &nbsp;*/<br />
&nbsp;&nbsp;&nbsp; public void moveLeft(){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(cCol &gt; 0){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cCol--;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; &nbsp;* 向右移动选择框<br />
&nbsp;&nbsp;&nbsp; &nbsp;*/<br />
&nbsp;&nbsp;&nbsp; public void moveRight(){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(cCol &lt; MAX_COL -1){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cCol++;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; &nbsp;* 向上移动选择框<br />
&nbsp;&nbsp;&nbsp; &nbsp;*/<br />
&nbsp;&nbsp;&nbsp; public void moveUP(){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(cRow &gt; 0){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cRow--;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; &nbsp;* 向下移动选择框<br />
&nbsp;&nbsp;&nbsp; &nbsp;*/<br />
&nbsp;&nbsp;&nbsp; public void moveDown(){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(cRow &lt; MAX_ROW - 1){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cRow++;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; &nbsp;* 确定键逻辑处理<br />
&nbsp;&nbsp;&nbsp; &nbsp;*/<br />
&nbsp;&nbsp;&nbsp; public void fire(){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //如果选择的块为空，则直接返回<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(map[cRow][cCol] == 0){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //选中的块的数量增加1<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; selectTileNum++;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //判别存储位置<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; switch(selectTileNum){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case 1: //第一次选择<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; firstRow = cRow;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; firstCol = cCol;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case 2: //第二次选择<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //选择同一个块,2个选择块都失去选中<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if((firstRow == cRow) &amp;&amp; (firstCol == cCol)){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; selectTileNum = 0;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; secondRow = cRow;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; secondCol = cCol;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; &nbsp;* 判断(r1,c1)块和(r2,c2)块中间是否为空行<br />
&nbsp;&nbsp;&nbsp; &nbsp;* 不包含这两个块<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @param r1 块1的行号<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @param c1 块1的列号<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @param r2 块2的行号<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @param c2 块2的列号<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @return true代表为空，false代表不为空<br />
&nbsp;&nbsp;&nbsp; &nbsp;*/&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp; private boolean isEmptyRow(int r1,int c1,int r2,int c2){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //判断是否位于同一行<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(r1 != r2){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //判断两个块的相对位置<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(c1 &gt; c2){ //第一块位于右侧<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(int col = c1 - 1;col &gt; c2;col--){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //如果有非空块<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(map[r1][col] != 0){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }else{ //第一块位于左侧<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(int col = c2 - 1;col &gt; c1;col--){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //如果有非空块<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(map[r1][col] != 0){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return true;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; &nbsp;* 判断块(r1,c1)和块(r2,c2)之间是否是空列<br />
&nbsp;&nbsp;&nbsp; &nbsp;* 不包含这两个块<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @param r1 块1的行号<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @param c1 块1的列号<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @param r2 块2的行号<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @param c2 块2的列号<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @return true代表为空，false代表不为空<br />
&nbsp;&nbsp;&nbsp; &nbsp;*/<br />
&nbsp;&nbsp;&nbsp; private boolean isEmptyCol(int r1,int c1,int r2,int c2){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //判断是否位于同一列<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(c1 != c2){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //判断两个块的相对位置<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(r2 &gt; r1){//第一个块在上方<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(int row = r1 + 1;row &lt; r2;row++){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //如果有非空块<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(map[row][c1] != 0){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }else{//第二个块在上方<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(int row = r2 + 1;row &lt; r1;row++){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //如果有非空块<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(map[row][c1] != 0){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return true;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; &nbsp;* 判断一个块是否为空<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @param r 块的行号<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @param c 块的列号<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @return true代表为空，false代表不空<br />
&nbsp;&nbsp;&nbsp; &nbsp;*/<br />
&nbsp;&nbsp;&nbsp; private boolean isEmptyCell(int r,int c){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return map[r][c] == 0;<br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; &nbsp;* 是否是一次转弯实现连线<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @return NO_LINK代表没有连线，其他值代表对应的连线类型<br />
&nbsp;&nbsp;&nbsp; &nbsp;*/<br />
&nbsp;&nbsp;&nbsp; private int isOneCornerLink(int r1,int c1,int r2,int c2){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //先移动行，再移动列<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(isEmptyCell(r1,c2)){ //转折点为空<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(isEmptyRow(r1,c1,r1,c2) &amp; isEmptyCol(r1,c2,r2,c2)){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return ONE_CORNER_FIRSTX;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //先移动列，再移动行<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(isEmptyCell(r2,c1)){//转折点为空<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(isEmptyCol(r1,c1,r2,c1) &amp; isEmptyRow(r2,c1,r2,c2)) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return ONE_CORNER_FIRSTY;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //无连接<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return NO_LINK;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; &nbsp;* 是否经过2次转折实现连接<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @param r1 块1的行号<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @param c1 块1的列号<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @param r2 块2的行号<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @param c2 块2的列号<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @return true代表可以连接，false代表不能<br />
&nbsp;&nbsp;&nbsp; &nbsp;*/<br />
&nbsp;&nbsp;&nbsp; private boolean isTwoCornerLink(int r1,int c1,int r2,int c2){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int result;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //正常情况，划分成4个方向<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //块1向上<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(int row = r1 -1;row &gt;= 0;row--){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //如果有数据不为空，则直接结束该方向的尝试<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(map[row][c1] != 0){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //存储第一个拐点的坐标<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[0] = row;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[1] = c1;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //每次都尝试转折，则变成一个转点的操作<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; result = isOneCornerLink(row,c1,r2,c2);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //如果可以连接<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(result != NO_LINK){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //存储第二个拐点的位置<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; switch(result){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case ONE_CORNER_FIRSTX:<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[2] = row;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[3] = c2;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case ONE_CORNER_FIRSTY:<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[2] = r2;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[3] = c1;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return true;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //块1向下<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(int row = r1 + 1;row &lt; MAX_ROW;row++){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //如果有数据不为空，则直接结束该方向的尝试<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(map[row][c1] != 0){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //存储第一个拐点的坐标<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[0] = row;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[1] = c1;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //每次都尝试转折，则变成一个转点的操作<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; result = isOneCornerLink(row,c1,r2,c2);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //如果可以连接<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(result != NO_LINK){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //存储第二个拐点的位置<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; switch(result){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case ONE_CORNER_FIRSTX:<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[2] = row;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[3] = c2;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case ONE_CORNER_FIRSTY:<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[2] = r2;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[3] = c1;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return true;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //块1向左<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(int col = c1 -1;col &gt;= 0;col--){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //如果有数据不为空，则直接结束该方向的尝试<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(map[r1][col] != 0){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //存储第一个拐点的坐标<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[0] = r1;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[1] = col;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //每次都尝试转折，则变成一个转点的操作<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; result = isOneCornerLink(r1,col,r2,c2);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //如果可以连接<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(result != NO_LINK){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //存储第二个拐点的位置<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; switch(result){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case ONE_CORNER_FIRSTX:<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[2] = r1;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[3] = c2;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case ONE_CORNER_FIRSTY:<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[2] = r2;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[3] = col;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return true;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //块1向右<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(int col = c1&nbsp; + 1;col &lt; MAX_COL;col++){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //如果有数据不为空，则直接结束该方向的尝试<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(map[r1][col] != 0){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //存储第一个拐点的坐标<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[0] = r1;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[1] = col;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //每次都尝试转折，则变成一个转点的操作<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; result = isOneCornerLink(r1,col,r2,c2);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //如果可以连接<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(result != NO_LINK){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //存储第二个拐点的位置<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; switch(result){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case ONE_CORNER_FIRSTX:<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[2] = r1;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[3] = c2;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case ONE_CORNER_FIRSTY:<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[2] = r2;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[3] = col;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return true;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //四个特例，也就是超出地图区域的连接<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //实现地图区域上侧的连接，也就是到上侧是一个空列<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if((isEmptyCol(r1,c1,-1,c1)) &amp; (isEmptyCol(r2,c2,-1,c2))){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[0] = -1;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[1] = c1;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[2] = -1;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[3] = c2;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return true;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //左侧<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if((isEmptyRow(r1,c1,r1,-1)) &amp; (isEmptyRow(r2,c2,r2,-1))){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[0] = r1;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[1] = -1;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[2] = r2;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[3] = -1;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return true;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //下侧<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if((isEmptyCol(r1,c1,MAX_ROW,c1)) &amp; (isEmptyCol(r2,c2,MAX_ROW,c2))){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[0] = MAX_ROW;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[1] = c1;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[2] = MAX_ROW;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[3] = c2;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return true;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //右侧<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if((isEmptyRow(r1,c1,r1,MAX_COL)) &amp; (isEmptyRow(r2,c2,r2,MAX_COL))){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[0] = r1;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[1] = MAX_COL;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[2] = r2;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p[3] = MAX_COL;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return true;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; &nbsp;* 逻辑判断是否有连线<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @return NO_LINK代表无连线，其它数据代表有连线<br />
&nbsp;&nbsp;&nbsp; &nbsp;*/<br />
&nbsp;&nbsp;&nbsp; private int logic(){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //如果数值不同<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(map[firstRow][firstCol] != map[secondRow][secondCol]){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return NO_LINK;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //判断连接方式<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(isEmptyRow(firstRow,firstCol,secondRow,secondCol)){ //水平连线<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return H_LINK;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(isEmptyCol(firstRow,firstCol,secondRow,secondCol)){//垂直连线<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return V_LINK;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //一个转点的连接<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int result = isOneCornerLink(firstRow,firstCol,secondRow,secondCol);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(result != NO_LINK){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //两个转点的连接<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(isTwoCornerLink(firstRow,firstCol,secondRow,secondCol)){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return TWO_CORNER;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //返回无连接<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return NO_LINK;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; &nbsp;* 逻辑判别和逻辑处理<br />
&nbsp;&nbsp;&nbsp; &nbsp;*/<br />
&nbsp;&nbsp;&nbsp; public boolean action(){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //判断是否选择两个方块<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(selectTileNum != 2){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; boolean b = false;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //判断是否有连线<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; linkType = logic();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //如果有连线，则消失<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(linkType != NO_LINK){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; map[firstRow][firstCol] = 0;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; map[secondRow][secondCol] = 0;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; b = true;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //选择的块数初始化<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; selectTileNum = 0;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return b;<br />
&nbsp;&nbsp;&nbsp; }<br />
}
<img src ="http://www.blogjava.net/bingle/aggbug/264592.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bingle/" target="_blank">冰浪</a> 2009-04-09 10:25 <a href="http://www.blogjava.net/bingle/archive/2009/04/09/264592.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>非常棒的文章推荐</title><link>http://www.blogjava.net/bingle/archive/2009/04/09/264590.html</link><dc:creator>冰浪</dc:creator><author>冰浪</author><pubDate>Thu, 09 Apr 2009 01:48:00 GMT</pubDate><guid>http://www.blogjava.net/bingle/archive/2009/04/09/264590.html</guid><wfw:comment>http://www.blogjava.net/bingle/comments/264590.html</wfw:comment><comments>http://www.blogjava.net/bingle/archive/2009/04/09/264590.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bingle/comments/commentRss/264590.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bingle/services/trackbacks/264590.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: J2ME 非常棒的文章推荐<br>想学习J2ME的朋友可要仔细看看我这篇文章哦<br>&nbsp;&nbsp;<a href='http://www.blogjava.net/bingle/archive/2009/04/09/264590.html'>阅读全文</a><img src ="http://www.blogjava.net/bingle/aggbug/264590.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bingle/" target="_blank">冰浪</a> 2009-04-09 09:48 <a href="http://www.blogjava.net/bingle/archive/2009/04/09/264590.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2ME安全域</title><link>http://www.blogjava.net/bingle/archive/2009/04/09/264587.html</link><dc:creator>冰浪</dc:creator><author>冰浪</author><pubDate>Thu, 09 Apr 2009 01:43:00 GMT</pubDate><guid>http://www.blogjava.net/bingle/archive/2009/04/09/264587.html</guid><wfw:comment>http://www.blogjava.net/bingle/comments/264587.html</wfw:comment><comments>http://www.blogjava.net/bingle/archive/2009/04/09/264587.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bingle/comments/commentRss/264587.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bingle/services/trackbacks/264587.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: MIDP 2.0标准定义了4个安全域（Security Domain），每一个MIDlet在安装之后，都被分配到其中一个安全与当中&nbsp;&nbsp;<a href='http://www.blogjava.net/bingle/archive/2009/04/09/264587.html'>阅读全文</a><img src ="http://www.blogjava.net/bingle/aggbug/264587.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bingle/" target="_blank">冰浪</a> 2009-04-09 09:43 <a href="http://www.blogjava.net/bingle/archive/2009/04/09/264587.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用MMAPI播放gif动画</title><link>http://www.blogjava.net/bingle/archive/2009/04/09/264586.html</link><dc:creator>冰浪</dc:creator><author>冰浪</author><pubDate>Thu, 09 Apr 2009 01:42:00 GMT</pubDate><guid>http://www.blogjava.net/bingle/archive/2009/04/09/264586.html</guid><wfw:comment>http://www.blogjava.net/bingle/comments/264586.html</wfw:comment><comments>http://www.blogjava.net/bingle/archive/2009/04/09/264586.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bingle/comments/commentRss/264586.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bingle/services/trackbacks/264586.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: MMAPI是在JSR 135中提出的，增强了Java ME平台对多媒体编程的支持。例如播放音频和视频文件，捕获声音和图像等。目前大多数支持JTWI 1.0的手机都支持了MMAPI。本文介绍如何使用MMAPI播放gif格式的动画。&nbsp;&nbsp;<a href='http://www.blogjava.net/bingle/archive/2009/04/09/264586.html'>阅读全文</a><img src ="http://www.blogjava.net/bingle/aggbug/264586.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bingle/" target="_blank">冰浪</a> 2009-04-09 09:42 <a href="http://www.blogjava.net/bingle/archive/2009/04/09/264586.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用KXML</title><link>http://www.blogjava.net/bingle/archive/2009/04/09/264585.html</link><dc:creator>冰浪</dc:creator><author>冰浪</author><pubDate>Thu, 09 Apr 2009 01:39:00 GMT</pubDate><guid>http://www.blogjava.net/bingle/archive/2009/04/09/264585.html</guid><wfw:comment>http://www.blogjava.net/bingle/comments/264585.html</wfw:comment><comments>http://www.blogjava.net/bingle/archive/2009/04/09/264585.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bingle/comments/commentRss/264585.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bingle/services/trackbacks/264585.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: KXML是一个只占很小存储空间的XML语法分析程序，对于J2ME应用程序非常适合。它有一个非常独特的DOM操作方法和被称为Pull的语法分析方法。&nbsp;&nbsp;<a href='http://www.blogjava.net/bingle/archive/2009/04/09/264585.html'>阅读全文</a><img src ="http://www.blogjava.net/bingle/aggbug/264585.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bingle/" target="_blank">冰浪</a> 2009-04-09 09:39 <a href="http://www.blogjava.net/bingle/archive/2009/04/09/264585.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaME中文编码</title><link>http://www.blogjava.net/bingle/archive/2009/04/09/264584.html</link><dc:creator>冰浪</dc:creator><author>冰浪</author><pubDate>Thu, 09 Apr 2009 01:38:00 GMT</pubDate><guid>http://www.blogjava.net/bingle/archive/2009/04/09/264584.html</guid><wfw:comment>http://www.blogjava.net/bingle/comments/264584.html</wfw:comment><comments>http://www.blogjava.net/bingle/archive/2009/04/09/264584.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bingle/comments/commentRss/264584.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bingle/services/trackbacks/264584.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本文介绍JavaME中文编码的相关问题，这个问题一度是互联网上的开发者们讨论的热门话题。本文整理和综合了网上众多相关内容，尽可能的为开发者提供一个全面、系统的认识。 &nbsp;&nbsp;<a href='http://www.blogjava.net/bingle/archive/2009/04/09/264584.html'>阅读全文</a><img src ="http://www.blogjava.net/bingle/aggbug/264584.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bingle/" target="_blank">冰浪</a> 2009-04-09 09:38 <a href="http://www.blogjava.net/bingle/archive/2009/04/09/264584.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编写高效友好的多线程J2ME联网应用</title><link>http://www.blogjava.net/bingle/archive/2009/04/09/264583.html</link><dc:creator>冰浪</dc:creator><author>冰浪</author><pubDate>Thu, 09 Apr 2009 01:37:00 GMT</pubDate><guid>http://www.blogjava.net/bingle/archive/2009/04/09/264583.html</guid><wfw:comment>http://www.blogjava.net/bingle/comments/264583.html</wfw:comment><comments>http://www.blogjava.net/bingle/archive/2009/04/09/264583.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bingle/comments/commentRss/264583.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bingle/services/trackbacks/264583.html</trackback:ping><description><![CDATA[初次编写J2ME的联网应用程序的时候往往会写出这样的代码：<br />
public void commandAction(Command c, Displayable s) {<br />
&nbsp;&nbsp;&nbsp; if (c == mExitCommand)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; notifyDestroyed();<br />
&nbsp;&nbsp;&nbsp; else if (c == mConnectCommand)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connect();<br />
}<br />
<br />
private void connect() {<br />
&nbsp;&nbsp;&nbsp; String url = getAppProperty("NetworkThreading.URL");<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpConnection hc = (HttpConnection)Connector.open(url);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputStream in = hc.openInputStream();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int contentLength = (int)hc.getLength();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (contentLength == -1) contentLength = 255;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] raw = new byte[contentLength];<br />
........<br />
.......<br />
}<br />
当你运行这样的程序的时候会出现什么问题呢？wtk会提示你联网工作可能会堵塞用户输入，让你到另外一个线程去进行联网操作。OK，那么我们按照他的要求新建一个线程来进行联网，比如这样写：<br />
public void commandAction(Command c, Displayable s) {<br />
if (c == mExitCommand)<br />
&nbsp;&nbsp;&nbsp; notifyDestroyed();<br />
else if (c == mConnectCommand) {<br />
&nbsp;&nbsp;&nbsp; Thread t = new Thread() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void run() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connect();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; };<br />
&nbsp;&nbsp;&nbsp; t.start();<br />
}<br />
}<br />
这样联网就可以通过了，那么为什么会这样呢？明白事物背后的原理显得非常的重要，下面我做一下介绍，当程序运行的时候，Application Management Software(应用管理软件)首先初始化一个MIDlet,然后调用他的startApp()方法使得MIDlet进入active状态，这条程序分支就是主线程，他执行其他的方法后都会返回到这个分支上来继续执行。然后联网是个可能堵塞的操作，意味着他可能长时间都不返回。我曾经写的联网程序在手机上运行，的确比较耗费时间。如果他不返回，那么就不能进行后面的操作，用户也不能输入。这样看上去手机就像死了一样，这显然不够友好。看看下面的原理图吧：<br />
<img height="245" alt="Hijacking the system event thread" src="http://developers.sun.com/techtopics/mobility/images/midp-articles-threading-primitive.jpg" width="500" border="0" /><br />
当我们在应用程序中新建一个线程来处理联网或者浏览大量RMS数据的时候就不一样了。这时候启动线程后主线程会立刻返回，不会堵塞。<br />
<img height="246" alt="Using a new thread for network activity" src="http://developers.sun.com/techtopics/mobility/images/midp-articles-threading-threaded.jpg" width="500" border="0" /><br />
仔细想想这样同样有不好的地方，尽管他可以正常工作，但是每次用户按下按钮的时候都会有新的线程产生，这样显然不够高效。幸好java中提供了wait()和notify()/notifyAll()来协调这样的问题，我们启动线程后让他进入等待的状态，当用户按下按钮的时候才让他继续运行。代码类似这样：<br />
public synchronized void run() {<br />
while (mTrucking) {<br />
&nbsp;&nbsp;&nbsp; try { wait(); }<br />
&nbsp;&nbsp;&nbsp; catch (InterruptedException ie) {}<br />
&nbsp;&nbsp;&nbsp; if (mTrucking) connect();<br />
}<br />
}
<p>public synchronized void go() {<br />
notify();<br />
}<br />
<img height="244" alt="Using a single worker thread" src="http://developers.sun.com/techtopics/mobility/images/midp-articles-threading-single.jpg" width="500" border="0" /><br />
这样效率比较高了！当用户进行联网操作的时候我们应该做一个提示界面，比如一个动画告诉用户正在进行联网操作。这样比较友好。那么当用户选择联网动作的时候，我们让我提前做好的欢迎界面显示在屏幕上，联网结束后再把返回的结果显示出来。这样就是一个出色的联网应用程序了。下面的这个代码可以在屏幕上描绘一个动画的效果，当然你也可以修改一下做成自己喜欢的样子。<br />
import java.util.*;</p>
<p>import javax.microedition.lcdui.*;</p>
<p>public class WaitCanvas<br />
&nbsp;&nbsp;&nbsp; extends Canvas {<br />
private int mCount, mMaximum;<br />
private int mInterval;<br />
<br />
private int mWidth, mHeight, mX, mY, mRadius;<br />
private String mMessage;<br />
<br />
public WaitCanvas() {<br />
&nbsp;&nbsp;&nbsp; mCount = 0;<br />
&nbsp;&nbsp;&nbsp; mMaximum = 36;<br />
&nbsp;&nbsp;&nbsp; mInterval = 100;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; mWidth = getWidth();<br />
&nbsp;&nbsp;&nbsp; mHeight = getHeight();<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // Calculate the radius.<br />
&nbsp;&nbsp;&nbsp; int halfWidth = (mWidth - mRadius) / 2;<br />
&nbsp;&nbsp;&nbsp; int halfHeight = (mHeight - mRadius) / 2;<br />
&nbsp;&nbsp;&nbsp; mRadius = Math.min(halfWidth, halfHeight);<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // Calculate the location.<br />
&nbsp;&nbsp;&nbsp; mX = halfWidth - mRadius / 2;<br />
&nbsp;&nbsp;&nbsp; mY = halfHeight - mRadius / 2;</p>
<p>&nbsp;&nbsp;&nbsp; // Create a Timer to update the display.<br />
&nbsp;&nbsp;&nbsp; TimerTask task = new TimerTask() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void run() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mCount = (mCount 1) % mMaximum;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; repaint();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; };<br />
&nbsp;&nbsp;&nbsp; Timer timer = new Timer();<br />
&nbsp;&nbsp;&nbsp; timer.schedule(task, 0, mInterval);<br />
}<br />
<br />
public void setMessage(String s) {<br />
&nbsp;&nbsp;&nbsp; mMessage = s;<br />
&nbsp;&nbsp;&nbsp; repaint();<br />
}<br />
<br />
public void paint(Graphics g) {<br />
&nbsp;&nbsp;&nbsp; int theta = -(mCount * 360 / mMaximum);<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // Clear the whole screen.<br />
&nbsp;&nbsp;&nbsp; g.setColor(255, 255, 255);<br />
&nbsp;&nbsp;&nbsp; g.fillRect(0, 0, mWidth, mHeight);<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // Now draw the pinwheel.<br />
&nbsp;&nbsp;&nbsp; g.setColor(0, 0, 0);<br />
&nbsp;&nbsp;&nbsp; g.drawArc(mX, mY, mRadius, mRadius, 0, 360);<br />
&nbsp;&nbsp;&nbsp; g.fillArc(mX, mY, mRadius, mRadius, theta 90, 90);<br />
&nbsp;&nbsp;&nbsp; g.fillArc(mX, mY, mRadius, mRadius, theta 270, 90);<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // Draw the message, if there is a message.<br />
&nbsp;&nbsp;&nbsp; if (mMessage != null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.drawString(mMessage, mWidth / 2, mHeight,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Graphics.BOTTOM | Graphics.HCENTER);<br />
}<br />
}</p>
<img src ="http://www.blogjava.net/bingle/aggbug/264583.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bingle/" target="_blank">冰浪</a> 2009-04-09 09:37 <a href="http://www.blogjava.net/bingle/archive/2009/04/09/264583.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2ME中通过Http协议传输图片</title><link>http://www.blogjava.net/bingle/archive/2009/04/09/264582.html</link><dc:creator>冰浪</dc:creator><author>冰浪</author><pubDate>Thu, 09 Apr 2009 01:36:00 GMT</pubDate><guid>http://www.blogjava.net/bingle/archive/2009/04/09/264582.html</guid><wfw:comment>http://www.blogjava.net/bingle/comments/264582.html</wfw:comment><comments>http://www.blogjava.net/bingle/archive/2009/04/09/264582.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bingle/comments/commentRss/264582.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bingle/services/trackbacks/264582.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 其实传输图片和传输其他的数据没有什么区别只是我们选择怎样的处理方法，如果我们传输java基本数据类型或者String那么比较容易，直接writeInt() readInt()等方法就可以了。如果是传输一整个对象比如一个人的信息，那么可以使用序列化把它拆开为按照一定的顺序传输多个java的基本类型和String。至于图片显得要特殊一点，因为它是二进制的文件，Java中的InputStream提供了方法来读取二进制文件，如果你对此方面的知识不熟悉请参考使用Java操作二进制文件。<br>&nbsp;&nbsp;<a href='http://www.blogjava.net/bingle/archive/2009/04/09/264582.html'>阅读全文</a><img src ="http://www.blogjava.net/bingle/aggbug/264582.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bingle/" target="_blank">冰浪</a> 2009-04-09 09:36 <a href="http://www.blogjava.net/bingle/archive/2009/04/09/264582.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>优化J2ME中的paint()函数</title><link>http://www.blogjava.net/bingle/archive/2009/04/09/264581.html</link><dc:creator>冰浪</dc:creator><author>冰浪</author><pubDate>Thu, 09 Apr 2009 01:33:00 GMT</pubDate><guid>http://www.blogjava.net/bingle/archive/2009/04/09/264581.html</guid><wfw:comment>http://www.blogjava.net/bingle/comments/264581.html</wfw:comment><comments>http://www.blogjava.net/bingle/archive/2009/04/09/264581.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bingle/comments/commentRss/264581.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bingle/services/trackbacks/264581.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 我们经常会遇到这样的问题，在模拟器上跑得很好的程序在实际的手机上却很慢，甚至运行不了，这大多数是因为重画机制的使用不当所致，J2ME中的paint()函数起到了画屏幕的作用，往往在需要动画的情况下非常频繁地需要调用，而且在一些低端手机或移动设备上面，对于paint()函数的频繁调用会引起相应时间长甚至无法正常工作等问题。所以，对于paint()函数的优化就显得特别重要。这里，我们提出几点优化paint()函数的方法和注意事项，在编程中大家可以参考&nbsp;&nbsp;<a href='http://www.blogjava.net/bingle/archive/2009/04/09/264581.html'>阅读全文</a><img src ="http://www.blogjava.net/bingle/aggbug/264581.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bingle/" target="_blank">冰浪</a> 2009-04-09 09:33 <a href="http://www.blogjava.net/bingle/archive/2009/04/09/264581.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>各品牌手机键值</title><link>http://www.blogjava.net/bingle/archive/2009/04/09/264579.html</link><dc:creator>冰浪</dc:creator><author>冰浪</author><pubDate>Thu, 09 Apr 2009 01:28:00 GMT</pubDate><guid>http://www.blogjava.net/bingle/archive/2009/04/09/264579.html</guid><wfw:comment>http://www.blogjava.net/bingle/comments/264579.html</wfw:comment><comments>http://www.blogjava.net/bingle/archive/2009/04/09/264579.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bingle/comments/commentRss/264579.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bingle/services/trackbacks/264579.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 原文（http://www.jum.cn/bbs/archiver/?tid-8155.html）&nbsp;&nbsp;<a href='http://www.blogjava.net/bingle/archive/2009/04/09/264579.html'>阅读全文</a><img src ="http://www.blogjava.net/bingle/aggbug/264579.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bingle/" target="_blank">冰浪</a> 2009-04-09 09:28 <a href="http://www.blogjava.net/bingle/archive/2009/04/09/264579.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2ME点滴</title><link>http://www.blogjava.net/bingle/archive/2009/04/09/264578.html</link><dc:creator>冰浪</dc:creator><author>冰浪</author><pubDate>Thu, 09 Apr 2009 01:26:00 GMT</pubDate><guid>http://www.blogjava.net/bingle/archive/2009/04/09/264578.html</guid><wfw:comment>http://www.blogjava.net/bingle/comments/264578.html</wfw:comment><comments>http://www.blogjava.net/bingle/archive/2009/04/09/264578.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bingle/comments/commentRss/264578.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bingle/services/trackbacks/264578.html</trackback:ping><description><![CDATA[<div class="blog_content">Q: 按理说NOKIA的手机应该比moto及国产手机（MTK）性能要好一点，但是一个大的jar包（比如3MB）的J2ME程序在nokia上跑不起来，但在moto及国产手机上却能跑起来？ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A:一个经验丰富的高手告诉我说，主要是两者的JVM实现机制的差别。前者是加载所有的内容到内存，后者是按需加载。所以前者可以在有限的JAR包中提高性能，后者呢？各有利弊吧。 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Q:一个J2ME程序，在WTK下面可以很好的运行，但放在我的3250上面，可以成功安装，运行时却没有一点反应。真是郁闷。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A:&nbsp; 这种情况一般是由于内存占用的问题。WTK是在PC上跑的，内存相对来说不吃紧。你的J2ME程序如果在WTK模拟器的范围内，可以跑起来。但在手机上，却没有那么多的内存可用，自然跑不起来。 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Q:我的一个J2ME程序，在WTK下面可以正常的从Form切换到Canvas,但放到手机上，却死活切不过来，气死我啦。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A:这时，主要原因也可能是内存占用。 <br />
<br />
1、showNotify与hideNotify调用的时机。 <br />
显示顺序：canvas -&gt; Form -&gt; Canvas <br />
在canvas被绘制前，showNotify()会被调用，在showNotify()执行过程中如果有按键，则存在事件队列中，等showNotify()返回后在执行。 <br />
如果这个canvas设置了全屏，则showNotify()之后会调用sizeChanged() <br />
showNotify返回后，开始执行paint()。 <br />
这是如果要切换到Form，则会先调用hideNotify(),然后显示Form。从Form切换到canvas，则又会调用showNotify(),返回后，调用paint()。 <br />
<br />
2、在eclipse里面，也可以像JBuilder那样一次修改一个变量在多个地方的使用，方法是：选择变量 ，shift+alt+R，修改，确定，搞定 <br />
<br />
3、2ME中，如果想读取文本文件，最好是把这个文本文件用utf-8编码，然后在读取的时候，new&nbsp; String(bytes,"utf-8"); <br />
<br />
4、在eclipse中，如果出现不能调试的情况，你可以试试把你之前设置的断点都清除掉，然后在try一下。 <br />
<br />
5、在模拟器上，大小写不敏感，不区分大小写。但是在我的NOKIA3250上，是区分大小写的 。"map.PNG"在wtk模拟器上用map.png可以跑，在手机上是不行的。 <br />
<br />
6、MIDP 2.0安全机制 与 MIDlet 数字签名 <br />
&nbsp;&nbsp;&nbsp; MIDP 2.0 为 GSM/UTMS 设备定义了 4 种保护域： manufacturer( 设备制造商 ) , operator( 移动运营商 ) , trusted third party( 可信任的第三方 ) , and untrusted( 不受信任域 ) ，除了 untrusted 域外，每个保护域都对应一组根证书，用于签名 MIDlet 的签名证书的根证书必须包含在这些根证书中，使用不同的签名证书签名的 MIDlet 将被自动归类予根证书所属的保护域，根证书与保护域的关系是：一个保护域可以有许多个根证书，而一个根证书只能对应于一个保护域。 <br />
<br />
&nbsp;&nbsp;&nbsp; 具体来讲， manufacturer 域属于设备制造商，其根证书是设备制造商自己的根证书；而 operator 域运营商，一般使用其 SIM 卡中的根证书；而 trusted third party 域则预置了全球知名的数字证书颁发机构 (CA) 的根证书，用于验证由 CA 颁发的 MIDlet 签名证书；而 untrusted 域没有根证书，将用于没有签名的 MIDlet 和 MIDP 1.0 。 <br />
<br />
7、当byte[][] bytes = new byte[2][3]时,bytes.length = 2, byte[0].length = 3 <br />
8、while(true)循环的一种替代 for(;;){} <br />
9、javap命令的作用 <br />
javap是j2se中的一个查看类的方法声明的工具，比如： <br />
javap -private java.util.Calendar <br />
可以看到这个类的方法声明。 <br />
10、Graphics的translate方法的用法 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.translate(x,y) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把绘制的起始坐标移动到x,y位置，绘制的时候，都是相对于(x,y),如果想恢复到默认的坐标系，则g.translate(-x,-y); <br />
<br />
<br />
（转于http://jacky-zhang.javaeye.com/blog/153654）</div>
<img src ="http://www.blogjava.net/bingle/aggbug/264578.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bingle/" target="_blank">冰浪</a> 2009-04-09 09:26 <a href="http://www.blogjava.net/bingle/archive/2009/04/09/264578.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTTP协议基础</title><link>http://www.blogjava.net/bingle/archive/2009/04/09/264577.html</link><dc:creator>冰浪</dc:creator><author>冰浪</author><pubDate>Thu, 09 Apr 2009 01:24:00 GMT</pubDate><guid>http://www.blogjava.net/bingle/archive/2009/04/09/264577.html</guid><wfw:comment>http://www.blogjava.net/bingle/comments/264577.html</wfw:comment><comments>http://www.blogjava.net/bingle/archive/2009/04/09/264577.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bingle/comments/commentRss/264577.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bingle/services/trackbacks/264577.html</trackback:ping><description><![CDATA[HTTP（HyperTextTransferProtocol）是超文本传输协议的缩写，它用于传送WWW方式的数据，关于HTTP协议的详细内容请参考RFC2616。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求，请求头包含请求的方法、URI、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应，相应的内容包括消息协议的版本，成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。 <br />
<br />
通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。这两种类型的消息由一个起始行，一个或者多个头域，一个只是头域结束的空行和可选的消息体组成。HTTP的头域包括通用头，请求头，响应头和实体头四个部分。每个头域由一个域名，冒号（:）和域值三部分组成。域名是大小写无关的，域值前可以添加任何数量的空格符，头域可以被扩展为多行，在每行开始处，使用至少一个空格或制表符。 <br />
<br />
通用头域 <br />
<br />
通用头域包含请求和响应消息都支持的头域，通用头域包含Cache-Control、Connection、Date、Pragma、Transfer- Encoding、Upgrade、Via。对通用头域的扩展要求通讯双方都支持此扩展，如果存在不支持的通用头域，一般将会作为实体头域处理。下面简单介绍几个在UPnP消息中使用的通用头域。 <br />
<br />
Cache-Control头域 <br />
<br />
Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括 no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached，响应消息中的指令包括 public、private、no-cache、no-store、no-transform、must-revalidate、proxy- revalidate、max-age。各个消息中的指令含义如下： <br />
<br />
Public指示响应可被任何缓存区缓存。 <br />
Private指示对于单个用户的整个或部分响应消息，不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息，此响应消息对于其他用户的请求无效。 <br />
no-cache指示请求或响应消息不能缓存 <br />
no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。 <br />
max-age指示客户机可以接收生存期不大于指定时间（以秒为单位）的响应。 <br />
min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。 <br />
max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值，那么客户机可以接收超出超时期指定值之内的响应消息。 <br />
<br />
Date头域 <br />
<br />
Date头域表示消息发送的时间，时间的描述格式由rfc822定义。例如，Date:Mon,31Dec200104:25:57GMT。Date描述的时间表示世界标准时，换算成本地时间，需要知道用户所在的时区。 <br />
<br />
Pragma头域 <br />
<br />
Pragma头域用来包含实现特定的指令，最常用的是Pragma:no-cache。在HTTP/1.1协议中，它的含义和Cache-Control:no-cache相同。 <br />
<br />
请求消息 <br />
<br />
请求消息的第一行为下面的格式： <br />
MethodSPRequest -URISPHTTP-VersionCRLFMethod表示对于Request-URI完成的方法，这个字段是大小写敏感的，包括OPTIONS、 GET、HEAD、POST、PUT、DELETE、TRACE。方法GET和HEAD应该被所有的通用WEB服务器支持，其他所有方法的实现是可选的。 GET方法取回由Request-URI标识的信息。HEAD方法也是取回由Request-URI标识的信息，只是可以在响应时，不返回消息体。 POST方法可以请求服务器接收包含在请求中的实体信息，可以用于提交表单，向新闻组、BBS、邮件群组和数据库发送消息。 <br />
<br />
SP表示空格。Request-URI遵循URI格式，在此字段为星号（*）时，说明请求并不用于某个特定的资源地址，而是用于服务器本身。HTTP- Version表示支持的HTTP版本，例如为HTTP/1.1。CRLF表示换行回车符。请求头域允许客户端向服务器传递关于请求或者关于客户机的附加信息。请求头域可能包含下列字段Accept、Accept-Charset、Accept-Encoding、Accept-Language、 Authorization、From、Host、If-Modified-Since、If-Match、If-None-Match、If- Range、If-Range、If-Unmodified-Since、Max-Forwards、Proxy-Authorization、 Range、Referer、User-Agent。对请求头域的扩展要求通讯双方都支持，如果存在不支持的请求头域，一般将会作为实体头域处理。 <br />
<br />
典型的请求消息： <br />
<br />
<br />
GEThttp://class/download.microtool.de:80/somedata.exe <br />
Host:download.microtool.de <br />
Accept:*/* <br />
Pragma:no-cache <br />
Cache-Control:no-cache <br />
Referer:http://class/download.microtool.de/ <br />
User-Agent:Mozilla/4.04[en](Win95;I;Nav) <br />
Range:bytes=554554- <br />
<br />
上例第一行表示HTTP客户端（可能是浏览器、下载程序）通过GET方法获得指定URL下的文件。棕色的部分表示请求头域的信息，绿色的部分表示通用头部分。 <br />
<br />
Host头域 <br />
<br />
Host头域指定请求资源的Intenet主机和端口号，必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域，否则系统会以400状态码返回。 <br />
<br />
Referer头域 <br />
<br />
Referer 头域允许客户端指定请求uri的源资源地址，这可以允许服务器生成回退链表，可用来登陆、优化cache等。他也允许废除的或错误的连接由于维护的目的被追踪。如果请求的uri没有自己的uri地址，Referer不能被发送。如果指定的是部分uri地址，则此地址应该是一个相对地址。 <br />
<br />
Range头域 <br />
<br />
Range头域可以请求实体的一个或者多个子范围。例如， <br />
<br />
表示头500个字节：bytes=0-499 <br />
表示第二个500字节：bytes=500-999 <br />
表示最后500个字节：bytes=-500 <br />
表示500字节以后的范围：bytes=500- <br />
第一个和最后一个字节：bytes=0-0,-1 <br />
同时指定几个范围：bytes=500-600,601-999 <br />
<br />
但是服务器可以忽略此请求头，如果无条件GET包含Range请求头，响应会以状态码206（PartialContent）返回而不是以200（OK）。 <br />
<br />
User-Agent头域 <br />
<br />
User-Agent头域的内容包含发出请求的用户信息。 <br />
<br />
响应消息 <br />
<br />
响应消息的第一行为下面的格式： <br />
<br />
HTTP-VersionSPStatus-CodeSPReason-PhraseCRLF <br />
HTTP -Version表示支持的HTTP版本，例如为HTTP/1.1。Status-Code是一个三个数字的结果代码。Reason-Phrase给 Status-Code提供一个简单的文本描述。Status-Code主要用于机器自动识别，Reason-Phrase主要用于帮助用户理解。 Status-Code的第一个数字定义响应的类别，后两个数字没有分类的作用。第一个数字可能取5个不同的值： <br />
<br />
1xx:信息响应类，表示接收到请求并且继续处理 <br />
2xx:处理成功响应类，表示动作被成功接收、理解和接受 <br />
3xx:重定向响应类，为了完成指定的动作，必须接受进一步处理 <br />
4xx:客户端错误，客户请求包含语法错误或者是不能正确执行 <br />
5xx:服务端错误，服务器不能正确执行一个正确的请求 <br />
<br />
响应头域允许服务器传递不能放在状态行的附加信息，这些域主要描述服务器的信息和Request-URI进一步的信息。响应头域包含Age、 Location、Proxy-Authenticate、Public、Retry-After、Server、Vary、Warning、WWW- Authenticate。对响应头域的扩展要求通讯双方都支持，如果存在不支持的响应头域，一般将会作为实体头域处理。 <br />
<br />
典型的响应消息： <br />
<br />
<br />
HTTP/1.0200OK <br />
Date:Mon,31Dec200104:25:57GMT <br />
Server:Apache/1.3.14(Unix) <br />
Content-type:text/html <br />
Last-modified:Tue,17Apr200106:46:28GMT <br />
Etag:"a030f020ac7c01:1e9f" <br />
Content-length:39725426 <br />
Content-range:bytes554554-40279979/40279980 <br />
上例第一行表示HTTP服务端响应一个GET方法。棕色的部分表示响应头域的信息，绿色的部分表示通用头部分，红色的部分表示实体头域的信息。 <br />
<br />
Location响应头 <br />
<br />
Location响应头用于重定向接收者到一个新URI地址。 <br />
<br />
Server响应头 <br />
<br />
Server响应头包含处理请求的原始服务器的软件信息。此域能包含多个产品标识和注释，产品标识一般按照重要性排序。 <br />
<br />
实体 <br />
<br />
请求消息和响应消息都可以包含实体信息，实体信息一般由实体头域和实体组成。实体头域包含关于实体的原信息，实体头包括Allow、Content- Base、Content-Encoding、Content-Language、Content-Length、Content-Location、 Content-MD5、Content-Range、Content-Type、Etag、Expires、 Last-Modified、extension-header。extension-header允许客户端定义新的实体头，但是这些域可能无法未接受方识别。实体可以是一个经过编码的字节流，它的编码方式由Content-Encoding或Content-Type定义，它的长度由Content- Length或Content-Range定义。 <br />
<br />
Content-Type实体头 <br />
<br />
Content-Type实体头用于向接收方指示实体的介质类型，指定HEAD方法送到接收方的实体介质类型，或GET方法发送的请求介质类型Content-Range实体头 <br />
<br />
Content-Range实体头用于指定整个实体中的一部分的插入位置，他也指示了整个实体的长度。在服务器向客户返回一个部分响应，它必须描述响应覆盖的范围和整个实体长度。一般格式： <br />
<br />
Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-legth <br />
例如，传送头500个字节次字段的形式：Content-Range:bytes0-499/1234如果一个http消息包含此节（例如，对范围请求的响应或对一系列范围的重叠请求），Content-Range表示传送的范围，Content-Length表示实际传送的字节数。 <br />
<br />
Last-modified实体头 <br />
<br />
Last-modified实体头指定服务器上保存内容的最后修订时间。 <br />
<br />
（转于http://jacky-zhang.javaeye.com/blog/150052）
<img src ="http://www.blogjava.net/bingle/aggbug/264577.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bingle/" target="_blank">冰浪</a> 2009-04-09 09:24 <a href="http://www.blogjava.net/bingle/archive/2009/04/09/264577.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2ME中文的支持问题</title><link>http://www.blogjava.net/bingle/archive/2009/04/09/264575.html</link><dc:creator>冰浪</dc:creator><author>冰浪</author><pubDate>Thu, 09 Apr 2009 01:22:00 GMT</pubDate><guid>http://www.blogjava.net/bingle/archive/2009/04/09/264575.html</guid><wfw:comment>http://www.blogjava.net/bingle/comments/264575.html</wfw:comment><comments>http://www.blogjava.net/bingle/archive/2009/04/09/264575.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bingle/comments/commentRss/264575.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bingle/services/trackbacks/264575.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在使用MotoJ2SDK进行J2ME应用程序的开发，经常会遇到中文的显示，存储，传输和编码的问题。首先要对388手机上开发Kjava程序时，对于中文的支持情况有所了解。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中文的支持有三种编码方式： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; －ISO10646 and ISO8859_1 编码格式； <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; －UTF8编码格式； <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; －UNICODE <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面我们来看一下各种不同的编码方式有什么区别。在目录Text下有三个.txt文件，它们是分别用ANSI、UNICODE、UTF8方式编码的一段中文，内容为&#8220;摩托罗拉&#8221;。我们用UltraEdit分别打开三个文件，并且用HEX方式浏览，可以发现： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. ANSI方式的16进制数据为 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C4,A6,CD,D0,C2,DE,C0,AD, <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中每个中文占两个字节，并且每个字节都大于0xA0 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. UNICODE方式的16进制数据为 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FF，FE，69，64，58，62，57，7F，C9，62 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中头两个字节&#8220;FF，FE&#8221;是固定的，表示该文本按照UNICODE编码，并且随后为每个中文占两个字节。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3. UTF8方式的16进制数据为 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EF,BB,BF,E6,91,A9,E6,89,98,E7,BD,97,E6,8B,89 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中头3个字节&#8220;EF,BB,BF&#8221;是固定的，表示该文本按照UTF8编码，并且随后为每个中文占3个字节。 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 但是，仅了解这些，对于开发有关中文的应用程序还是不够的。如何能够保证正确的传输和存储中文才是根本目的。经常有些开发者会遇到中文无法存储，以及经过网络传输后得到的是乱码的问题。这是因为，J2ME中通常是不能对中文直接进行存储和传输的，要进行一定的转换。在Hopen的J2ME论坛中，有人提到这样的方法，即用以下两个函数把字符串先转成byte 数组后在写入数据库，在读出时也要先把byte数组转换成字符串，再进行显示等操作。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static String byte2string(byte[] b,int offset,int len ) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ByteArrayInputStream bais = new ByteArrayInputStream(b,offset,len); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataInputStream inputstream = new DataInputStream( bais ); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return inputstream.readUTF(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(IOException e){return null;} <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static byte[] string2byte(String s) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ByteArrayOutputStream baos = new ByteArrayOutputStream(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataOutputStream outputstream = new DataOutputStream(baos); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outputstream.writeUTF( s ); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return baos.toByteArray(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(IOException e){return null;} <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 经过试验，发现这是一种简单有效的方法，并且同样使用于UDP传输中文数据，即再传输前先转换成byte数组，接收后把byte数组再转换成字符串显示。在目录UTFTest中，我做了一个简单的实例。UTFSendTest.java中，通过TextBox输入一段要传输的中文， <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String strText=mainScreen.getString(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后定义一个byte数组， <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] bText = new byte[100]; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后把要发送的字符串利用前面的函数转换成byte数组，以便进行传输 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bText = string2byte(strText); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int length = bText.length; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最后把转换后的byte数组数据发送到Server端， <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dc = (DatagramConnection)Connector.open(destAddr); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Datagram dobject = dc.newDatagram(bText,length,destAddr); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dc.send(dobject); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Server端的UTFTest.java中做一个逆过程即可， <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dc = (DatagramConnection)Connector.open("datagram://:"+ port); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Datagram dobject; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] bReceive = new byte[100]; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dobject = dc.newDatagram(dc.getMaximumLength()); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dc.receive(dobject); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bReceive = dobject.getData(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String strReceive = byte2string(bReceive,0,bReceive.length); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainScreen.setString("已收到:"+strReceive); <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在似乎有了一个权宜之计，至少可以进行有关中文的操做了。但是有关中文的问题还没有彻底的说清楚。还有一个经常提到的问题，就是为什么不能象显示英文一样，用System.out.println(strReceive); 来显示一段中文字符串变量呢？这一点对于本来就不直观的调试界面来说也是十分必要的，开发者要经常通过这种方式来验证中文是否读取和传输正确。而实际上，我们看到的只是一串无奈的&#8220;？？？&#8221;。因此在MotoJ2SDK中，直接用 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println ("中文"); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 或者是，String testString = new String("中华人民共和国"); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(testString); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通常是不可行的。如何才能保证在模拟器界面和system.out中都能正确显示中文呢？下面我们以finalUDP目录中的UDPServer和UDPClient为例来分析一下。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果采用上面的方法，利用函数byte2string（）和 string2byte（），在进行传输之前都转换成Byte数组的格式，用 UTF8的编码方式，可以得到正常的传输，Client端发出&#8220;发送摩托罗拉&#8221;，Server端收到后发出&#8220;返回摩托罗拉&#8221;，Client端接收到后显示在模拟器手机屏幕上，但是发送和接收中文字符串用System.out.println（）时，都是&#8220;？？？&#8221;。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面对程序做如下改动，Server端受到&#8220;发送摩托罗拉&#8221;后，要发出&#8220;返回摩托罗拉&#8221;。但是这次不采用 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static final String replyMsg=&#8221;返回摩托罗拉&#8221;; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] bText = new byte[100]; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bText = string2byte(replyMsg); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 而是分别用bText =replyMsg.getBytes(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 或 bText =replyMsg.getBytes("ISO10646"); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 或 bText =replyMsg.getBytes("ISO8859_1"); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把待发字符串转换成字符数组，在Client端接收时不用以前的方式： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dc.receive(dobject); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bReceive = dobject.getData(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; receiveMsg = byte2string(bReceive,0,bReceive.length); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 而是直接采用 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dc.receive(receiveData); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; receiveMsg = new String(receiveData.getData(),0,receiveData.getLength()); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后再把接收到字符串显示输出，为了细致分析接受到的字符数组每个元素的值，用如下方式读出并显示： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bReceive=receiveMsg.getBytes(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;bReceive.length;i++) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("rcv"+i+":"+bReceive[i]); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 经过试验，bText =replyMsg.getBytes();三种不同的参数情况，试验结果如下表所示： <br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 参数情况 接收到的数组 元素情况 接收端模拟器 屏幕显示情况 接收端system.out 显示情况 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Void 共12个bytes，每个汉字对应2个bytes， <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 并且值即为各自ANSI编码值，例如&#8220;返&#8221;对应0xB7，0xB5&nbsp; 乱码 正常 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "ISO10646" Java.io.unSupportedEncodingException:ISO10646&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "ISO8859_1" 共6个元素，每个均为0x3F， 即为&#8220;？ <br />
<br />
（转于http://jacky-zhang.javaeye.com/blog/148245）
<img src ="http://www.blogjava.net/bingle/aggbug/264575.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bingle/" target="_blank">冰浪</a> 2009-04-09 09:22 <a href="http://www.blogjava.net/bingle/archive/2009/04/09/264575.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>j2me优化秘密</title><link>http://www.blogjava.net/bingle/archive/2009/04/09/264574.html</link><dc:creator>冰浪</dc:creator><author>冰浪</author><pubDate>Thu, 09 Apr 2009 01:18:00 GMT</pubDate><guid>http://www.blogjava.net/bingle/archive/2009/04/09/264574.html</guid><wfw:comment>http://www.blogjava.net/bingle/comments/264574.html</wfw:comment><comments>http://www.blogjava.net/bingle/archive/2009/04/09/264574.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bingle/comments/commentRss/264574.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bingle/services/trackbacks/264574.html</trackback:ping><description><![CDATA[*只优化需要的代码 <br />
*只在有价值的地方优化 <br />
*用profiler来找要优化的地方 <br />
*在具体的设备上profiler无能为力，在硬件上使用System timer <br />
*在于用低级技术之前，总是先研究你的代码并且试着改进算法 <br />
*绘图是慢的，所以尽量节俭地使用图形调用 <br />
*在可以减少绘制区域的地方使用setClip() <br />
*尽可能的把东西放到循环之外 <br />
*拼命地预先计算和暂存 <br />
*字符串带来垃圾，垃圾不好，所以使用StringBuffers来代替 <br />
*什么都不假设 <br />
*可能就使用static final方法，避免synchronized修饰符 <br />
*传递尽可能少的参数到经常调用的方法 <br />
*如果可能，完全地去掉函数调用 <br />
*解开循环 <br />
*对2的幂的乘除运算用位移运算代替 <br />
*你可以使用位运算符代替取模运算来实现循环 <br />
*试着用零来代替和其他数的比较 <br />
*数组访问比C要慢，所以暂存数组元素 <br />
*消去公共的子表达式 <br />
*局部变量要比引用变量快 <br />
*如果可以callSerially()就不要wait() <br />
*在switch()中使用小的变量作选项 <br />
*检查定点数学库并且优化它 <br />
*拆开嵌套的FP调用来减少类型转换 <br />
*除法比乘法慢，所以用乘于倒数来代替除法 <br />
*用使用过和测试过的算法 <br />
*为了保护可移植性，小心地使用私有高性能API&nbsp;&nbsp;&nbsp; <br />
<br />
（转于http://jacky-zhang.javaeye.com/blog/186741）
<img src ="http://www.blogjava.net/bingle/aggbug/264574.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bingle/" target="_blank">冰浪</a> 2009-04-09 09:18 <a href="http://www.blogjava.net/bingle/archive/2009/04/09/264574.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>j2me游戏引擎程序结构</title><link>http://www.blogjava.net/bingle/archive/2009/04/09/264572.html</link><dc:creator>冰浪</dc:creator><author>冰浪</author><pubDate>Thu, 09 Apr 2009 01:15:00 GMT</pubDate><guid>http://www.blogjava.net/bingle/archive/2009/04/09/264572.html</guid><wfw:comment>http://www.blogjava.net/bingle/comments/264572.html</wfw:comment><comments>http://www.blogjava.net/bingle/archive/2009/04/09/264572.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bingle/comments/commentRss/264572.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bingle/services/trackbacks/264572.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 游戏引擎的结构很多，不过基本上都是在一个游戏主循环内实现。程序里面的主循环包含了程序框架的最主要的结构体。J2me的程序一般都包含两个class文件，一个是MIDlet,一个是Displayable。一般我都是把游戏的主要代码放在Displayable这个类里面。这个类是基于事件驱动的程序，有三个主要相应函数void paint(Graphics g),void keyPressed(int keyCode),void keyReleased(int keyCode)。&nbsp;&nbsp;<a href='http://www.blogjava.net/bingle/archive/2009/04/09/264572.html'>阅读全文</a><img src ="http://www.blogjava.net/bingle/aggbug/264572.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bingle/" target="_blank">冰浪</a> 2009-04-09 09:15 <a href="http://www.blogjava.net/bingle/archive/2009/04/09/264572.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开发J2ME联网应用程序</title><link>http://www.blogjava.net/bingle/archive/2009/04/09/264571.html</link><dc:creator>冰浪</dc:creator><author>冰浪</author><pubDate>Thu, 09 Apr 2009 01:13:00 GMT</pubDate><guid>http://www.blogjava.net/bingle/archive/2009/04/09/264571.html</guid><wfw:comment>http://www.blogjava.net/bingle/comments/264571.html</wfw:comment><comments>http://www.blogjava.net/bingle/archive/2009/04/09/264571.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bingle/comments/commentRss/264571.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bingle/services/trackbacks/264571.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 尽管目前的无线网络不够理想，手机联网还是给我们开发人员不小的震撼的。毕竟这真的是件神奇的事情，不是吗？本文将讲述如何应用J2ME平台中的通用联网框架开发联网的应用程序。&nbsp;&nbsp;<a href='http://www.blogjava.net/bingle/archive/2009/04/09/264571.html'>阅读全文</a><img src ="http://www.blogjava.net/bingle/aggbug/264571.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bingle/" target="_blank">冰浪</a> 2009-04-09 09:13 <a href="http://www.blogjava.net/bingle/archive/2009/04/09/264571.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CMNET和CMWAP网络连接</title><link>http://www.blogjava.net/bingle/archive/2009/04/09/264569.html</link><dc:creator>冰浪</dc:creator><author>冰浪</author><pubDate>Thu, 09 Apr 2009 01:11:00 GMT</pubDate><guid>http://www.blogjava.net/bingle/archive/2009/04/09/264569.html</guid><wfw:comment>http://www.blogjava.net/bingle/comments/264569.html</wfw:comment><comments>http://www.blogjava.net/bingle/archive/2009/04/09/264569.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bingle/comments/commentRss/264569.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bingle/services/trackbacks/264569.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:  J2me上的GPRS网络接入点有两个，一个就是CMNET，一个就是CMWAP。一般移动梦网，百宝箱就是挂在CMWAP上的。&nbsp;&nbsp;<a href='http://www.blogjava.net/bingle/archive/2009/04/09/264569.html'>阅读全文</a><img src ="http://www.blogjava.net/bingle/aggbug/264569.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bingle/" target="_blank">冰浪</a> 2009-04-09 09:11 <a href="http://www.blogjava.net/bingle/archive/2009/04/09/264569.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>手机网络应用客户端软件开发实践简介</title><link>http://www.blogjava.net/bingle/archive/2009/03/06/258139.html</link><dc:creator>冰浪</dc:creator><author>冰浪</author><pubDate>Fri, 06 Mar 2009 02:40:00 GMT</pubDate><guid>http://www.blogjava.net/bingle/archive/2009/03/06/258139.html</guid><wfw:comment>http://www.blogjava.net/bingle/comments/258139.html</wfw:comment><comments>http://www.blogjava.net/bingle/archive/2009/03/06/258139.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bingle/comments/commentRss/258139.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bingle/services/trackbacks/258139.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:       说到移动网络应用，前几年大家首先想到的就是WAP应用。最近随着市场上手机的可编程能力越来越强，手机软件开发平台和产业链的逐渐成熟，手机上的网络应用软件逐渐多了起来，如移动QQ、PICA、掌讯通等等。这些客户端软件凭着丰富的应用、以用户为中心的体验、良好的业务感知度逐渐成为WAP业务之后的又一类重要网络应用。目前的移动软件开发已经逐渐从传统的嵌入式开发中相对独立出来, 主要指手机上的上层应用软件开发，最近也成为了软件行业的新兴热点。<br><br>       作为业务运营的手机网络应用客户端软件要求能够部署到大量的手机终端，并注重和网络服务器端业务的结合，目前这方面的开发参考资料还比较少。本文以手机报项目为基础，简单探讨一下手机网络应用客户端软件开发实践中的几个关键问题，希望对新进入者有所帮助。假设我们需要开发一个高可用的手机网络应用客户端软件，用于在线定购和阅读电子报刊业务，覆盖目前移动梦网用户中占有率最高的几十款手机，下面结合KJava开发介绍一下我们的一些实践心得。<br>&nbsp;&nbsp;<a href='http://www.blogjava.net/bingle/archive/2009/03/06/258139.html'>阅读全文</a><img src ="http://www.blogjava.net/bingle/aggbug/258139.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bingle/" target="_blank">冰浪</a> 2009-03-06 10:40 <a href="http://www.blogjava.net/bingle/archive/2009/03/06/258139.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于J2ME的手机联网程序</title><link>http://www.blogjava.net/bingle/archive/2009/02/19/255649.html</link><dc:creator>冰浪</dc:creator><author>冰浪</author><pubDate>Thu, 19 Feb 2009 13:33:00 GMT</pubDate><guid>http://www.blogjava.net/bingle/archive/2009/02/19/255649.html</guid><wfw:comment>http://www.blogjava.net/bingle/comments/255649.html</wfw:comment><comments>http://www.blogjava.net/bingle/archive/2009/02/19/255649.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bingle/comments/commentRss/255649.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bingle/services/trackbacks/255649.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 随着国内3G的启动，新一代移动通信大潮已经到来。技术的进步使得无线网络取得不错的发展，移动互联网巨大前景也随着显现。无线网络速度的提高，催生大量的手机联网应用程序。手机联网功能的强化，使得手机应用更具价值，进一步扩展了手机功能。&nbsp;&nbsp;<a href='http://www.blogjava.net/bingle/archive/2009/02/19/255649.html'>阅读全文</a><img src ="http://www.blogjava.net/bingle/aggbug/255649.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bingle/" target="_blank">冰浪</a> 2009-02-19 21:33 <a href="http://www.blogjava.net/bingle/archive/2009/02/19/255649.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>