路是爬出来的

#

设计可组装的j2me UI(二) 一些系统边缘核心的开发

大家都知道。设计一个好的软件,无非是要求程序稳定,可扩展,可修改跟可移值。在没有出现j2me之前,写手机程序是一件很痛苦的事情。因为你要针对很多的机型进行设计,因此导致了很少人会去涉及。因为设计这样的程序对程序员来说是个挑战。现在不同了。有了j2me使开放手机软件变的容易,而且很快乐。
定义一个与平台无关的各个参数的类,比如把按键的键值放在这里。这样以后修改起来就很方便。

代码

代码

代码

以上是本人经过互联网学习,上面的一些代码出自一些开源的。
大家可以按照需要修改。共同学习。

posted @ 2006-12-30 09:24 路是爬出来的 阅读(95) | 评论 (0)编辑 收藏

设计可组装的j2me UI(四) 时间控件

       开放过项目的人都知道。用户的需求是时刻变化的。我们要做到的只是不断的去适应这种变化。因为给钱的是人家。

       今天这篇文章让我们来学习怎么样设计一个可以在j2me低级UI上显示的时钟。经过前面几篇文章相信大家都知道我的UI设计思路了。我们现在要做的就是设计一个Part(这个是什么来的,呵呵。如果没看过我前面文章的朋友们,建议你们先读下,我想会有好处的。^_^)。

      我的控件思路是这样的。首先在整个屏幕中拿出一小块出来。然后在这一小块里面绘制显示时间(时间可以是纯文字,也可以是图片等),然后我们实现Runnable接口,让它没秒钟都刷新一下那一小块屏幕。是不是很简单呢。呵呵。下面让我们来看下具体代码吧

java 代码


 


  1. /******************************************************************** 

  2.  * 

  3.  * 版权说明,此程序仅供学习参考。不能用于商业 

  4.  * 

  5.  ********************************************************************/  

  6. package org.pook.ui;  

  7.   

  8. import java.util.TimerTask;  

  9.   

  10. import javax.microedition.lcdui.Display;  

  11. import javax.microedition.lcdui.Displayable;  

  12. import javax.microedition.lcdui.Graphics;  

  13.   

  14. import org.pook.file.BookFileManager;  

  15. import org.pook.log.Log;  

  16. import org.pook.ui.core.Platform;  

  17. import org.pook.ui.form.Panel;  

  18. import org.pook.ui.timer.TimerTaskManager;  

  19. import org.pook.ui.util.GraphicsUtil;  

  20. import org.pook.util.DateTime;  

  21.   

  22. /** 

  23.  * 类名:TimerPart.java 

  24.  

  25.  * 编写日期: 2006-9-29 

  26.  

  27.  * 程序功能描述�? 

  28.  

  29.  * Demo: 

  30.  

  31.  * Bug: 

  32.  

  33.  * 

  34.  * 程序变更日期 

  35.  

  36.  * 变更作�?? 

  37.  

  38.  * 变更说明 

  39.  

  40.  * 

  41.  * @author wuhua 

  42. rrq12345@163.com 

  43.  */  

  44. public class TimerPart extends Part implements Runnable{  

  45.   

  46.     Log log = Log.getLog("TimerPart");  

  47.      

  48.     /** 时间显示字段     */  

  49.     private static int hour ;  

  50.     private static int minute;  

  51.     private static int second;  

  52.      

  53.     private static String time;  

  54.      

  55.     /** 用于执行消失窗口 */  

  56.     protected TimerTask task;  

  57.      

  58.     /** 获取系统时间 **/  

  59.     private DateTime dt;  

  60.      

  61.      

  62.      

  63.     private Display display;  

  64.     private Displayable displayable;  

  65.   

  66.     private String h;  

  67.   

  68.     private String m;  

  69.   

  70.     private String s;  

  71.      

  72.     public TimerPart(Display display) {  

  73.         super(Platform.WIDTH - 4504520);  

  74.         dt = new DateTime();  

  75.         hour = dt.hour ;  

  76.         minute = dt.minute ;  

  77.         second = dt.second ;  

  78.    

  79.          time = hour + ":" + minute + ":" + second;  

  80.            

  81.        

  82.         task = TimerTaskManager.getInstace().add(this1000);  

  83.         this.display = display;  

  84.     }  

  85.   

  86.     public void paint(Graphics g) {  

  87.         g.setColor(0x00000);  

  88.         g.drawString(time.toString(), view[X], view[Y], Graphics.TOP |  

  89.                 Graphics.LEFT);  

  90.     //    GraphicsUtil.darwString(g,new Boolean(BookFileManager.available()).toString(), view[X], view[Y]);  

  91.   

  92.     }  

  93.   

  94.     public void onClick(int keyCode) {  

  95.        

  96.     }  

  97.   

  98.     /** 

  99.      * 刷新时间的方法,每隔1秒钟刷新�?�? 

  100.      */  

  101.     public void run() {  

  102.            

  103.          

  104.         //更新时间  

  105.          updateTime();  

  106.          repaintTime();  

  107.          

  108.     }  

  109.      

  110.     /** 

  111.      * 这里本不应该与程序又任何关联的�?�但考虑到�?��?? 

  112.      * �?以就先这样先 

  113.      * 

  114.      */  

  115.     private void repaintTime() {  

  116.         if(display == null)  

  117.             return;  

  118.         displayable = display.getCurrent();  

  119.         if(displayable instanceof Panel){  

  120.             Panel panel = (Panel)displayable;  

  121.             panel.repaintTimer();  

  122.         }  

  123.     }  

  124.   

  125.     /** 

  126.      * 更新时间,频率是1�? 

  127.      * 

  128.      */  

  129.     private void updateTime() {  

  130.         second ++ ;  

  131.         if(second == 60){  

  132.             second = 0;  

  133.             minute ++ ;  

  134.         }  

  135.          

  136.         if(minute == 60){  

  137.             minute = 0;  

  138.             hour ++ ;  

  139.         }  

  140.          

  141.         if(hour == 24 && minute == 0){  

  142.             hour = 00;  

  143.         }  

  144.          

  145.         h =   hour<10?("0"+hour):hour + "" ;  

  146.         m =    minute<10?("0"+minute):minute + "";  

  147.         s =   second<10?("0"+second):second + "";  

  148.          

  149.         time = h + ":" + m + ":" + s;  

  150.     }  

  151.   

  152.   

  153.   

  154.   

  155. }  







