官术网_书友最值得收藏!

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信息提醒效果圖

主站蜘蛛池模板: 博罗县| 治多县| 泰宁县| 铜鼓县| 高雄市| 福泉市| 谷城县| 雷山县| 抚顺市| 柞水县| 津南区| 翁源县| 罗平县| 托克逊县| 杭州市| 阳新县| 囊谦县| 察哈| 鄂托克前旗| 施秉县| 同德县| 孟连| 玉屏| 永和县| 偏关县| 文化| 仁布县| 文化| 沙雅县| 潜山县| 福安市| 玉树县| 新干县| 张家川| 奉新县| 工布江达县| 龙里县| 桐柏县| 正定县| 枝江市| 安塞县|