有效利用UI部件(1)
![]() | 今天我们将通过应用程序来介绍有效利用MIDP2.0的UI部件的方法。 |
![]() | 什么是UI部件啊? |
![]() | UI就是User Interface(用户界面)的意思。在MIDP2.0中,比如让用户输入字符串或数字的text field,或者从多项选择中选出一项的选择组等,都能够使用到多个UI部件。 |
![]() | 之前都是以制图方法为中心,这次可是个有点普通的题目呀。 |
![]() | 的确很普通,但是对收集用户信息、并做怎样的处理却有着重要作用。 |
![](http://www.nec-mfriend.com/cn/lecture/images/c3_1.jpg)
1. UI部件的种类
![]() | MIDP2.0的UI部件包含在javax.microedition.lcdui包中,包括以下类。 |
![](http://www.nec-mfriend.com/cn/lecture/images/m12_1.jpg)
![]() | 真不少啊。 |
![]() | MIDP2.0的UI部件是由Item类以及Screen类的某部分派生而来的。由Item类派生而来的UI部件能在同一画面中重复显示,而从Screen派生来的在整个画面中只能显示一个。为此,在上表中特意将各类的所属父类也列举出来。 |
2. Alert
![]() | 首先,我们来学习最简单的部分----Alert类的使用方法。使用Alert是为了当处理一旦中断时,可以通过整个画面来显示信息。 |
![]() | 从名字来看,是发出警告时使用的吧? |
![]() | 是这样的。为了在发生错误等情况下,能够暂时停止操作并显示信息。具体内容可以记录为下列所示编码。 |
// 制定Alert Object |
![]() | 如上所示,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 | } | ||
![]() | 那你就来试着运行一下上面的编码吧。 |
![]() | 好的。 |
![](http://www.nec-mfriend.com/cn/lecture/images/m12_2.jpg)
3. 有效利用TextField
![]() | 下面我们来讲使用户输入字符串或者数字的TextField。 |
![]() | 之前的spirograph和计算器的应用程序,在用户输入数值时也使用了TextField吧。 |
![]() | 嗯,记得很牢固嘛。上一次只是使用而没做说明,这次我们来详细了解一下TextField的使用方法。 TextField是由下列各部分构成的。 |
TextField(String label, String text, int maxSize, int constraints) |
![]() | Label表示text field的标签, text表示初始值,maxSize表示可输入的文字数,还有constraints是用来指定限制可输入字符串的常数的。在这里可以指定下列常数。 |
![](http://www.nec-mfriend.com/cn/lecture/images/m12_3.jpg)
![]() | 除此之外,如果指定为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在画面中显示出来。 |
![](http://www.nec-mfriend.com/cn/lecture/images/m12_4.jpg)
![]() | 最基础的是指定为TextField.ANY,这样任何文字都可以输入;但是为了防止输入错误的信息,对输入文字做一定的限制还是很重要的。 |
4. 练习题
![]() | 那么,为了复习一下这次所学的内容,我来出一道练习题。 |
![]() | 啊?练习题? |
![]() | 是啊。题目就是下面这个。 |
为了完成下面的“猜数游戏”,请在GuessTheNumber.java中第76行~81行的注解处填入适当的程序编码。 |
猜数游戏的玩法
![](http://www.nec-mfriend.com/cn/lecture/images/m12_5.jpg)
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 | } | ||