有效利用UI部件(1)-----转

有效利用UI部件(1)

 

 今天我们将通过应用程序来介绍有效利用MIDP2.0的UI部件的方法。
 什么是UI部件啊?
 UI就是User Interface(用户界面)的意思。在MIDP2.0中,比如让用户输入字符串或数字的text field,或者从多项选择中选出一项的选择组等,都能够使用到多个UI部件。
 之前都是以制图方法为中心,这次可是个有点普通的题目呀。
 的确很普通,但是对收集用户信息、并做怎样的处理却有着重要作用。


1. UI部件的种类

 MIDP2.0的UI部件包含在javax.microedition.lcdui包中,包括以下类。


 真不少啊。
MIDP2.0的UI部件是由Item类以及Screen类的某部分派生而来的。由Item类派生而来的UI部件能在同一画面中重复显示,而从Screen派生来的在整个画面中只能显示一个。为此,在上表中特意将各类的所属父类也列举出来。

 

2. Alert


 首先,我们来学习最简单的部分----Alert类的使用方法。使用Alert是为了当处理一旦中断时,可以通过整个画面来显示信息。
 从名字来看,是发出警告时使用的吧?
 是这样的。为了在发生错误等情况下,能够暂时停止操作并显示信息。具体内容可以记录为下列所示编码。

   // 制定Alert Object
   Alert alert = new Alert("Title");
      
   // 指定类型
   alert.setType(AlertType.ALARM);
   
   // 指定显示时间
   alert.setTimeout(Alert.FOREVER);
   
   // 指定信息
   alert.setString("Message");
   
   // 显示
   display.setCurrent(alert);


 如上所示,Alert Object是运用setType 方法来设定类型的,在这里我们是从下列5种中选择了1种。
            AlertType.ALARM
            AlertType.CONFIRMATION
            AlertType.ERROR
            AlertType.INFO
            AlertType.WARNING
但是N840不管指定哪一个都会执行同一个操作,所以没必要特别考虑这一点。但是别的平台就会因选择不同的数值,而使显示时的声音不同。
接下来,是能够以毫秒为单位指定显示时间的setTimeout方法。但是在用户按按键之前的持续显示时间要通过指定Alert.FOREVER来完成。
下面的编码是举例说明显示时间不同的Alert。

AlertTestjava

    
1
 import javax.microedition.midlet.MIDlet; 
2
 import javax.microedition.lcdui.*; 
3
   
4
 public class AlertTest extends MIDlet implements CommandListener { 
5
     
6
    // 制定指令 
7    private Command exitCommand = new Command("Exit", Command.EXIT, 1); 
8    private Command alarmCommand1 = new Command("Alarm", Command.SCREEN, 
9 1); 
10    private Command alarmCommand2 = new Command("Alarm 1sec",  
11 Command.SCREEN, 1); 
12    private Command alarmCommand3 = new Command("Alarm 5sec",  
13 Command.SCREEN, 1); 
14        
15    private boolean firstTime; 
16    private Form mainForm; 
17    private Display display; 
18     
19    public AlertTest() { 
20       firstTime = true; 
21       mainForm = new Form("AlertTest"); 
22    } 
23   
24    protected void startApp() { 
25       if (firstTime) { 
26          // 追加在画面中显示的字符串 
27          mainForm.append(new StringItem("Select the Alert Type", null)); 
28        
29          // 追加指令 
30          mainForm.addCommand(exitCommand); 
31          mainForm.addCommand(alarmCommand1); 
32          mainForm.addCommand(alarmCommand2); 
33          mainForm.addCommand(alarmCommand3); 
34        
35          // 注册CommandListener 
36          mainForm.setCommandListener(this); 
37          firstTime = false; 
38       } 
39       display = Display.getDisplay(this); 
40       display.setCurrent(mainForm); 
41    } 
42   
43    public void commandAction(Command c, Displayable s) { 
44       if (c == exitCommand) { 
45          // 选择“Exit”时的处理 
46          // 应用程序结束 
47          destroyApp(false); 
48          notifyDestroyed(); 
49       } else if(c == alarmCommand1) { 
50          // 选择“Alarm”时的处理 
51   
52          // 制定Alert Object 
53          Alert alert = new Alert("Alarm"); 
54     
55          // 指定类型 
56          alert.setType(AlertType.ALARM); 
57   
58          // 指定显示时间 
59          alert.setTimeout(Alert.FOREVER); 
60           
61          // 指定信息 
62          alert.setString("Timeout = Alert.FOREVER"); 
63           
64          // 显示 
65          display.setCurrent(alert); 
66       } else if (c == alarmCommand2) { 
67          // 选择“Alarm 1sec”时的处理 
68     
69          // 制定Alert Object 
70          Alert alert = new Alert("Alarm 1sec"); 
71     
72          // 指定类型 
73          alert.setType(AlertType.ALARM); 
74     
75          // 指定显示时间 
76          alert.setTimeout(1000); 
77     
78          // 指定信息 
79          alert.setString("Timeout = 1000ms"); 
80     
81          // 显示 
82          display.setCurrent(alert); 
83       } else if (c == alarmCommand3) { 
84          // 选择“Alarm 5sec”时的处理 
85        
86           // 制定Alert Object 
87          Alert alert = new Alert("Alarm 5sec"); 
88                          
89          // 指定类型 
90          alert.setType(AlertType.ALARM); 
91        
92          // 指定显示时间 
93           alert.setTimeout(5000); 
94        
95          // 指定信息 
96          alert.setString("Timeout = 5000ms"); 
97        
98          // 显示 
99          display.setCurrent(alert); 
100       }  
101    } 
102     
103    protected void destroyApp(boolean unconditional) { 
104    } 
105     
106    protected void pauseApp() { 
107    } 
108 } 
    

 

 那你就来试着运行一下上面的编码吧。
 好的。

 

