- J2ME手機游戲設計與開發
- 劉暢 張旭輝編著
- 422字
- 2019-01-01 07:08:55
3.4 Screen類及其子類的應用
高級屏幕類Screen有4個子類TextBox、List、Alert和Form,都是已經封裝好的屏幕類。Screen又是Displayable類的子類,因此它的4個子類可以繼承Displayable類的所有方法。
3.4.1 Ticker滾動條
Ticker類為滾動條,所有高級屏幕類都可以通過調用setTicker()方法添加滾動條,用來顯示一些提示信息,常用方法如下:
public Ticker(String s) //根據指定的字符串生成一個新的Ticker對象 public String getString() //獲取當前在Ticker對象中滾動的字符串 public void setString(String str) //設置要在Ticker對象中滾動的字符串
是否支持滾動條與具體的設備有關,不是所有的設備都能夠顯示滾動條效果的。下面的程序是為Form對象添加滾動條,代碼參見【例3-4】。
【例3-4】 滾動條效果。
import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class mainMidlet extends MIDlet { Display display; Form f; Ticker t; public mainMidlet() { display=Display.getDisplay(this); f=new Form("滾動條效果"); t=new Ticker("這里是滾動條!!!"); f.setTicker(t); } protected void destroyApp(boolean arg0) throws MIDletStateChange Exception { } protected void pauseApp() { } protected void startApp() throws MIDletStateChangeException { display.setCurrent(f); } }
執行效果如圖3-6所示。
同一個滾動條可以被多個Screen對象共用,可以通過在各個Screen對象中分別調用setTicker()方法來實現。當應用程序在多個屏幕之間切換時,滾動條在顯示屏幕上的位置不變,并且它的內容會在原來的位置上繼續滾動。若要取消滾動條則在setTicker()方法中設置參數為null。

圖3-6 滾動條效果圖
3.4.2 TextBox文本框類
TextBox類繼承了Screen類,用于用戶輸入或者編輯文本內容。TextBox類的常用方法如表3-7所示。
表3-7 TextBox類的常用方法
創建并使用TextBox對象:
TextBox tb; tb=new TextBox("文本框","初始化內容",20,TextField.ANY);
其中“文本框”為其標題,“初始化內容”為文本框最開始時的內容,可以設置為null或者空字符串,20為tb中內容輸入的最大字符數,必須為大于0的整數,最后一個參數為輸入約束,TextField.ANY表示可以輸入任意字符,其他約束類型如表3-8所示。
注意:每個英文字符的長度為1,漢字的長度為2,如果存在初始化內容,則最大字符數一定要大于初始化內容,否則拋出異常,如【例3-4】中長度如果為4則拋出異常。
通過Display對象將TextBox對象顯示在屏幕上,效果如圖3-7所示。

圖3-7 TextBox實例效果
表3-8 輸入約束類型
可以調用TextBox對象的相關方法改變TextBox的屬性設置。
(1)設置文本內容。
char[] data=new String("hello world!").toCharArray(); tb.setChars(data,1,11);
(2)獲取文本內容。
char[] data=new char[tb.size()]; tb.getChars(data);
(3)插入文本內容。
tb.insert("text1",0); tb.insert("text2",tb.getMaxSize()); tb.insert("text3",tb.getCaretPosition()); //將指定內容插入到光標處
下面利用文本框來實現一個簡單的登錄界面,具體內容參見【例3-5】。
【例3-5】 用戶名和密碼的輸入與驗證。
在編寫程序之前應該首先對程序進行分析,繪制相應的流程圖,這里由于手機屏幕每次只能顯示一個TextBox對象,所以用戶名和密碼的驗證要分成兩次來完成,然后通過Display對象的setCurrent()方法來切換。同時為了響應驗證操作,需要在程序中添加Command對象,在CommandAction()方法中編寫具體的邏輯。程序功能流程圖如圖3-8所示。