具体的详细例子在: 手机电子书阅读软件基本框架  wuhua.javaeye.com/admin/show/28821

看看这图片:

posted @ 2006-12-30 09:24 路是爬出来的 阅读(448) | 评论 (0)编辑 收藏

25岁男人必读(转)

1.男人是社会的主体,不管你信或不信.所以男人应该有种责任感.



2.25岁之前,请记得,爱情通常是假的,或者不是你所想象的那样纯洁和永远.如果你过了25岁,那么你应该懂得这个道理.





3.吃饭7成饱最舒服.对待女友最多也请你保持在7成.



4.30岁之前请爱惜自己的身体,前30年你找病,后30年病找你.如果你过了30岁,你自然也会懂得这个道理.



5.事业远比爱情重要.如果说事业都不能永恒,那么爱情只能算是昙花一现.



6.不要轻易接受追求你的女孩.女追男隔层纱.如果你很容易就陷进去,你会发现你会错过很多东西,失去很多东西.



7.请你相信,能用钱解决的问题,都不是问题.如果你认为钱索王道,有钱有女人,没钱没女人,那么.女人不是问题.



8.请永远积极向上.每个男人都有他可爱的地方,但是不可爱的地方只有不积极面对生活.



9.不要连续2次让同一个女人伤害.好马不吃回头草,是有他道理的.如果认真考虑过该分手,那么请不要做任何舍不得的行动.



10.如果你和你前女友能做朋友,那么你要问自己:为什么?如果分手后还是朋友,那么只有2个可能:.你们当初都只是玩玩而已,没付出彼此最真的感情.或者:必定有个人是在默默的付出无怨无悔!



11.永远不要太相信女人在恋爱时的甜言蜜语.都说女人爱听甜言蜜语,其实,男人更喜欢.



12.请不要为自己的相貌或者身高过分担心和自卑.人是动物,但是区别于动物.先天条件并不是阻挡你好好生活的借口.人的心灵远胜于相貌,请相信这点.如果有人以相貌取人,那么你也没必要太在意.因为他从某种意义来讲,只是只动物.你会跟动物怄气吗?



13.失恋时,只有2种可能,要么你爱她她不爱你,或者相反.那么,当你爱的人不再爱你,或者从来没爱过你时.你没有遗憾,因为你失去的只是一个不爱你的人.



14.请不要欺骗善良的女孩.这个世界上,善良的女孩太少.



15.不能偏激的认为金钱万能,至少,金钱治不好艾滋病.



16.请一定要有自信.你就是一道风景,没必要在别人风景里面仰视.



17.受到再大的打击,只要生命还在,请相信每天的太阳都是新的.



18.爱情永远不可能是天平.你想在爱情里幸福就要舍得伤心.



19.如果你喜欢一个认为别人应该对她好的mm,请尽早放弃.没有人是应该对一个人好的.如果她不明白这个道理,也就是她根本不懂得珍惜.



20.不要因为寂寞而’找’gf,寂寞男人请要学会品味寂寞.请记住:即使寂寞,远方黑暗的夜空下,一定有人和你一样,寂寞的人不同,仰望的星空却是唯一.



21.任何事没有永远.也别问怎样才能永远.生活有很多无奈.请尽量充实自己,充实生活.请善待生活.



End.男人有很多无奈,生活很累但是因为生活才有意义.当你以为你一无所有时,你至少还有时间,时间能抚平一切创伤.所以请不要流泪

posted @ 2006-12-30 09:24 路是爬出来的 阅读(117) | 评论 (0)编辑 收藏

如何预防电脑辐射(转自j2medev)

原文出自

www.j2medev.com/blog/user1/32652/archives/2006/1819.html



关于电脑辐射的危害大家一定都很清楚,但恐怕并非每个人都清楚该怎样预防电脑辐射,于是在下转了几个帖,考虑到我们整天都坐在电脑面前,为了我们的健康,抽点时间,关心一下,相信一定对你有百利而无一害。



一 防电脑辐射10招

电脑辐射是不可避免的,但可以减少。以下是一些预防电脑辐射的方法:



1.应尽可能购买新款的电脑,一般不要使用旧电脑,旧电脑的辐射一般较厉害,在同距离、同类机型的条件下,一般是新电脑的1-2倍。



2.注意室内通风。科学研究证实,电脑的荧屏能产生一种叫溴化二苯并呋喃的致癌物质。所以,放置电脑的房间最好能安装换气扇,倘若没有,上网时尤其要注意通风。



3.电脑摆放位置很重要。尽量别让屏幕的背面朝着有人的地方,因为电脑辐射最强的是背面,其次为左右两侧,屏幕的正面反而辐射最弱。



4.室内不要放置闲杂金属物品,以免形成电磁波的再次发射。



5.操作电脑时最好在显示屏上安一块电脑专用滤色板以减轻辐射的危害。



6.使用电脑时,要调整好屏幕的亮度,一般来说,屏幕亮度越大,电磁辐射越强,反之越小。不过,也不能调得太暗,以免因亮度太小而影响效果,且易造成眼睛疲劳。



7.使用电脑时,还要注意与屏幕保持适当距离。离屏幕越近,人体所受的电磁辐射越大,因此较好的是距屏幕半米以外。



8.使用电脑后,脸上会吸附不少电磁辐射的颗粒,因此,要及时用清水洗脸,这样将使所受辐射减轻70%以上。



9.可在电脑桌前放置一盆仙人掌,这样有助于减少辐射。



10. 要注意饮食。对于生活紧张而忙碌的人群来说,抵御电脑辐射最简单的办法就是在每天上午喝2至3杯的绿茶,吃一个橘子。茶叶中含有丰富的维生素A原,它被人 体吸收后,能迅速转化为维生素A。维生素A不但能合成视紫红质,还能使眼睛在暗光下看东西更清楚,因此,绿茶不但能消除电脑辐射的危害,还能保护和提高视 力。如果不习惯喝绿茶,菊花茶同样也能起着抵抗电脑辐射和调节身体功能的作用。



二 防电脑辐射有妙招

