欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
J2ME程序開(kāi)發(fā)全方位基礎講解匯總

一、J2ME中需要的Java基礎知識
       現在有大部分人,都是從零開(kāi)始學(xué)J2ME的,學(xué)習J2ME的時(shí)候,總是從Java基礎開(kāi)始學(xué)習,而且現在講Java基礎的書(shū)籍中都是以J2SE來(lái)講基礎,這就給學(xué)習造成了一些不必要的麻煩,下面將J2ME中用到的和不需要的Java基礎知識做一個(gè)簡(jiǎn)單的說(shuō)明。
       J2ME中使用到的Java基礎知識:
    1、Java語(yǔ)法基礎:包括基本數據類(lèi)型、關(guān)鍵字、運算符等等
    2、面向對象的思想:類(lèi)和對象的概念,繼承和多態(tài)等等。
    3、異常處理
    4、多線(xiàn)程
  J2ME中沒(méi)有用到的Java基礎知識:
    1、JDK中javac和java命令的使用
    2、Java基礎中的很多類(lèi)在J2ME中沒(méi)有,或者類(lèi)中的方法做了大量的精簡(jiǎn)。所以建議在J2ME中熟悉類(lèi)庫。
    3、Applet、AWT、Swing這些知識在J2ME中根本使用不到。
  簡(jiǎn)單說(shuō)這么多,希望學(xué)J2ME的朋友們能少走一些彎路,不足之處希望大家積極指正和補充。

二、J2ME中暫時(shí)無(wú)法完成的功能
  列一些J2ME中暫時(shí)無(wú)法完成的功能,希望大家能積極補充:
    1、在手機中不更改代碼實(shí)現移植,主要指游戲。
    2、動(dòng)態(tài)修改按鈕文字。
    3、在Canvas上接受中文輸入。
    4、操作本地資源、例如地址本、已收短信息等。
    5、制作破壞性的手機病毒。
    6、其他等待大家來(lái)補充。

三、J2ME的跨平臺性
  J2ME技術(shù)源于Java,所以也具有JVM的優(yōu)勢,可以在支持Java的平臺上進(jìn)行移植,但是現在的J2ME技術(shù)在跨平臺上卻做的很糟糕,我們來(lái)簡(jiǎn)單看一下原因:
  1、手機的屏幕尺寸不一:
  這個(gè)主要在界面制作上。如果你使用的是高級用戶(hù)界面,比如你做的是應用開(kāi)發(fā)或者用戶(hù)登陸、用戶(hù)注冊這樣的通用功能時(shí),一般沒(méi)有什么問(wèn)題。
  如果你使用的是低級用戶(hù)界面,比如你做的是游戲,那么你就需要考慮這個(gè)問(wèn)題了。
  2、廠(chǎng)商的擴展API不統一:
  例如Nokia的擴展API類(lèi)庫UI系列,在別的手機上或者沒(méi)有實(shí)現,或者包名不同等等。
  3、手機平臺上實(shí)現的bug:
  例如Nokia的7650在實(shí)現雙緩沖上有bug,那么在這種機型上運行的軟件就不能使用雙緩沖。其他NOKIA上的一些bug,可以參看:http://blog.csdn.net/Mailbomb/archive/2005/03/24/329123.aspx
  4、手機性能問(wèn)題。
  不同手機的可用內存、最大jar文件都有要求,例如Nokia S40的大部分手機支持的最大jar文件為64K,最大可用內容為210K。
  所以現在的手機軟件,特別是游戲都提供支持的機型列表,也才有了手機游戲移植人員的存在。

四、學(xué)習J2ME可以從事的工作種類(lèi)
  現在J2ME技術(shù)可以說(shuō)相當的火暴,這里介紹一些學(xué)好了J2ME之后可以從事的工作的種類(lèi):
  1、J2ME游戲開(kāi)發(fā)人員
  根據游戲策劃或者文檔要求,在某種特定的機型(以Nokia S40或S60居多)開(kāi)發(fā)游戲程序。
  這是現在大部分J2ME程序員從事的工作。
  需要熟練掌握:高級用戶(hù)界面、低級用戶(hù)界面、線(xiàn)程,如果是網(wǎng)絡(luò )游戲,還需要熟練網(wǎng)絡(luò )編程。
  2、J2ME應用開(kāi)發(fā)人員
  現在的移動(dòng)應用還不是很多,但是還是出現了一些,特別是移動(dòng)定位以及移動(dòng)商務(wù)相關(guān)的內容。
  需要熟練掌握:高級用戶(hù)界面、線(xiàn)程和網(wǎng)絡(luò )編程。
  3、J2ME游戲移植人員
  參照源代碼,將可以在一個(gè)平臺上可以運行的游戲移植到其他平臺上去。例如將Nokia S40的游戲移植到S60上,或者索愛(ài)的T618等等。
  主要是控制屏幕坐標,有些可能需要替換一些API。
  需要熟悉各平臺之間的差異以及相關(guān)的技術(shù)參數,比如屏幕大小、最大jar文件尺寸等等。