圖3-8 程序功能流程圖
import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class mainMidlet extends MIDlet implements CommandListener { Display display; TextBox tbName,tbPwd; Command cmdEnter; public mainMidlet() { display=Display.getDisplay(this); tbName=new TextBox("請輸入用戶名","",12,TextField.ANY); tbPwd=new TextBox("請輸入密碼","",6,TextField.NUMERIC); cmdEnter=new Command("確定",Command.OK,1); tbName.addCommand(cmdEnter); tbName.setCommandListener(this); tbPwd.addCommand(cmdEnter); tbPwd.setCommandListener(this); } protected void destroyApp(boolean arg0) throws MIDletStateChange Exception { } protected void pauseApp() { } protected void startApp() throws MIDletStateChangeException { display.setCurrent(tbName); } public void commandAction(Command c, Displayable d) { if(c==cmdEnter && d==tbName) { if(tbName.getString().equals("abc")) display.setCurrent(tbPwd); else tbName.setString("輸入錯誤"); } if(c==cmdEnter && d==tbPwd) { if(tbPwd.getString().equals("123")) { tbName.setTitle("輸入結果"); tbName.setString("全部正確"); display.setCurrent(tbName); } else { tbName.setString("密碼錯誤"); display.setCurrent(tbName); } } } }
執行效果圖如圖3-9所示。

圖3-9 用戶名和密碼的輸入與驗證效果圖
在這里因為還沒有介紹有關數據存儲的內容,所以用戶名和密碼就在程序中指定了,如果學習了數據存儲,就可以從數據庫中讀取相應的用戶名和密碼。
3.4.3 List列表類
List類是一個包含選項的高級屏幕類,實現對多項列表項進行選擇功能。List類是Screen類的子類,同時也實現了Choice接口。List類的常用方法如表3-9所示。
表3-9 List類的常用方法
創建并使用List對象:
List list; list=new List("列表選項",List.IMPLICIT);
第1個參數是List對象的標題字符串,第2個參數是代表列表的選項類型,List共提供3種對象類型。
(1)EXCLUSIVE:單選模式。要求只能在列表中選擇一個選項,當選擇第2個選項時之前選中的將被取消,而且選擇選項不會觸發任何事件。
(2)MULTIPLE:復選模式。用戶可以在列表中選擇一個或多個選項,同樣也不會觸發任何事件。
(3)IMPLICIT:隱含模式。對于這種模式下的列表同樣也是單選的,但是如果設置CommandLister,選擇操作會立即通知到應用程序,觸發相應事件,相當于封裝了按鈕操作。
列表建立后只有一個標題,需要通過調用append()方法添加列表項,例如:
list.append("First",null); list.append("Second",null); list.append("Third",null);
最后通過Display對象顯示List對象:
Display.getDisplay(this).setCurrent(list);
執行效果如圖3-10所示。

圖3-10 列表的不同選項類型效果圖
下面利用List對象來實現菜單選擇的功能,具體實現參見【例3-6】。
【例3-6】 游戲菜單的實現。
利用List對象來實現菜單選項,當選擇不同的菜單項時響應不同的操作或提示信息。執行效果如圖3-11所示。