关键词语:注意酌情多吃一些胡萝卜、豆芽、西红柿、瘦肉、动物肝等富含维生素A、C和蛋白质的食物,经常喝些绿茶等等。





使用电脑时,最好在显示器前配备质量较好的防辐射屏。注意酌情多吃一些胡萝卜、豆芽、西红柿、瘦肉、动物肝等富含维生素A、C和蛋白质的食物,经常喝些绿茶等等。





对于生活紧张而忙碌的人群来说,抵御电脑辐射最简单的办法就是在每天上午喝2至3杯的绿茶,吃一个橘子。茶叶中含有丰富的维生素A原,它被人体吸收后, 能迅速转化为维生素A。维生素A不但能合成视紫红质,还能使眼睛在暗光下看东西更清楚,因此,绿茶不但能消除电脑辐射的危害,还能保护和提高视力。如果不 习惯喝绿茶,菊花茶同样也能起着抵抗电脑辐射和调节身体功能的作用。





电脑辐射是不可避免的,但可以减少。首先,应尽可能 购买新款的电脑,一般不要使用旧电脑,旧电脑的辐射一般较厉害,在同距离、同类机型的条件下,一般是新电脑的1-2倍。操作电脑时最好在显示屏上安一块电 脑专用滤色板以减轻辐射的危害,室内不要放置闲杂金属物品,以免形成电磁波的再次发射。使用电脑时,要调整好屏幕的亮度,一般来说,屏幕亮度越大,电磁辐 射越强,反之越小。不过,也不能调得太暗,以免因亮度太小而影响效果,且易造成眼睛疲劳。还要注意与屏幕保持适当距离。离屏幕越近,人体所受的电磁辐射越 大,因此较好的是距屏幕半米以外。





电脑使用后,脸上会吸附不少电磁辐射的颗粒,要及时用清水洗脸,这样将使所受辐射减轻70%以上。





仙人掌除了可以攻击坏人,还有一项好处喔!据说在计算机桌前放置一仙人掌有助于减少辐射。





常用电脑的人会感到眼睛不适,视力下降,易有疲劳的感觉。常用电脑的人在饮食上应注意以下几方面:





吃一些对眼睛有益的食品,如鸡蛋、鱼类、鱼肝油、胡萝卜、菠菜、地瓜、南瓜、枸杞子、菊花、芝麻、萝卜、动物肝脏等。





多吃含钙质高的食品,如豆制品、骨头汤、鸡蛋、牛奶、瘦肉、虾等。





注意维生素的补充:多吃含有维生素的新鲜水果、蔬菜等。





注意增强抵抗力:多吃一些增强机体抗病能力的食物,如香菇、蜂蜜、木耳、海带、柑桔、大枣等。





吃一些抗辐射的食品:电脑虽然对人体健康影响较小,但也应预防。饮茶能降低辐射的危害,茶叶中的脂多糖有抗辐射的作用。螺旋藻、沙棘油也具有抗辐射的作用。





另外,用完电脑应洗脸,平时应注意锻炼身体。





电脑摆放位置很重要。尽量别让屏幕的背面朝着有人的地方,因为电脑辐射最强的是背面,其次为左右两侧,屏幕的正面反而辐射最弱。以能看清楚字为准,至少也要50厘米到75厘米的距离,这样可以减少电磁辐射的伤害。





注意室内通风:科学研究证实,电脑的荧屏能产生一种叫溴化二苯并呋喃的致癌物质。所以,放置电脑的房间最好能安装换气扇,倘若没有,上网时尤其要注意通风。





三 如何避免电脑辐射

电脑在使用过程中,显示屏会发出电磁、电离辐射。经常在电脑前工作,会使人体皮肤老化,造成皮肤粗糙,甚至还会引起皮肤发炎等病变。要防止电脑辐射,应从以下己方面入手:



在 选购电脑时,应尽可能购买新的保健型绿色电脑,一般不要使用旧电脑,旧电脑的辐射剂量较大,在同距离、同类机型的条件下,一般是新电脑的1--2倍。操作 电脑时最好在显示屏上安一块电脑专用滤色板以减轻辐射的危害,室内不要放置闲杂金属物品,以免形成电磁波的再次发射。





使用电脑时,要调整好屏幕的亮度,一般来说,屏幕亮度越大,电磁辐射越强,反之越小。不过,也不能调得太暗,以免因亮度太小而影响收视效果,且易造成眼睛疲劳。



在操作电脑时,要注意与屏幕保持适当距离。离屏幕越近,人体所受的电磁辐射越大,因此较好的是距屏幕0.5M以外。





此外,在操作电脑后,脸上会吸附不少电磁辐射的颗粒,要及时用清水洗脸,这样将使所受辐射减轻70%以上。



四 喝酸奶能减轻电脑辐射



早晚喝一杯牛奶已经成为很多人的好习惯,可你知道吗,午饭时或午饭后喝一杯酸奶,对健康也能起到重要的作用。



根据统计资料显示,我们每天早餐的热能供应占当日总热能需求的25%-30%,因此,早餐时喝一杯牛奶能够有效地补充热能;晚上临睡前喝一杯则有助于增加睡眠质量,让你进入深度熟睡状态,还能保证牛奶营养的充分吸收和消化。



那么,午餐时喝酸奶有什么好处呢?专家指出,酸奶中含有大量的乳酸、醋酸等有机酸,它们不仅赋予了酸奶清爽的酸味,还能帮助它形成细嫩的凝乳,从而抑制 有害微生物的繁殖,同时,使肠道的碱性降低,酸性增加,促进胃肠蠕动和消化液的分泌。此外,随着酸奶的生产技术、生产工艺不断进步,一些乳品大品牌,如蒙 牛等,已经将其酸奶产品中的益生菌由2种变成了4种,这样不仅酸奶的营养价值比同类产品有了明显提高,其帮助消化、抑制有害菌的作用也得到了进一步的加 强。



千万别小看酸奶的这些作用,这对于那些吃完午餐就坐在电脑前不再活动,容易导致消化不良或脂肪积累的上班族来说,非常有益。同 时,酸奶中的酪氨酸对于缓解心理压力过大、高度紧张和焦虑而引发的人体疲惫有很大的帮助。经过乳酸菌发酵,酸奶中的蛋白质、肽、氨基酸等颗粒变得微小,游 离酪氨酸的含量大大提高,吸收起来也更容易。午饭时或午饭后喝一杯酸奶,可以让上班族放松心情,在整个下午都精神抖擞,更有利于提高工作效率。