五、J2ME程序設計的幾個(gè)原則
  1、使用面向對象編程。
  雖然使用面向過(guò)程編程可以減小文件的尺寸,但是為了以后維護的方便和利于擴展,還是要使用面向對象編程。
  2、使用MVC模式
  將模型、界面和控制分離?,F在很多的程序將三者合一,但是如果你做的程序比較大的話(huà),還是建議你進(jìn)行分離。
  3、自動(dòng)存儲用戶(hù)設定
  使用RMS來(lái)存儲用戶(hù)的信息,例如存儲用戶(hù)上次輸入的用戶(hù)名、密碼、用戶(hù)對于系統的設定等,這樣不僅可以減少用戶(hù)的輸入,而且對用戶(hù)友好。很多程序甚至做了自動(dòng)登陸等。
  4、一些系統設置允許用戶(hù)關(guān)閉。如背景音樂(lè )、背景燈顯示等。
  5、將低級用戶(hù)界面的繪制動(dòng)作放在一個(gè)獨立的線(xiàn)程里面去。
  6、在需要大量時(shí)間才能完成的工作時(shí),給用戶(hù)一個(gè)等待界面。

六、從模擬器到真機測試
  對于J2ME開(kāi)發(fā)者來(lái)說(shuō),模擬器給我們帶來(lái)了很多方便,比如可以在模擬器中調試程序以及很方便的察看程序的效果,但是模擬器也給我們帶來(lái)了一些問(wèn)題,比如模擬器實(shí)現的bug等等,所以進(jìn)行真機測試是必須的。
  1、為什么要進(jìn)行真機測試?
  因為模擬器程序可能存在bug,以及真機的性能有限,所以必須進(jìn)行真機測試。
  2、如何將程序傳輸到機器中?
  將程序傳輸到機器中有如下方式:
    a) OTA下載
    b) 使用數據線(xiàn)傳輸
    c) 紅外傳輸
    d) 藍牙
  你可以根據條件,選擇合適的方式。
  3、 真機測試主要測什么?
  真機測試的內容很多,主要測試以下幾個(gè)方面:
    a) 程序的功能
    b) 程序的操作性,是否易操作
    c) 程序的大小,比如Nokia S40系列的手機大部分接受的最大文件尺寸為64K
    d) 程序運行速度,速度是否可以忍受。

七、從WTK到廠(chǎng)商SDK
  對于J2ME愛(ài)好者來(lái)說(shuō),基本上大家都是從SUN的WTK(J2ME Wireless Toolkit)開(kāi)始的,但是對于實(shí)際應用來(lái)說(shuō),僅僅使用WTK是遠遠不夠的,所以在學(xué)習過(guò)程中,必須完成從WTK到SDK的跨越。
  1、廠(chǎng)商SDK的下載地址?
  http://blog.csdn.net/Mailbomb/archive/2005/01/01/236606.aspx
  2、廠(chǎng)商SDK和WTK有什么不同?
  廠(chǎng)商SDK最簡(jiǎn)單的理解就是在WTK的基礎上增加了自己的模擬器和自己的擴展API。
  也就是說(shuō),你在使用廠(chǎng)商的SDK時(shí),可以使用廠(chǎng)商的擴展類(lèi)庫,例如Nokia的UI類(lèi)庫,和廠(chǎng)商自己的模擬器而已。
  每個(gè)廠(chǎng)商的擴展API都不多,而且不盡相同。
  3、如何使用?
  有些廠(chǎng)商SDK的使用都和WTK相同,例如SamSung。
  Nokia提供了獨立的界面來(lái)開(kāi)發(fā),但是這個(gè)界面在實(shí)際開(kāi)發(fā)中使用不多。
  4、廠(chǎng)商SDK的問(wèn)題
  廠(chǎng)商SDK實(shí)現過(guò)程中,有一些bug,而且和真機實(shí)現不一致。例如NOKIA的混音播放問(wèn)題等等。

八、在J2ME中獲得手機IMEI的方法
  IMEI是Internation mobile entity identification的簡(jiǎn)稱(chēng),在手機中輸入*#06#可以顯示該數字,長(cháng)度為15位,全球唯一,永遠不會(huì )沖突,所以可以作為識別用戶(hù)的一個(gè)標志。
  下面是在J2ME中獲得IMEI的方法:
  1、MOTO系列的手機可以通過(guò)讀取系統的IMEI屬性獲得,代碼如下:
             String imei = System.getProperty("IMEI");
  2、SIEMENS系列的手機可以通過(guò)讀取系統的com.siemens.IMEI屬性獲得,代碼如下:
             String imei = System.getProperty("com.siemens.IMEI");

九、J2ME網(wǎng)絡(luò )連接中顯示問(wèn)題的解決辦法
  在網(wǎng)絡(luò )編程中,有些時(shí)候會(huì )出現一些在沒(méi)有接收到網(wǎng)絡(luò )數據就顯示界面的,造成界面顯示不符合要求(例如公告顯示,會(huì )先顯示公告的背景圖片再顯示公告信息),這里提一個(gè)簡(jiǎn)單的解決辦法給大家:
  解決這種情況的方法分成三個(gè)步驟:
  1、在需要顯示的界面中,調用發(fā)送網(wǎng)絡(luò )數據的方法。每次顯示時(shí)調用該構造方法,不調用Display的setCurrent方法顯示。
  2、顯示等待界面(例如進(jìn)度條等),給用戶(hù)提示,在進(jìn)行網(wǎng)絡(luò )連接。
  3、在處理網(wǎng)絡(luò )反饋的數據完以后,調用Display的setCurrent方法顯示顯示當前界面。

十、增強J2ME的String能力——分割字符串
  從JDK1.4以后,String類(lèi)中新增了split方法來(lái)實(shí)現字符串的分割,但是在J2ME中卻沒(méi)有該方法(MIDP2.0中也沒(méi)有實(shí)現),但是在實(shí)際使用過(guò)程中,有些時(shí)候的確要用到這種操作,這里將我以前實(shí)現的一段代碼和大家共享:
/**
* 分割字符串,原理:檢測字符串中的分割字符串,然后取子串
* @param original 需要分割的字符串
* @paran regex 分割字符串
* @return 分割后生成的字符串數組
*/

private static String[] split(String original,String regex)
{
     //取子串的起始位置
     int startIndex = 0;
     //將結果數據先放入Vector中
     Vector v = new Vector();
     //返回的結果字符串數組
     String[] str = null;
     //存儲取子串時(shí)起始位置
     int index = 0;

     //獲得匹配子串的位置
     startIndex = original.indexOf(regex);
     //System.out.println("0" + startIndex);
     //如果起始字符串的位置小于字符串的長(cháng)度,則證明沒(méi)有取到字符串末尾。
     //-1代表取到了末尾
     while(startIndex < original.length() && startIndex != -1)
     {
           String temp = original.substring(index,startIndex);
           System.out.println(" " + startIndex);
           //取子串
           v.addElement(temp);

           //設置取子串的起始位置
           index = startIndex + regex.length();

           //獲得匹配子串的位置
           startIndex = original.indexOf(regex,startIndex + regex.length());
     }

     //取結束的子串
     v.addElement(original.substring(index + 1 - regex.length()));
     //將Vector對象轉換成數組
     str = new String[v.size()];
     for(int i=0;i
     {
          str[i] = (String)v.elementAt(i);
     }
    
     //返回生成的數組
     return str;
}

十一、J2ME在低級用戶(hù)界面上分行顯示文字
  在J2ME的低級用戶(hù)界面開(kāi)發(fā)中,經(jīng)常會(huì )遇到需要在Canvas上顯示大量的文字,例如關(guān)于界面、游戲說(shuō)明、游戲公告等信息。如果在設計時(shí),將文字的內容和長(cháng)度都固定,既不利于修改也不利于維護。下面介紹一個(gè)簡(jiǎn)單的方法,實(shí)現一個(gè)簡(jiǎn)單、可維護性強的方式。
  實(shí)現方法:
    1、將需要顯示的所有信息做成一個(gè)字符串。
    2、編寫(xiě)一個(gè)將該字符串按照要求轉換為字符串數組的方法。
    3、將轉換后的數組以循環(huán)的方式顯示在Canvas上。
  通過(guò)這樣三個(gè)步驟,則修改顯示的信息時(shí),只需要修改包含顯示信息的字符串即可,自己書(shū)寫(xiě)的方法可以按照以前的標準重新分割新的字符串。如果需要修改每行顯示的字符個(gè)數,則只需要修改自己書(shū)寫(xiě)的方法即可。
  通過(guò)這樣一種實(shí)現方式,可以很方便的實(shí)現顯示一些比較長(cháng)的文本信息,即使是可變長(cháng)度的字符串也沒(méi)有問(wèn)題。

十二、J2ME中使用記錄存儲系統(RMS)存儲信息
  在MIDP中,沒(méi)有文件的概念,所以永久存儲一般只能依靠記錄存儲系統實(shí)現,關(guān)于記錄存儲系統的簡(jiǎn)介,可以參看教程:http://www-900.ibm.com/developerWorks/cn/java/j-wi-rms/index.shtml
  下面是一些記錄存儲系統的常用編碼介紹:
    1、打開(kāi)記錄集:
  打開(kāi)記錄集使用RecordStore里面的靜態(tài)方法openRecordStore,示例代碼如下:
          RecordStore rs = RecordStore.openRecordStore(“username”,true);
  這樣就打開(kāi)了一個(gè)名稱(chēng)為rs的記錄集,其中username為記錄集的名稱(chēng),該名稱(chēng)可以根據需要來(lái)取,第二個(gè)參數代表是否則沒(méi)有時(shí)創(chuàng )建新的記錄集,true代表在該記錄集不存在時(shí),創(chuàng )建新的記錄集,false代表不創(chuàng )建。
  如果在打開(kāi)記錄集時(shí),該記錄集不存在,則拋出RecordStoreNotFoundException異常,所以檢測記錄集是否已創(chuàng )建可以使用該異常。
  注意:記錄集打開(kāi)以后記得關(guān)閉。
    2、向記錄集中寫(xiě)入數據
        2.1增加數據
  向已經(jīng)打開(kāi)的記錄集中添加數據,需要使用addRecord方法,示例代碼:
                 byte[] bytes = {1,2,3};
             int id = rs. addRecord(bytes,0,bytes.length);
  該代碼將字節數組bytes的全部?jì)热輰?xiě)入到記錄集中,該方法的返回值為該信息的id,注意:id從1開(kāi)始,而不是從0開(kāi)始。
  你可以循環(huán)使用該方法向記錄集中寫(xiě)入多條數據。
        2.2修改數據
  修改已經(jīng)存在的記錄集中指定id的數據,需要使用setRecord方法,示例代碼:
                 byte[] bytes = {1,2,3};
             rs. setRecord(1,bytes,0,bytes.length);
  以上代碼的作用是將字節數組bytes的全部?jì)热輰?xiě)入到id為1的記錄集rs中。
  該操作會(huì )覆蓋已有的數據。
  說(shuō)明:有些時(shí)候,你需要將信息寫(xiě)入到記錄集中的第一條記錄中,則可以結合以上兩個(gè)方法,則第一次時(shí)向記錄集增加數據,以后來(lái)進(jìn)行修改。
    3、從記錄集中讀出數據
  從記錄集中讀取已有數據,需要使用getRecord方法,示例代碼:
            byte[] bytes = rs. getRecord(1);
  該代碼從記錄集rs中讀取第一條數據,將讀取到的數據放在bytes數組中。
  在讀取數據時(shí),可以獲得記錄集中id的個(gè)數,可以使用getNumRecords方法獲得
  綜合代碼為:
       int number = rs. getNumRecords();
       int id = 1;
       if(id >0 && id < number)
       {
       byte[] bytes = rs. getRecord(1);
       }
    4、從記錄集中刪除記錄
  從記錄集中刪除記錄的方法有兩種:邏輯刪除和物理刪除。
  邏輯刪除是指給刪除的記錄打標記。
  物理刪除是指從物理上刪除該記錄,但是該記錄的id不能被重用,也就是說(shuō)該id不會(huì )被繼續使用。例如一個(gè)記錄集中有5個(gè)記錄,假設你刪除了id為3的數據,則剩余記錄的id依然為1、2、4、5。這給便歷帶來(lái)了一定的麻煩。
    5、便歷記錄集
  便歷記錄集,即訪(fǎng)問(wèn)記錄集中的所有數據,有兩個(gè)方法,詳見(jiàn):