圖3-11 游戲菜單效果圖
import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class ListMidlet extends MIDlet implements CommandListener { Display display; List list; Command commandOk; Command commandCancel; public ListMidlet() { display=Display.getDisplay(this); list=new List("游戲菜單",List.EXCLUSIVE); list.append("開始游戲",null); list.append("游戲說明",null); list.append("高分榜",null); list.append("退出",null); commandCancel=new Command("取消",Command.CANCEL,1); commandOk=new Command("確定",Command.CANCEL,2); list.addCommand(commandCancel); list.addCommand(commandOk); list.setCommandListener(this); } protected void destroyApp(boolean arg0) { } protected void pauseApp() { } protected void startApp() throws MIDletStateChangeException { display.setCurrent(list); } public void commandAction(Command cmd, Displayable arg1) { if(cmd==commandOk){ //當按下“確定”軟鍵時,根據列表的選項序號判斷執行不同的操作 switch(list.getSelectedIndex()) { case 0: System.out.println("開始游戲");break; case 1: System.out.println("游戲說明");break; case 2: System.out.println("退出");break; case 3: System.out.println("高分榜");break; } }else if(cmd==commandCancel) { destroyApp(false); notifyDestroyed(); } } }
3.4.4 Alert信息提示類
Alert類主要用于實現提醒功能,在設備上顯示一個警告屏幕,例如字符串,也可以包含預定義的聲音和圖像。提示信息可以一直保持在屏幕上,由用戶取消,也可以設定時間自動切換屏幕內容。Alert類的常用方法如表3-10所示。
表3-10 Alert類的常用方法
創建并使用Alert對象:
Alert alert1,alert2; alert1=new Alert("警告框"); alert2=new Alert("警告框","警告信息!!",null,AlertType.WARNING);
Alert類有兩個構造函數,第一個構造函數只需要指定Alert的標題,第二個構造函數需要指定標題、顯示內容、圖像和警告類型。 其中AlertType提供了以下幾種類型。
·ALARM(警報):向用戶警告一個時間,它是用戶預先請求的通知。
·CONFIRMATION(確定):用來確認一個用戶動作。
·ERROR(錯誤):向用戶警告一個錯誤操作。
·INFO(通知):一般向用戶提示非危險性信息。
·WARNING(警告):向用戶警告一個危險操作。
利用Display對象將其顯示在屏幕上:
Display.setCurrent(alert1);
效果如圖3-12(a)所示。
Alert對象顯示一段時間后就會切換為另一個屏幕,所以在設置顯示屏幕時需要同時設置切換后的屏幕對象:
display.setCurrent(alert,nextDisplayable);
如果要改變Alert對象的顯示時間,可以調用setTimeout()方法。
alert.setTimeout(3000); //3000為毫秒,1000毫秒=1秒 alert.setTimeout(Alert.FOREVER); // Alert.FOREVER表示Alert對象不會自動切換,需要用戶手動切換,效果如圖3-12(b)所示

圖3-12 Alert效果
下面運用Alert類來實現錯誤提醒功能,具體實現參見【例3-7】。
【例3-7】 在運行界面中輸入一個字符串,如果是6位就顯示正確信息,否則顯示錯誤信息。
import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class AlertMidlet extends MIDlet implements CommandListener{ private TextBox textBox; private Command okCommand = new Command("OK", Command.OK, 1); private Command exitCommand = new Command("EXIT", Command.EXIT, 1); private Display display; public AlertMidlet() { //Create an exclusive list textBox=new TextBox("Type in a 6-character word","",20,TextField.ANY); textBox.addCommand(okCommand); textBox.addCommand(exitCommand); textBox.setCommandListener(this); //Retrieve display object display=Display.getDisplay(this); } public void startApp() throws MIDletStateChangeException { display.setCurrent(textBox); } /** * Pause the MIDlet */ public void pauseApp() { } /** * Called by the framework before the application is unloaded */ public void destroyApp(boolean unconditional) { textBox=null; okCommand = null; exitCommand = null; display=null; } public void commandAction(Command c, Displayable d) { if(d==textBox && c==okCommand) { String t=textBox.getString(); if(t.length()==6) { Alert info= new Alert("Success", "Good word. Try again.", null, AlertType.INFO); info.setTimeout(Alert.FOREVER); display.setCurrent(info,textBox); } else { Image err_img= null; //Create error image try { err_img=Image.createImage("/error.png"); }catch(Exception e){ System.out.println("image is not created."); } Alert error= new Alert("Error", "Sorry not right. Try again.", err_img, AlertType.ERROR); error.setTimeout(Alert.FOREVER); display.setCurrent(error,textBox); } } else if(c==exitCommand) { destroyApp(true); notifyDestroyed(); } } }
執行效果如圖3-13所示。

圖3-13 Alert信息提醒效果圖
- 大學計算機信息技術導論
- Oracle SOA Governance 11g Implementation
- 三菱FX3U/5U PLC從入門到精通
- 輕松學Java Web開發
- 3D Printing with RepRap Cookbook
- 計算機網絡應用基礎
- 工業機器人入門實用教程(KUKA機器人)
- 80x86/Pentium微型計算機原理及應用
- Mastering Machine Learning Algorithms
- 大學計算機應用基礎
- Photoshop CS3圖像處理融會貫通
- AutoCAD 2012中文版繪圖設計高手速成
- Mastering ServiceNow Scripting
- 貫通Java Web輕量級應用開發
- 納米集成電路制造工藝(第2版)