据一项最新的研究发现,酸奶还具有减轻辐射损伤、抑制辐射后人的淋巴细胞数目下降的作用。动物实验证明,摄入酸奶后的小鼠对辐射的耐受力增强,并减轻了 辐射对免疫系统的损害。对于那些长时间面对电脑,每时每刻笼罩在电磁辐射中的上班族来说,利用午饭的时间喝一杯酸奶,对健康非常有益。



五 隔离霜是否能隔离电脑辐射?

这也是许多JM关心的一个问题,我个人的答案是不能的。电脑辐射的大部分属于低频辐射,它的波长约为6.5cm,而隔离霜和防晒霜针对的主要是波长0.01-0.40微米的紫外线,,JMS可以自己考虑一下它对于电脑辐射有什么作用。





但是,隔离霜对电脑使用者是有一定好处的。那是因为电脑除了辐射会对人体造成伤害以外,电脑屏幕的静电效应会吸附大量空气中的微尘。简而言之,使用电脑时,我们的皮肤是处在一个相当“脏”的环境中,使用电脑时擦隔离霜可以减少灰尘对皮肤的伤害。







除此以外,我还了解到有一些防辐用品,介绍如下:

1.备长炭

就是一种有吸收电磁波功能的竹炭,曾经在google上搜过,但可惜只了解到在台湾和日本有卖,价格也很贵,要600元左右。

下面也是从别的地方转过来的:



竹炭防辐射的原理

经1000 度以上高温烧成的竹炭,竹子高温炭化后具有导电性。当年爱迪生在寻找灯泡导电材料时,曾使用高温烧制的竹炭,当成灯泡中导电灯丝。在电器周围摆放具有导电 性能的竹炭,籍着竹炭的良好导电性能,将周围电器形成的电磁波引导排除——这种作用就有点像利用避电针来防止打雷时被雷击。



在接触身体较频繁的电器(如电视、电脑、微波炉)周边,摆放竹炭,对电磁波具有某种程度阻隔效果,间接促进身体健康。例如在电视等电器前后左右都放上数根竹炭,或在旁边置放一整篓(到少1。5公斤)以上竹炭,就可阻隔部分电磁波。



另外科学家们正积极研究以竹炭做出[防护罩],用来罩住电器产生的电磁波。



2.种植物

听说种阔叶型的植物能有效地吸收电磁波,但前提是规模要达到热带雨林的程度,不太可行



3.低频辐射消除器

是一种像接线板一样的东西。

下面是引用广告里的一句话,估计有偏颇:

此产品能在电源供应同时,改变电荷运动方向,瞬间将主机、显示器、键盘、鼠标、打印机、扫描仪等产生的有害电磁波辐射经由电源零线回路彻底导除。

posted @ 2006-12-30 09:24 路是爬出来的 阅读(126) | 评论 (0)编辑 收藏

设计可组装的j2me UI(五) List

        高级UI中的List控件对于广大应用来说是足够的。但有些特别需求的功能确不得不自己开发,比如实现没一行字体颜色不同,字体样式不同,还有排版等方面问题时候则要自己动手实现一个了。下面把我在项目中学习到得经验与大家分享下。

       但是客户有个需求,说你这个List需要翻页,我要求输入什么键你进行上下翻页。我要求在每一行字体里面包含一些不同颜色得字,根据XP,好我拥抱需求。所以让我们来看下怎么修改程序得。

      注意在看这篇文章之钱,请稍微留意下在下得前面几篇文章。谢谢,^_^

      代码如下,我会加比较多得注释