http://gceclub.sun.com.cn/NASApp/sme/controller/teclist?tid=0103
    6、其他操作
  刪除記錄集
  刪除記錄集不同于刪除記錄,需要使用deleteRecordStore方法,示例代碼:          
                RecordStore. deleteRecordStore(“username”);
  該代碼刪除名稱(chēng)為username的記錄集。

十三、J2ME加密數據的一個(gè)第三方開(kāi)源免費類(lèi)庫介紹
  在J2ME編程中,經(jīng)常遇到一些數據在存儲或者傳輸時(shí)需要加密,下面介紹一個(gè)第三方的加密類(lèi)庫的一些資料:
  加密類(lèi)庫的官方主頁(yè):http://www.bouncycastle.org/
  介紹的文章:
  中文:http://18900.motorola.com/ewa_portal/develope/jc_j2messl_5_1.jsp
  英文:http://www.javaworld.com/javaworld/jw-12-2002/jw-1220-wireless.html
  該文章的源代碼包含使用的一些方法。
  備注:因為該類(lèi)庫提供的功能比較強大,所以類(lèi)庫的尺寸比較大,最后在發(fā)布時(shí)需要將類(lèi)庫中不需要的類(lèi)刪除

十四、如何播放聲音
  在J2ME中,處理聲音需要使用到Mobile Media API(MMAPI),該包是MIDP1.0的可選包,在MIDP2.0中已經(jīng)包含了這個(gè)包。所以如果你使用MIDP1.0的話(huà),請確認你的運行環(huán)境是否支持。
  一般手機支持的聲音文件格式為wav、mid和mpg等。具體請查閱你的手機說(shuō)明文檔。
  在聲音處理中,有很多處理的方式,這里說(shuō)一下最常用的情況,播放JAR文件中的wav文件。
  播放聲音文件的流程:
    1、按照一定的格式讀取聲音文件。
  播放JAR文件中的聲音文件一般是將聲音文件處理成流的形式。示例代碼:
             InputStream is = this.getClass().getResourceAsStream("/Autorun.wav");
       其中Autorun.wav文件位于JAR文件的根目錄下,如果位于別的目錄,需要加上目錄名稱(chēng),如/res /Autorun.wav。
    2、將讀取到的內容傳遞給播放器。
  將流信息傳遞給播放器,播放器按照一定的格式來(lái)進(jìn)行解碼操作,示例代碼:
             Player player = Manager.createPlayer(is,"audio/x-wav");
  其中第一個(gè)參數為流對象,第二個(gè)參數為聲音文件的格式。
    3、播放聲音。
  使用Player對象的start方法,可以將聲音播放出來(lái),示例代碼:
             player.start();
  在播放聲音時(shí)也可以設定聲音播放的次數,可以使用Player類(lèi)中的setLoopCount方法來(lái)實(shí)現,具體可查閱API文檔。
  下面是在NOKIA S60模擬器中測試通過(guò)。代碼如下:
package sound;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.media.*;
import java.io.*;

public class SoundMIDlet extends MIDlet
{
  private Player player = null;
  /** Constructor */
  public SoundMIDlet()
       {
             try
             {
                   InputStream is = this.getClass().getResourceAsStream("/Autorun.wav");
                   player = Manager.createPlayer(is,"audio/x-wav");
             }
             catch(IOException e)
             {
                   System.out.println("1:" + e);
             }
             catch(MediaException e)
             {
                   System.out.println("2:" + e);
             }
             catch(Exception e)
             {
                   System.out.println("3:" + e);
             }
      }

      /** Main method */
      public void startApp()
      {
             if(player != null)
             {
                   try
                   {
              player.start();
                   }
                   catch(MediaException e)
                   {
              System.out.println("4:" + e);
                   }
             }
       }

       /** Handle pausing the MIDlet */
       public void pauseApp()
       {
       }

       /** Handle destroying the MIDlet */
       public void destroyApp(boolean unconditional)
       {
       }
}