3. 有效利用TextField

 下面我们来讲使用户输入字符串或者数字的TextField。
 之前的spirograph和计算器的应用程序,在用户输入数值时也使用了TextField吧。
 嗯,记得很牢固嘛。上一次只是使用而没做说明,这次我们来详细了解一下TextField的使用方法。
TextField是由下列各部分构成的。

   TextField(String label, String text, int maxSize, int constraints)


Label表示text field的标签, text表示初始值,maxSize表示可输入的文字数,还有constraints是用来指定限制可输入字符串的常数的。在这里可以指定下列常数。


除此之外,如果指定为TextField.PASSWORD,输入的文字就不会显示,取而代之以***表示。
下列编码便使用了指定完这些类型的text field。

TextFieldTest.java

    
1
 import javax.microedition.midlet.MIDlet; 
2
 import javax.microedition.lcdui.*; 
3
   
4
 public class TextFieldTest extends MIDlet implements CommandListener { 
5
     
6
    // 制定指令 
7    private Command exitCommand = new Command("Exit", Command.EXIT, 1); 
8    private Command okCommand = new Command("OK", Command.SCREEN, 1); 
9   
10    // 制定常数为TextField.ANY的TextField 
11    private TextField textField0  
12       = new TextField("Any", "", 25, TextField.ANY); 
13   
14    // 制定常数为TextField.EMAILADDR的TextField 
15    private TextField textField1  
16       = new TextField("EmailAddr", "", 25, TextField.EMAILADDR); 
17     
18    // 制定常数为TextField.NUMERIC的TextField 
19    private TextField textField2  
20       = new TextField("Numeric", "", 25, TextField.NUMERIC); 
21        
22    // 制定常数为TextField.PASSWORD的TextField 
23    private TextField textField3  
24       = new TextField("Password", "", 25, TextField.PASSWORD); 
25        
26    // 制定常数为TextField.PHONENUMBER的TextField 
27    private TextField textField4  
28       = new TextField("PhoneNumber", "", 25, TextField.PHONENUMBER); 
29           
30    // 制定常数为TextField.URL的TextField 
31    private TextField textField5  
32       = new TextField("URL", "", 25, TextField.URL); 
33           
34    private boolean firstTime;  
35    private Form mainForm; 
36    private Display display; 
37           
38    public TextFieldTest() { 
39       firstTime = true; 
40       mainForm = new Form("TextFieldTest"); 
41    } 
42   
43    protected void startApp() { 
44       if (firstTime) { 
45          // 追加6个TextField 
46          mainForm.append(textField0); 
47          mainForm.append(textField1); 
48          mainForm.append(textField2); 
49          mainForm.append(textField3); 
50          mainForm.append(textField4); 
51          mainForm.append(textField5); 
52           
53          // 追加指令 
54          mainForm.addCommand(exitCommand); 
55          mainForm.addCommand(okCommand); 
56           
57          // 注册CommandListener 
58          mainForm.setCommandListener(this); 
59          firstTime = false; 
60       }     
61       display = Display.getDisplay(this); 
62       display.setCurrent(mainForm); 
63    } 
64           
65    public void commandAction(Command c, Displayable s) { 
66       if (c == exitCommand) { 
67          // 选择“Exit”时的处理 
68          // 应用程序结束 
69          destroyApp(false); 
70          notifyDestroyed(); 
71       } else if(c == okCommand) { 
72          // 选择“OK”时的处理 
73          // 出现内容为输入的字符串的Alert  
74          Alert alert = new Alert("Confirmation"); 
75          alert.setType(AlertType.INFO); 
76          alert.setTimeout(Alert.FOREVER); 
77          alert.setString("Values are :/n" + 
78             "[" + textField0.getString() + "]/n" + 
79             "[" + textField1.getString() + "]/n" + 
80             "[" + textField2.getString() + "]/n" + 
81             "[" + textField3.getString() + "]/n" + 
82             "[" + textField4.getString() + "]/n" + 
83             "[" + textField5.getString() + "]/n" + 
84          ); 
85          display.setCurrent(alert); 
86        } 
87     } 
88                          
89    protected void destroyApp(boolean unconditional) { 
90    } 
91        
92    protected void pauseApp() { 
    

在选择了菜单中的OK后,上述编码中的输入内容将通过Alert在画面中显示出来。


最基础的是指定为TextField.ANY,这样任何文字都可以输入;但是为了防止输入错误的信息,对输入文字做一定的限制还是很重要的。

4. 练习题


那么,为了复习一下这次所学的内容,我来出一道练习题。
啊?练习题?
是啊。题目就是下面这个。

为了完成下面的“猜数游戏”,请在GuessTheNumber.java中第76行~81行的注解处填入适当的程序编码。


   猜数游戏的玩法


 


 

GuessTheNumber.java

    
1
 import javax.microedition.lcdui.*; 
2
 import javax.microedition.lcdui.*; 
3
 import javax.microedition.midlet.*; 
4
 import java.util.*;  
5
     
6
 public class GuessTheNumber extends MIDlet implements CommandListener { 
7     
8    // 制定指令 
9    private Command exitCommand = new Command("Exit", Command.EXIT, 1); 
10    private Command guessCommand = new Command("Guess", Command.SCREEN, 1); 
11   
12    // 制定用来输入猜测数字的TextField 
13    private TextField textField  
14       = new TextField("Pick a number between 1 and 100", "",  
15                               3, TextField.NUMERIC); 
16     
17    private int answer; // 存储答案的变量 
18    private int count; // 猜测的次数 
19    private Random random = new Random(); // 目标随机数 
20        
21    private boolean firstTime;  
22    private Form mainForm; 
23    private Display display; 
24     
25    public GuessTheNumber(){ 
26       firstTime = true; 
27       mainForm = new Form("GuessTheNumber"); 
28    }    
29          
30    protected void startApp() { 
31       if (firstTime) { 
32          // 追加指令 
33          mainForm.addCommand(exitCommand); 
34          mainForm.addCommand(guessCommand); 
35           
36          // 追加TextField 
37          mainForm.append(textField); 
38        
39          // 注册CommandListener 
40          mainForm.setCommandListener(this); 
41          firstTime = false; 
42       } 
43       reset(); 
44       display = Display.getDisplay(this); 
45       display.setCurrent(mainForm); 
46    } 
47           
48    // 游戏初始化 
49    private void reset() { 
50       // 清除TextField 的内容 
51       textField.setString("");  
52           
53       // 在answer中设定随机数字 
54         answer = Math.abs(random.nextInt()) % 100 + 1; 
55           
56       // 将count归零 
57       count = 0; 
58    } 
59           
60    public void commandAction(Command c, Displayable s) { 
61       if (c == exitCommand) { 
62          // 选择“Exit”时的处理 
63          // 应用程序结束 
64          destroyApp(false); 
65          notifyDestroyed(); 
66       } else if(c == guessCommand) { 
67          // 选择“Guess”时的处理 
68     
69          // 将count增加1 
70          count++; 
71     
72          // 从输入的字符串里提取整数数字  
73          int value = Integer.parseInt(textField.getString()); 
74          String message = ""; 
75           
76          /* 
77          运用Alert显示信息 
78          纠正答案时,根据猜测的数字过大或者过小, 
79          显示信息也作相应的改变 
80          答案正确时,运行reset方法, 
81          返回初始状态。.  
82          */ 
83       } 
84    } 
85        
86    protected void destroyApp(boolean unconditional) { 
87    } 
88                          
89    protected void pauseApp() { 
90    } 
91 }       
    

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值