java 代码


 


  1. /******************************************************************** 

  2.  *  

  3.  * 版权说明,此程序仅供学习参考。不能用于商业 

  4.  *  

  5.  ********************************************************************/  

  6. package org.pook.ui;  

  7.   

  8. import java.util.Vector;  

  9.   

  10. import javax.microedition.lcdui.Graphics;  

  11. import javax.microedition.lcdui.Image;  

  12.   

  13. import org.pook.ui.core.Platform;  

  14. import org.pook.ui.util.GraphicsUtil;  

  15.    

  16.   

  17. /** 

  18.  * 类名:List.java 

     
     

  19.  * 编写日期: 2006-10-14 

     

  20.  * 程序功能描述:实现Part部件,而获取可按照自己要求得效果得List

     

  21.  * Demo: 

     

  22.  * Bug: 

     

  23.  *  

  24.  * 程序变更日期 :

     
     

  25.  * 变更作者 :

     
     

  26.  * 变更说明 :

     

  27.  *  

  28.  * @author wuhua 

     
     

  29.  */  

  30. public class List extends Part {  

  31.     Image icon;  

  32.     Vector items;        

  33.     int numOfEls;   

  34.     int paintSize;  

  35.     int space;  

  36.     /** 开始索引 * */  

  37.     private int startIndex;  

  38.     





  39.     public List(Image icon) {  

  40.         super(021, Platform.WIDTH, Platform.HEIGHT - 41);  

  41.         this.icon = icon;  

  42.         items = new Vector();  

  43.            

  44.     }  

  45.    


  46.    /** 主要是根据屏幕变化而改变各个StringItem的位置跟当前屏幕可以显示StringItem的大小* */ 


  47.  


  48.     public void changeViewAndSize(){  

  49.         if (Platform.HEIGHT - 20 > view[HEIGHT]) {  

  50.             view[HEIGHT] = Platform.HEIGHT - 41;  

  51.             space = font.getHeight() + 2;  

  52.             paintSize  = view[HEIGHT] / space;  

  53.         }  

  54.     }  

  55.    


  56.     public void append(Vector items){  

  57.         if(items == null)  

  58.             return;  

  59.         this.items = items;  

  60.         this.numOfEls = items.size();  

  61.     }  

  62.   

  63.     public void append(String stringItem){  

  64.         this.items.addElement(stringItem);  

  65.         this.numOfEls = items.size();  

  66.     }  

  67.       

  68.       

  69.     public void insert(String stringItem){  

  70.         this.items.insertElementAt(stringItem,0);  

  71.         this.numOfEls = items.size();  

  72.     }  

  73.       

  74.     public int getSelectIndex(){  

  75.         return this.selectIndex;  

  76.     }  

  77.       

  78.     public String getSelectString(){  

  79.         //System.out.println(this.numOfEls);  

  80.         return (String) this.items.elementAt(selectIndex+startIndex );  

  81.     }  

  82.       

  83.     public void paint(Graphics g) {  

  84.         changeViewAndSize();  

  85.         GraphicsUtil.fillScreen(g, this.bgColor, view[X], view[Y], view[WIDTH], view[HEIGHT]);  

  86.         paintStrings(g);  

  87.     }  

  88.   

  89.     private void paintStrings(Graphics g) {  

  90.       

  91.         if (items.size() == 0)  

  92.             return;  

  93.         int size = this.paintSize > this.numOfEls? this.numOfEls:this.paintSize + startIndex;  

  94.           

  95.         paintSelect(g, view[Y] + space * selectIndex + 2 );  

  96.           

  97.         g.setColor(this.fontColor);  

  98.           

  99.         for(int i =startIndex,j=0; i< size; i++, j++){  

  100.                

  101.             String it = (String) items.elementAt(i);          

  102.               

  103.             if(this.selectIndex == j){  

  104.                 it = (String) items.elementAt(selectIndex+startIndex);  

  105.                 //this.select.paint(view[X], height, view[WIDTH],it.getItemHeight(),g);  

  106.             }else{  

  107.                    

  108.             }  

  109.             GraphicsUtil.darwString(g,it, view[X] + 10, view[Y] + space *j + 2);  

  110.             // 变化的高度  

  111.                

  112.         }    

  113.     }  

  114.     private void paintSelect(Graphics g, int height) {  

  115.         g.setColor(0x909090);  

  116.         g.fillRect(view[X], height, view[WIDTH], space);  

  117.     }  

  118.   

  119.     public void onClick(int keyCode) {  

  120.         keyUpAndDown(keyCode);  

  121.     }  

  122.   

  123.     /** 

  124.      * 内部实现按钮向上向下时候的动作,有具体类的keyPress调用. 

  125.      *  

  126.      * @param keyCode 

  127.      */  

  128.     void keyUpAndDown(int keyCode) {  

  129.         if(this.numOfEls == 0)  

  130.             return;  

  131.         switch (keyCode) {  

  132.       

  133.         case Platform.KEY_UP: {  

  134.             selectIndex--;  

  135.                

  136.          break;  

  137.                 

  138.                

  139.         }  

  140.         case Platform.KEY_DOWN: {  

  141.             selectIndex++;  

  142.                

  143.              break;  

  144.         }  

  145.         }  

  146.         changeSelectIndex();  

  147.     }  

  148.       

  149.     /** 

  150.      * 判断当前选择条是否到了底部,经过用户的选择,这些选择条会不断的变化

     变化的依据是当selectPosition >=
     

  151.      * viewPart[HEIGHT]*/  

  152.     private void changeSelectIndex(){  

  153.         int num = (this.paintSize < numOfEls)?paintSize:numOfEls;//取可显示的菜单项数目  

  154.         if (selectIndex>num-1)  

  155.         {  

  156.             startIndex++;  

  157.             selectIndex=(byte)(num-1);  

  158.         }  

  159.           

  160.         if (selectIndex < 0)  

  161.         {  

  162.             if (startIndex>0)  

  163.             {  

  164.                 selectIndex =0;  

  165.                 startIndex--;  

  166.             }  

  167.             else  

  168.             {  

  169.                 startIndex = numOfEls-num;  

  170.                 selectIndex=num-1;  

  171.             }  

  172.               

  173.         }  

  174.         if (startIndex+ selectIndex > numOfEls -1)  

  175.         {  

  176.             startIndex= 0;  

  177.             selectIndex = 0;  

  178.         }  

  179.     }  

  180.   

  181. }  


posted @ 2006-12-30 09:24 路是爬出来的 阅读(144) | 评论 (0)编辑 收藏

MIDP 2.0安全机制 与 MIDlet 数字签名(转自j2medev)

本篇文章转自www.j2medev.com/bbs/dispbbs.asp
















MIDP 2.0安全机制 与 MIDlet 数字签名

 

          本文档是 WoTrust 根据 Forum Nokia 提供的技术文档《MIDP 2.0: Tutorial On Signed MIDlets》翻译整理的,请同时参考此英文原文文档。请用户在编写 MIDlet 和签名 MIdlet 之前阅读此文档,以便对 MIDP2.0 的安全机制有一个深刻的理解,有助于用户能用好 MIDlet 代码签名证书。


 一、概述


    MIDP2.0 采用了全新的安全机制,这对于需要调用一个敏感的(重要的)函数和 API 的 MIDlet 开发者来讲是必须了解的,如:网络连接 API 、消息 API 和推 (Push) 函数等,还有一些可选的 MIDP 包也有许多受限制的 API 。


    虽然购买代码签名证书需要费 用,但签名 MIDlet 对开发者来讲是收益非浅的,因为许多受保护的 API 都是需要签名的,以保护开发者和用户的利益。当然,有些应用是不需要签名的,如有些不需要联网的仅用到一些图形 API 的小游戏软件。但一些重要的应用,如:连接网络、发送短消息 ( 短信和彩信 ) 或访问移动终端 ( 智能手机、 PDA 等,以下简称为手机 ) 上的 PIM( 个人信息管理 ) 数据等等都需要签名。


    数字签名 MIDlet 的好处包括:


    (1) 基于 MIDlet 的安全策略,某些功能是必须签名才能使用的,而有些功能虽然不签名也可以使用,但必须要求用户在使用时确认和修改其安全策略,如:写用户数据缺省是不允许没有签名的 MIDlet 操作的;


    (2) 基于手机的系统安全和移动网络的安全考虑,某些手机制造商、移动运营商等可能拒绝没有签名的 MIDlet 在手机上安装和运行;


    (3) 大大改善用户体验,让用户使用方便,使得用户不会遭遇调用受保护 API 时的安全警告的烦恼;


    (4) 出于安全考虑,安装没有签名的 MIDlet 是会有安全警告的,而相反,安装已经签名的 MIDlet 则不会出现烦人的警告,手机会自动验证签名而顺利地安装成功;


    (5) 已经签名的 MIDlet 将使得用户能改善其低安全策略设置,提高手机的安全性;


    (6) 确保已经签名的 MIDlet 不会被非法篡改和非法盗用。