十五、J2ME 3D編程的一些資料
  隨著(zhù)J2ME技術(shù)的發(fā)展,以及硬件速度的提升,3D游戲程序將慢慢的變成主流,最近想學(xué)習這一塊的編程,所以收集了一些資料,和大家一起分享:
  1、JSR184
  JSR184是Nokia公司起草的一個(gè)關(guān)于3D API的規范,下載地址為:
  http://www.forum.nokia.com/main/1,,1_0_10,00.html#jsr184
  2、Nokia的3D編程資料
  http://www.forum.nokia.com/main/1,6566,21,00.html
  3、3D引擎
  一個(gè)簡(jiǎn)單的開(kāi)放源代碼的3D游戲引擎
  http://www.j2me.com.cn/Soft_Show.asp?SoftID=19
  國內一個(gè)合作開(kāi)發(fā)3D引擎的項目:
  http://gceclub.sun.com.cn/NASApp/sme/jive/thread.jsp?forum=11&thread=8593
  4、一款3D游戲產(chǎn)品
  http://games.sina.com.cn/newgames/2004/04/040217696.shtml
  5、支持3D的開(kāi)發(fā)工具
  當前一些高端的手機支持3D開(kāi)發(fā),支持3D開(kāi)發(fā)的開(kāi)發(fā)工具中,通用的有SUN的J2MEWTK2.2。專(zhuān)用的是廠(chǎng)商提高的支持JSR184的SDK。

十六、3D編程——第一個(gè)3D程序
  參考WTK2.2提供的demo,完成了第一個(gè)3D程序,雖然很簡(jiǎn)單,而且有些問(wèn)題還不是很清楚,還是把代碼共享出來(lái)和愿意學(xué)習J2ME 3D編程的朋友一起學(xué)習。
  關(guān)于代碼的編譯和運行說(shuō)明如下:
  1、以下代碼在J2ME WTK2.2下面編譯通過(guò)。
  2、代碼分為兩個(gè)文件:First3DCanvas.java和First3DMIDlet.java。
  3、使用J2ME WTK2.2建立新的工程,主MIDlet類(lèi)為:first3d. First3DMIDlet
  4、將代碼保存在你的工程目錄下的first3d目錄下。
  5、將J2ME WTK安裝目錄下的apps\Demo3D\res\com\superscape\m3g\wtksamples\retainedmode\content目錄中的swerve.m3g文件復制到你的工程目錄下的res目錄下。
  6、你的工程建立后,設置工程,通過(guò)WTK界面中的“設置”按鈕打開(kāi)設置窗口,在“API選擇”中,設置“目標平臺”為:自定義;“簡(jiǎn)檔”為“MIDP2.0”;“配置”為“CLDC1.1”;選中“Mobile 3D Graphics for J2ME(JSR184)”。
  7、這樣你就可以編譯和運行以下代碼了。
  源代碼如下:

// First3DMIDlet.java
package first3d;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class First3DMIDlet extends MIDlet
{
      private First3DCanvas displayable = new First3DCanvas();
      public void startApp()
      {
            Display.getDisplay(this).setCurrent(displayable);
      }

      public void pauseApp() {}

      public void destroyApp(boolean unconditional) {}
}

// First3Dcanvas.java
package first3d;
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
import java.util.*;
/**
* 第一個(gè)3D程序
*/
public class First3DCanvas extends Canvas implements Runnable
{
      /**World對象*/
      private World myWorld = null;
      /**Graphics3D對象*/
      private Graphics3D g3d = Graphics3D.getInstance();
      /**Camera對象*/
      private Camera cam = null;
      private int viewport_x;
      private int viewport_y;
      private int viewport_width;
      private int viewport_height;
      private long worldStartTime = 0;
      //重繪時(shí)間
      private int validity = 0;
     
      public First3DCanvas()
      {
            //啟動(dòng)重繪界面的線(xiàn)程
            Thread thread = new Thread(this);
            thread.start();
            try
            {
                   //導入3D圖片
                   myWorld = (World) Loader.load("/swerve.m3g")[0];
                   viewport_x = 0;
                   viewport_y = 0;
                   viewport_width = getWidth();
                   viewport_height = getHeight();
                   cam = myWorld.getActiveCamera();
                   //設置cam對象
                   float[] params = new float[4];
                   int type = cam.getProjection(params);
                   if (type != Camera.GENERIC)
                   {
                          //calculate window aspect ratio
                          float waspect = viewport_width / viewport_height;
                          if (waspect < params[1])
                          {
                                float height = viewport_width / params[1];
                                viewport_height = (int) height;
                                viewport_y = (getHeight() - viewport_height) / 2;
                          }
                          else
                          {
                                float width = viewport_height * params[1];
                                viewport_width = (int) width;
                                viewport_x = (getWidth() - viewport_width) / 2;
                          }
                   }
                   worldStartTime = System.currentTimeMillis();
            }
            catch (Exception e) {}
      }
     
      protected void paint(Graphics g)
      {
            //清除背景
            g.setColor(0x00);
            g.fillRect(0, 0, getWidth(), getHeight());
            //和3D對象綁定
            g3d.bindTarget(g);
            g3d.setViewport(viewport_x, viewport_y, viewport_width, viewport_height);
            long startTime = System.currentTimeMillis() - worldStartTime;
            validity = myWorld.animate((int)startTime);
            try
            {
                   g3d.render(myWorld);
            }
            finally
            {
                   g3d.releaseTarget();
            }
      }

      public void run()
      {
            try
            {
                   while(true)
                   {
                         //重繪圖形
                         repaint(viewport_x, viewport_y, viewport_width, viewport_height);
                   }
            }
            catch(Exception e){}
      }
}

十七、在J2ME網(wǎng)絡(luò )編程中使用CMWAP代理
  在中國移動(dòng)提供的網(wǎng)絡(luò )連接中,分為CMNET和CMWAP兩種,其中CMNET可以無(wú)限制的訪(fǎng)問(wèn)互聯(lián)網(wǎng)絡(luò ),資費比較貴。CMWAP類(lèi)似一個(gè)HTTP的代碼,只能訪(fǎng)問(wèn)支持HTTP的應用,但是資費便宜,穩定性比較差。
  在實(shí)際的J2ME網(wǎng)絡(luò )編程中,一般需要提供以CMWAP代理的方式連接網(wǎng)絡(luò ),在J2ME中,連接的代碼和直接連接有所不同,代碼如下:
             HttpConnection http = (HttpConnection)Connector.open(("http://10.0.0.172/"+url);
             http.setRequestProperty("X-Online-Host",ServerName);
  例如你需要訪(fǎng)問(wèn)的地址為:http://www.test.com/login/loginServlet則上面的代碼就為:
             HttpConnection http = (HttpConnection)Connector.open(("             http.setRequestProperty("X-Online-Host","  在實(shí)際使用過(guò)程中,只需要使用實(shí)際需要訪(fǎng)問(wèn)的地址的域名或者IP來(lái)代替ServerName,例如示例中的“www.test.com”,使用后續的地址類(lèi)代替代碼中的url,例如示例中的“login/loginServlet”,就可以實(shí)際的使用CMWAP代理來(lái)進(jìn)行連接了。

十八、J2ME中的時(shí)間處理全攻略
  時(shí)間處理在程序開(kāi)發(fā)中相當常見(jiàn),下面對于時(shí)間處理做一個(gè)簡(jiǎn)單的說(shuō)明。
  一、時(shí)間的表達方式
  時(shí)間在J2ME中有兩種表達方式:
  1、以和GMT1970年1月1號午夜12點(diǎn)和現在相差的毫秒數來(lái)代表
  這種方式適合比較兩個(gè)時(shí)間之間的差值。
  2、以對象的形式來(lái)表達
  二、時(shí)間處理的相關(guān)類(lèi)
  時(shí)間處理在J2ME中涉及三個(gè)類(lèi):
  1、System類(lèi)
   long time = System. currentTimeMillis();
  使用該方法可以獲得當前時(shí)間,時(shí)間的表達方式為上面提到的第一種。
  2、Date類(lèi)
   Date date = new Date();
  獲得當前時(shí)間,使用對象的形式來(lái)進(jìn)行表達。
  3、Calendar類(lèi)
   Calendar calendar = Calendar. getInstance();

三、時(shí)間處理的具體操作
  1、以上三種表達方式的轉換:
  a)將System類(lèi)獲得的時(shí)間轉換為Date對象
   Date date = new Date(System. currentTimeMillis());
  b)將Date類(lèi)型的對象轉換為Calendar類(lèi)型的對象
   Calendar calendar = Calendar. getInstance();
   Date date = new Date();
   calendar.setTime(date);
  2、使用Calendar完成一些日期操作:
  Calendar是時(shí)間處理中最常用也是功能最強大的類(lèi),可以用它來(lái)獲得某個(gè)時(shí)間的日期、星期幾等信息。
  獲得日期:
   Calendar calendar = Calendar. getInstance();
   ……
   int day = calendar.get(Calendar. DATE);
  獲得日期、年份、星期的操作和這個(gè)類(lèi)似。
  需要注意的是:Calendar中表示月份的數字和實(shí)際相差1,即1月用數字0表示,2月用數字1表示,……12月用數字11表示。

十九、J2ME中隨機數字處理全攻略
  在程序中生成隨機數字,用處比較,如人工智能領(lǐng)域等等,這里對于在J2ME中生成隨機數的操作進(jìn)行一個(gè)簡(jiǎn)單的整理,希望對大家能有幫助。
  J2ME和J2SE不同,不能使用Math類(lèi)的random來(lái)生成隨機數字,只能使用java.util包的Random類(lèi)來(lái)生成隨機數字。
  1、創(chuàng )建Random類(lèi)型的對象:
         Random random = new Random();
   Random random = new Random(10010010);
  以上兩種是創(chuàng )建Random對象的方式,第一種使用默認構造方法,和以下的代碼作用完全等價(jià):
   Random random = new Random(System. currentTimeMillis());
  相當與使用當前時(shí)間作為種子數字來(lái)進(jìn)行創(chuàng )建。
  第二種方式通過(guò)自己來(lái)指定種子數字來(lái)進(jìn)行創(chuàng )建。
  大家可以根據需要使用以上兩種方式的任一種。
  2、生成隨機數字:
  創(chuàng )建好了隨機對象以后,我們就可以來(lái)生成隨機數字了:
  生成隨機整數:
         int k = random.nextInt();
       生成隨機長(cháng)整數:
         long l = random.nextLong();
  3、生成指定范圍的數字:
  例如生成0-10之間的隨機數字:
         int k = random.nextInt();
   int j = Math.abs(k % 10);
  首先生成一個(gè)隨機整數k,然后用k和10取余,最后使用Math類(lèi)的abs方法取絕對值,獲得0-10之間的隨機數字。
  獲得0-15之間的隨機數,類(lèi)似:
         int k = random.nextInt();
   int j = Math.abs(k % 15);
  獲得10-20之間的隨機數字:
         int k = random.nextInt();
   int j = Math.abs(k % 10) + 10;

二十、在J2ME手機編程中使用字體
  在J2ME手機編程中,可以通過(guò)使用字體類(lèi)——Font在低級用戶(hù)界面中,獲得更好的表現效果,那么如何使用Font類(lèi)呢?
  首先,由于手機設備的限制,手機中支持的字體類(lèi)型很有限,所以在J2ME中只能使用手機支持的默認字體來(lái)構造Font類(lèi)對象。下面是創(chuàng )建Font類(lèi)的對象時(shí)使用的方法:
          getFont(int face,int style,int size);
例如:
          Font font = Font.getFont(Font.FACE_SYSTEM,Font.STYLE_BOLD,Font. SIZE_MEDIUM);
  無(wú)論哪一個(gè)參數,都只能使用系統設置的數值,這些數值具體的大小在不同的手機上可能不同。下面對于其中的三個(gè)參數的取值做詳細的介紹:
  face參數指字體的外觀(guān),其的取值:
  FACE_MONOSPACE——等寬字體
  FACE_PROPORTIONAL——均衡字體
  FACE_SYSTEM——系統字體
  style參數指字體的樣式,其的取值:
  STYLE_BOLD——粗體
  STYLE_ITALIC——斜體
  STYLE_PLAIN——普通
  STYLE_UNDERLINED——下劃線(xiàn)
  STYLE_BOLD | STYLE_ITALIC——粗斜體
  STYLE_UNDERLINED | STYLE_BOLD——帶下劃線(xiàn)粗體
  STYLE_UNDERLINED | STYLE_ITALIC——帶下劃線(xiàn)斜體
  STYLE_UNDERLINED | STYLE_ITALIC | STYLE_BOLD——帶下劃線(xiàn)的粗斜體
  size參數指字體的大小,其的取值:
  SIZE_SMALL——小
  SIZE_MEDIUM——中
  SIZE_LARGE——大
  通過(guò)上面的參數的值,可以組合出你需要的字體對象。
  下面是一些常用的字體操作:
  1. 獲得系統的默認字體:
          Font font = Font.getDefaultFont();
  2. 在panit方法內部,假設Graphics參數的名稱(chēng)為g,則獲得當前字體的方法是:
          Font font = g.getFont();
  3. 在panit方法內部,假設Graphics參數的名稱(chēng)為g,則設置當前字體的方法是:
          g.setFont(font);
  其中font為你構造好的字體對象。
  4. 在MIDP2.0中,List可以設置每行的字體格式,方法是:
          list.setFont(0,font);
  則上面的代碼是將list中的第一行設置為font類(lèi)型的字體。

二十一、在J2ME手機程序開(kāi)發(fā)中使用顏色
  在J2ME手機開(kāi)發(fā)過(guò)程中,需要經(jīng)常用到顏色來(lái)進(jìn)行繪制,增強程序的表現效果,下面就介紹一下如何使用顏色。
  由于J2ME技術(shù)比較簡(jiǎn)單,所以沒(méi)有實(shí)現專(zhuān)門(mén)的顏色類(lèi),而只是使用RGB的概念來(lái)代表顏色。這里簡(jiǎn)單介紹一下RGB的概念,顏色是由紅(Red)、綠(Green)、藍(Blue)三原色組成的,所以可以使用這三個(gè)顏色的組合來(lái)代表一種具體的顏色,其中R、G、B的每個(gè)數值都位于0-255之間。在表達顏色的時(shí)候,即可以使用三個(gè)數字來(lái)表達,也可以使用一個(gè)格式如0X00RRGGBB這樣格式的十六進(jìn)制來(lái)表達,下面是常見(jiàn)顏色的表達形式:
  紅色:(255,0,0)或0x00FF0000
  綠色:(0,255,0)或0x0000FF00
  藍色:(255,255,255)或0x00FFFFFF
  其他顏色也可以通過(guò)上面的方式組合出來(lái)。
  知道了顏色的表達方式以后,下面來(lái)介紹一下如何在J2ME程序中使用顏色,涉及的方法均在Graphics類(lèi)中,有以下幾個(gè):
  1.getColor():
  獲得當前使用的顏色,返回值是0x00RRGGBB格式的數字。例如:
          int color = g.getColor();
  其中g(shù)為Graphics類(lèi)型的對象。
  2.setColor(int RGB):
  設置使用的顏色。例如:
          g.setColor(0x00ff0000);
  3.setColor(int red, int green, int blue)
  和上面的方法作用一樣,例如:
          g.setColor(255,0,0);
  在設置了Graphics使用的顏色以后,再進(jìn)行繪制的時(shí)候,就可以繪制指定的顏色了。

二十二、在J2ME聯(lián)網(wǎng)應用中獲得客戶(hù)端的手機號碼
  在J2ME程序開(kāi)發(fā)過(guò)程中,為了一定的需要,經(jīng)常需要來(lái)獲得用戶(hù)的手機號碼,但是這個(gè)功能卻在標準的J2ME類(lèi)庫中沒(méi)有提供。
  在使用中國移動(dòng)的CMWAP方式連接網(wǎng)絡(luò )時(shí),中國移動(dòng)會(huì )將用戶(hù)的手機號碼放在一個(gè)名稱(chēng)為x-up-calling-line-id的頭信息中,可以通過(guò)讀取該頭信息,獲得用戶(hù)的手機號碼,具體代碼如下:
          String usermphone = http.getHeader("x-up-calling-line-id");
  其中http是HttpConnction類(lèi)型的對象。

二十三、使用J2ME發(fā)送手機短信息
  在程序中,發(fā)送短信息的方式一般有三種:
  1、 使用程序在網(wǎng)絡(luò )上發(fā)送短信息,例如各大網(wǎng)站的短信業(yè)務(wù)。這種方式是通過(guò)程序將信息發(fā)送給運營(yíng)商的網(wǎng)關(guān)服務(wù)器,然后通過(guò)運營(yíng)商的網(wǎng)絡(luò )發(fā)送給手機。
  2、 在計算機中,通過(guò)數據線(xiàn)連接到手機,然后通過(guò)手機來(lái)發(fā)送短信息。這種方式是通過(guò)使用AT指令來(lái)實(shí)現。愛(ài)立信手機的AT指令你可以在以下地址找到:
http://mobilityworld.ericsson.com.cn/development/download_hit.asp
  3、 通過(guò)在手機中運行的程序來(lái)發(fā)送短信息。這個(gè)正是本文實(shí)現的方式。
  在J2ME中,如果想發(fā)送短信息,需要使用WMA包,MIDP2.0中已經(jīng)包含,MIDP1.0中可以通過(guò)廠(chǎng)商提供的擴展API實(shí)現,和WMA的類(lèi)庫基本一樣。
       下面是使用WMA向指定手機號碼發(fā)送短信息的一個(gè)方法,很簡(jiǎn)單。當然WMA也提供了其他的方式來(lái)發(fā)送更多的內容。

// SMSUtil.java
package my.util;
import javax.wireless.messaging.*;
import javax.microedition.io.*;
/**
* 發(fā)送文本短信息的方法
*/
public class SMSUtil
{
      /**
      * 給指定號碼發(fā)送短信息
      * @param content 短信息內容
      * @param phoneNumber 手機號碼
      * @return 發(fā)送成功返回true,否則返回false
      */
      public static boolean send(String content,String phoneNumber)
      {
            //返回值
            boolean result = true;
            try
            {
                   //地址
                   String address = "sms://+" + phoneNumber;
                   //建立連接
                   MessageConnection conn = (MessageConnection)Connector.open(address);
                   //設置短信息類(lèi)型為文本,短信息有文本和二進(jìn)制兩種類(lèi)型
                   TextMessage msg = (TextMessage)conn.newMessage(MessageConnection.TEXT_MESSAGE);
                   //設置信息內容
                   msg.setPayloadText(content);
                   //發(fā)送
                   conn.send(msg);
            }
            catch(Exception e)
            {
                   result = false;
                   //未處理
            }
            return result;
      }
}

二十四、使用簡(jiǎn)單的J2ME程序測試MIDlet的生命周期
  在MIDlet程序學(xué)習中,生命周期是一個(gè)比較抽象的概念。其實(shí)生命周期就是一個(gè)簡(jiǎn)單的規定,規定了MIDlet中的每個(gè)方法,什么時(shí)候被系統調用。下面是一個(gè)示例代碼,在每個(gè)方法的內部都輸出一條語(yǔ)句,可以根據程序的輸出結果來(lái)驗證各方法被調用的順序,具體代碼如下:


//文件名:LifeCircleMIDlet.java
import javax.microedition.midlet.*;
/**
* 測試MIDlet的生命周期
*/
public class LifeCircleMIDlet extends MIDlet
{
      /**
      * 默認構造方法
      */
      public LifeCircleMIDlet()
      {
            System.out.println("默認構造方法");
      }
      /**
      * 啟動(dòng)方法
      */
      public void startApp()
      {
            System.out.println("startApp方法");
      }
      /**
      * 暫停方法
      */
      public void pauseApp()
      {
            System.out.println("pauseApp方法");
      }
      /**
      * 銷(xiāo)毀方法
      * @param b
      */
      public void destroyApp(boolean b)
      {
            System.out.println("destroyApp方法");
      }
}
  在J2WTK中運行該程序時(shí),可以使用瀏覽器中的“MIDlet”菜單中的暫停和恢復菜單,模擬暫停事件。

二十五、使用OTA來(lái)發(fā)布你的程序
  眾所周知,J2ME程序發(fā)布的形式主要有:OTA、數據線(xiàn)傳輸、紅外和藍牙傳輸等。這里簡(jiǎn)單說(shuō)說(shuō)如何通過(guò)OTA來(lái)發(fā)布你的程序。
  OTA是Over The Air的簡(jiǎn)寫(xiě),也就是通過(guò)網(wǎng)絡(luò )下載,這是主要的發(fā)布形式之一?,F在的百寶箱都是采用這種形式。
  使用OTA來(lái)發(fā)布程序,需要如下幾個(gè)步驟:
  1、在你的WEB服務(wù)器上添加對于jad和jar文件的MIME支持。
  后綴名:jad
  MIME類(lèi)型:text/vnd.sun.j2me.app-descriptor
  后綴名:jar
  MIME類(lèi)型:application/java-archive
  2、發(fā)布WML頁(yè)面:
  例如你的jar文件名test.jad,則最簡(jiǎn)單的下載頁(yè)面是:
  <?xml version="1.0"?>
  <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.3//EN"
  "  <wml>
  <card id="card1" title="Download Midlet">
  <a href="test.jad">test</a>
  </card>
  </wml>
  你可以將以上代碼保存在WEB服務(wù)器上,例如保存為text.wml
  3、修改jad文件:
  在jad文件中增加 MIDlet-Jar-URL:
http://domain/directory/test.jar
  其中的http://domain/directory/test.jar為你的jar文件的路徑。
  經(jīng)過(guò)上面的設置,你就可以將你的wml頁(yè)面路徑作為你的WAP下載頁(yè)面發(fā)布了。用戶(hù)只需要在手機上輸入這個(gè)路徑就可以訪(fǎng)問(wèn)和下載你的程序了。
作者Blog:http://blog.csdn.net/Mailbomb/

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
j2me中的MIDlet類(lèi)說(shuō)明
Oracle生成隨機字符串的方法是通過(guò)dbms_random.string實(shí)現的
用Java實(shí)現按字節長(cháng)度截取字符串的方法
python最全的題目及答案7
第18章 JavaScript中的數組-參考題
33個(gè)非常實(shí)用的JavaScript一行代碼,建議收藏
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久