二、 MIDP 2.0 安全机制


    MIDP 是一个开放的平台,使得任何人都可以为支持 MIDP 的设备开发各种应用软件,一般都是移动终端设备。 MIDlet 套件可以以匿名方式通过网络下载,非常方便,但这也会带来许多安全问题和隐私信息保护问题,用户会问: MIDlet 能把用户的个人信息发给不知道的服务器吗?会自动产生没有授权的呼叫或短消息而给用户带来费用吗?恶意软件会破坏手机?等等。


     除了 Java 语言的安全特性外, MIDP 还增加了许多安全考虑。 MIDP 2.0 比 MIDP 1.0 增强了安全策略,把 API 分为普通 API 和敏感 API ,如:通过  HTTP 协议访问移动网络,由于会给用户产生费用, 所以被列为 敏感 API 。 MIDlet 2.0 推出了可信任 MIDlet(trusted) 和不可信任 MIDlet(untrusted) 的概念,一个不可信任 MIDlet 只能访问有限的 API ,同时还需要用户手动确认并修改其安全策略;而可信任 MIDlet 则自动继承系统中的安全策略而获得访问许可。


     许可 (Permissions) 用于需要身份认证的 敏感 API 。 MIDP 2.0 要求调用 敏感 API 之前必须获得必要的许可,这些许可包的命名同 J2SE 许可,如: HTTP 连接许可同样称为: javax.microedition.io.Connector.http 。 有关许可的文档同意归类在受保护 API 中。


2.1 Protection Domains( 保护域 )


     保护域是 MIDP 2.0 中一个非常重要的安全概念,一个保护域就是一个许可集和一种交互模式,这些许可既可以是自己继承的,也可能是用户设置的,前者称为允许 (allowed) ,而后者称为用户允许 (user permission) 。当一个 MIDlet 被安装后,它被分配到一个指定的保护域而获得它的许可和交互模式。


    而用户允许则需要用户自己决定是否同意,用户既拒绝一个许可,也可以同意。用户允许有 3 种交互模式: blanket( 普遍适用 ) 、 session( 短期适用 ) 和 oneshot( 本次适用 ) , 普遍适用 模式就是 MIDlet 安装时获得的许可一直有效,除非用户取消这些许可;而 短期适用 模式则是指第一次调用 API 时需要用户允许,有效期到此 MIDlet 套件运行结束;而 本次适用 模式则在每次调用 API 时都要求用户允许。保护域为用户许可定义了缺省的交互模式。


    一个 MIDlet 套件使用 MIDlet-Permissions MIDlet-Permissions-Opt 属性来明确地定义其许可,可以是在 JAD 文件中定义,也可以在 manifest 文件中定义。其中: MIDlet-Permissions 定义了 MIDlet 套件中必须具有的许可,而 MIDlet-Permissions-Opt 则定义希望具有的许可。如:一个应用软件的基本要求是要有 http 连接才能正常工作,同时,也可以使用 https 连接 ( 服务器部署了 SSL 证书 ) 来增强安全性,但不是必须的,这样,这个应用软件的应用描述可以是这样:


        MIDlet-Permissions: javax.microedition.io.Connector.http


        MIDlet-Permissions-Opt: javax.microedition.io.Connector.https


     请注意:一个 MIDlet 所要求的许可必须是安装时分配的保护域所具有的许可的子集。如: Nokia S60 MIDP Emulator Prototype 2.0 (SDK) 有一个叫做“ minimum ”的域,此域没有任何许可。所以,如果一个含有许多许可的已经签名的 MIDlet 如果被安装到此域,则会安装失败,因为此域不支持这些许可。同样,如果一个许可的名称有拼写错误,则一样会导致安装失败,因为域中没有此拼写错误的许可。


    MIDP 2.0 为 GSM/UTMS 设备定义了 4 种保护域: manufacturer( 设备制造商 ) , operator( 移动运营商 ) , trusted third party( 可信任的第三方 ) , and untrusted( 不受信任域 ) , 除了 untrusted 域外,每个保护域都对应一组根证书,用于签名 MIDlet 的签名证书的根证书必须包含在这些根证书中,使用不同的签名证书签名的 MIDlet 将被自动归类予根证书所属的保护域,根证书与保护域的关系是:一个保护域可以有许多个根证书,而一个根证书只能对应于一个保护域。


    具体来讲, manufacturer 域属于设备制造商,其根证书是设备制造商自己的根证书;而 operator 域运营商,一般使用其 SIM 卡中的根证书;而 trusted third party 域则预置了全球知名的数字证书颁发机构 (CA) 的根证书,用于验证由 CA 颁发的 MIDlet 签名证书;而 untrusted 域没有根证书,将用于没有签名的 MIDlet 和 MIDP 1.0 。


    Thawte 和 VeriSign 的根证书已经预置在 trusted third party 域 中,其 Java 代码签名证书可以用于签名 MIDlet 。当然,用户也可以选择使用设备制造商和移动运营商颁发的证书,只要其根证书已经包含在手机的 4 个保护域中。据 WoTrust 了解,大多数摩托罗拉 (Motorola) 手机只支持设备制造商域,所以,只能向 Motorola 申请签名服务了。


    请注意:由于 MIDP 2.0 也在不断地修改和增补,所以,可能不用的移动网络运营商有不同的保护域和许可,用户可能需要向移动运营商了解详细信息。而最简单的方法是检查目标用户所使用的手机的根证书是否有计划购买的 MIDlet 签名证书的根证书。


2.2 Untrusted MIDlet ( 不受信任的 MIDlet)


    MIDP 2.0 定义了那些 API 是 untrusted 的,这些 Jar 文件的来源和完整性是不能被手机验证的。但这并不意味着这些 MIDlet 不能被安装和运行,而是运行这些 MIDlet 需要用户人工确认允许。而所有 MIDP 1.0 的 MIDlets 都被定义为 untrusted


    untrusted 的 MIDlets 只能调用一个不需要许可保护的 API ,如:

        java.util

        java.lang

        java.io

        javax.microedition.rms

        javax.microedition.midlet

        javax.microedition.lcdui

        javax.microedition.lcdui.game

        javax.microedition.media

        javax.microedition.media.control


     如果 untrusted MIDlet 套件试图调用一个被保护的 API 而且没有被人工允许,则会产生一个 SecurityException 而被 MIDlet 按照安全策略处理。请注意: Nokia 的 UI API 是不被保护的,包括类: com.nokia.mid.sound 和 com.nokia.mid.ui 。


2.3 Trusted MIDlets ( 可信任的 MIDlets)


     如果手机能验证 MIDlet 的身份和完整性 ( 也就是已经数字签名 ) ,则会自动分配一个合适的保护 域这种 MIDlet 套件就称为可信任的 MIDlet 。一个可信任的 MIDlet 套件所要求的许可将被准许,只要所属的保护域拥有这种许可,假如许可: javax.microedition.io.Connector.http 已经在所属保护域中是允许的,则 MIDlet 在打开一个 http 连接时是不需要用户确认的。


    请不要混淆了可信任的 MIDlet 套件和可信任的保护域的不同,每个可信任的 MIDlet 套件依据安全策略被分配到一个特定的保护域。


     您需要使用一个手机中已经预置的根证书的证书颁发机构颁发的代码签名证书来签名 MIDlet ,否则将不能通过身份验证。成功签名后的 JAD 文件中一定会包含有整个签名证书的证书链,属性名称为: MIDlet-Certificate-1-1 就是您的签名证书,而 MIDlet-Certificate-1-2 就是 CA 的中级根证书,而 MIDlet-Certificate-1-3 就是 CA 的顶级根证书。同时还会有一个 MIDlet-Jar-RSA-SHA1 属性就是 JAR 文件的摘要。


    当一个 MIDlet 被下载或被安装时, MIDlet 应用管理器首先会检查 JAD 文件中是否包含了 MIDlet-Jar-RSA-SHA1 属 性,如果有,则启动如下验证过程:首先会读出 MIDlet-Certificate-1-1 、 MIDlet-Certificate-1-2 和 MIDlet-Certificate-1-3 属性中的证书,并与已经预置的根证书相比较,如果证书链能被根证书验证,则表明开发者身份已经被验证。接着就会使用用户证书来解密 MIDlet-Jar-RSA-SHA1 属 性的摘要,再计算出已经下载的 Jar 文件的摘要,比较两个摘要是否相等,如果相等,则表明 MIDlet 代码自签名后没有被修改。这样,既验证了身份又检查了完整性的 MIDlet 会被分配到所属根证书所对应的保护域中。但是,如果 MIDlet 中的许可属性 ( MIDlet-Permissions ) 中有一个或多个不属于所属的保护域,则仍然不允许安装。而如果 MIDlet 中的可选许可属性 ( MIDlet-Permissions-Opt ) 中有一个或多个不属于所属的保护域,会允许安装。可见,正确设置许可属性和可选许可属性非常重要。


2.4 Function Groups ( 功能分组 )


     为了简化用户管理操作, MIDlet 把一些类似功能分组,这样,用户只需对功能组设置许可即可。如:许可 “Net Access”( 网络访问 ) 组来代替许可 javax.microedition.io.Connector.http ,这对于简化手机的交互操作非常有用。


    MIDP 2.0 和 JTWI 定义了如下 7 个功能组:


    (1) Net Access: 包括所有网络连接许可;


    (2) Messaging: 包括所有与发送和接收短消息 ( 短信和彩信 等 ) 相关的许可;


    (3) Auto Invocation : 包括与自动启动 MIDlet 相关的许可,如: Push Registration


    (4) Local Connectivity : 包括与本地连接相关的许可,如: IrDA 或 蓝牙;


    (5) Multimedia Recording : 包括与允许录音、照相、摄像等相关的许可;


    (6) Read User Data : 包括读取用户数据相关的许可,如:通讯录、日程表等;


    (7) Write User Data : 包括写用户数据相关的许可。


    不同的手机支持不同的功能组,如: Multimedia Recording 就不会包含在没有摄录装置的手机中。当然,也有可能将来会增加更多的功能组。


     功能组也同时定义了不同的域的不同交互方式,如:在不信任域, “Net Access” ( 网络访问 ) 被设置为 session( 短期适用 ) 或 denied( 拒绝 ) ,而在可信任域则可以设置为 oneshot 、 blanket 和 denied 的。


三、仿真器和手机的缺省安全设置


    让我们来看看具体的使用 Thawte 或 VeriSign 代码签名证书签名后的 MIDlet 在 trusted third party 域中的所有缺省许可,如下图 1 所示,点击 NDS 3.0 的“ Config Emulators ”就可以看到仿真器在 trusted third party 域的缺省安全设置是“ Ask first time ”,即第 1 次使用是需要确认:


图片点击可在新窗口打开查看


    如下图 2 所示,您可以下拉所有功能组的许可设置,如“ Network Access ”就有 4 个选项可以修改: Ask first time 、 Ask every time 、 Always allowed 和 Not allowed :


图片点击可在新窗口打开查看


     而如下图 3 所示,在“ Real Life ”模式,也就是实际手机的运行模式,可以看出:定义的 7 个功能组都是“ Always allowed ” ( 总是允许 ) ,这就显示出 MIDlet 签名对于开发商来讲是多么的重要,将大大方便了用户的使用,再也不需要用户操作烦人的系列确认了。


图片点击可在新窗口打开查看


posted @ 2006-12-30 09:24 路是爬出来的 阅读(105) | 评论 (0)编辑 收藏

再次贡献j2meUI设计源代码

         要贡献就贡献的彻底,代码里面很多bug,写的很乱,请大家见谅。希望大家可以多学习交流。

posted @ 2006-12-30 09:24 路是爬出来的 阅读(129) | 评论 (0)编辑 收藏

如何在MIDP中实现图片放缩(转自linuxmine)

      设计游戏的朋友经常会遇到对图片资源的操作。今天浏览web发现此贴不错。所以抄过这边来

原文:www.linuxmine.com/45911.html







无论在midp1.0还是在 midp2.0中,系统都没有给我们提供对图片进行伸缩操作的api.但是其实我们只要在程序代码中略施小计,就能达到这个效果,只是效果要比美术做出来 的图片,呵呵,差多啦,同时也会造成性能损失。伸缩图片的构造原理就是简单沿x,y轴按比例放缩,比如说我们需要把一张16*16的png图片转化成一张 32*32的图片,那么我们可以先对该图片做一个水平方向上的拉伸操作,然后再把水平拉伸后的图片按垂直方向再做一次拉伸操作。做拉伸操作时,比如水平方 向上,我们需要构造一张32*16的mutable Image,获取其Graphics,利用该Graphics,绘制该mutable Graphics的每一列像素,这一列像素就来自于原始图片中的按比例对应的某一列像素。垂直方向上的拉伸操作也是如法炮制。因为是一种按比例的对应关 系,图像的缩小操作也可按该办法进行。



效果如下图所示

 


原始图片


 


图片放大为全屏幕大小




图片缩小为原来的1/4大小




好了,我们来看代码

java 代码


 


  1. import javax.microedition.lcdui.Graphics;  

  2. import javax.microedition.lcdui.Image;  

  3.   

  4. /** 

  5. * 图像工具类 

  6. * @author Jagie 

  7. * 

  8. */  

  9.   

  10. public class ImageUtil {  

  11.   

  12. /** 

  13. * 图像放缩方法 

  14. * @param srcImage 原始的Image对象 

  15. * @param newW 放缩后的Image的宽度 

  16. * @param newH 放缩后的Image的高度 

  17. * @return 放缩后的Image对象 

  18. */  

  19.   

  20. public static final Image scale (Image srcImage, int newW, int newH) {  

  21. int srcW = srcImage.getWidth();  

  22. int srcH = srcImage.getHeight();  

  23. //先做水平方向上的伸缩变换  

  24. Image tmp = Image.createImage(newW, srcH);  

  25. Graphics g = tmp.getGraphics();  

  26.   

  27. for (int x = 0; x < newW; x++) {  

  28. g.setClip(x, 01, srcH);  

  29. //按比例放缩  

  30. g.drawImage(srcImage,x-x*srcWnewW,0,Graphics.LEFT | Graphics.TOP);  

  31.   

  32. }  

  33.   

  34. //再做垂直方向上的伸缩变换  

  35. Image dst = Image.createImage(newW, newH);  

  36. g = dst.getGraphics();  

  37.   

  38. for (int y = 0; y < newH; y++) {  

  39. g.setClip(0, y, newW, 1);  

  40. //按比例放缩  

  41. g.drawImage(tmp,0,y-y*srcHnewH,Graphics.LEFT | Graphics.TOP);  

  42.   

  43. }  

  44.   

  45. return dst;  

  46. }  

  47.   

  48.   

  49. }  

  50.   

  51. 也许有同学会提出疑问,既然是按x,y方向按等比例放缩,那我写成这样岂不是代码更简洁:  

  52.   

  53. public static final Image scale2(Image srcImage, int newW, int newH) {  

  54. int srcW = srcImage.getWidth();  

  55. int srcH = srcImage.getHeight();  

  56.   

  57. Image dst=Image.createImage(newW,newH);  

  58. Graphics g=dst.getGraphics();  

  59. for (int x = 0; x < newW; x++) {  

  60. for (int y = 0; y < newH; y++) {  

  61. g.setClip(x, y, 11);  

  62. g.drawImage(srcImage, x-x*srcWnewW, y - y * srcH / newH, Graphics.LEFT  

  63. | Graphics.TOP);  

  64.   

  65. }  

  66.   

  67. }  

  68.   

  69. return dst;  

  70. }  







这种做法效果上和前者无异,但是并不可取,只要算算它的时间复杂度就知道,基本上是前者的平方。在我的机器上,做一次全屏幕的放缩操作,前者耗时60ms,而后者耗时7150ms。







其实上面的做法很简单,以后有需求可以整理成一个控件,这样就可以很方便的调用,与学习。

posted @ 2006-12-30 09:24 路是爬出来的 阅读(82) | 评论 (0)编辑 收藏

设计可组装的j2me UI(六) Dialog(对话框)

     摘要:       高级UI提供了一个Alert的控件可以有弹出对话框的效果。但是大家想不想自己实现一个呢。想不想知道sun是如何让Alert工作的呢?好请看下文     设计思想是。建立一个 abstract   class Dialog extends Canvas。下面的事情就让我们一步步花出来吧。&nbs...  阅读全文

posted @ 2006-12-30 09:24 路是爬出来的 阅读(206) | 评论 (0)编辑 收藏

切割图片

      大家在设计游戏或者其他应用的时候,很多都要操作图片。众所周知。j2me程序不能太大,因为它有太多的限制。改怎么办呢,我的应用要求大量的图片。没关系,图片是死的,人是活的。我们始终都是有办法搞定的。高手们自己写个图片压缩的算法,我们这些水平一般的人只能踏实的做自己的事情了。

      1。通过工具压缩图片大小。比如把颜色植调小点,这样不仅效果在手机上不会差很多,还可以大大的缩小图片。

      2。把所有的图片绘制成一张大图片。然后通过程序来切割它,这样在操作上面会方便很多。

      下面我们来看看代码把

  

      

java 代码


 


  1. try { 


  2.            //创建源图片


  3.             source = Image.createImage("/p.png");   

  4.         } catch (IOException e) {  

  5.             log.error(e, "读取图片文件错误");  

  6.             System.exit(0); // 退出程序  

  7. }  



java 代码


 


  1. /** 

  2.  * 载入图片。切割图片资源 

  3.  */  

  4. public static final void loadImages() { 


  5.     //切割图片了。只要知道具体的位置,就什么都可以办到

  6.     MY_BOOK = Image.createImage(source, 63120220);  

  7.     NET_BOOK = Image.createImage(source, 632120220);  

  8.     ABOUT = Image.createImage(source, 556120220);  

  9.     HELP = Image.createImage(source, 17931120220);  

  10.     EXIT =  Image.createImage(source, 1794120220);  

  11.     ARROW = Image.createImage(source, 178571590);  

  12. }  





程序就这么简单。详细的例子可以看看我共享的关于电子阅读的基本框架

posted @ 2006-12-30 09:24 路是爬出来的 阅读(145) | 评论 (0)编辑 收藏

仅列出标题
共5页: 上一页 1 2 3 4 5 下一页