Листинг 9.З. Класс HelloForm определяет объект формы и использует ту же самую схему, что и основной класс МID-лета
1 import javax.raicroedition.midlet.MIDlet;
2
3 import javax.microedition.Icdui.Alert;
4 import javax.microedition.Icdui.AlertType;
5 import javax.microedition.Icdui.Command;
6 import javax.microedition.Icdui.CommandListener;
7 import javax.microedition.Icdui.Display;
8 import javax.microedition.Icdui.Displayable;
9 import javax.microedition.Icdui.Form;
10
11 /*
12 Данный класс определяет Form, которая отображает
13 простой текст и меню команд. Цель данного класса
14 заключается в демонстрации i18n и 110n
15 видимых пользователю атрибутов. Класс извлекает
16 локализованные ресурсы из программного обеспечения
17 управления приложениями.
18 */
19 открытый HelloForm дополняет Form
20 {
21 // Заголовок данной Form, устанавливаемый по умолчанию.
22 private static final String DEFAULT_TITLE =
23 "Hello, World";
24
25 // Блок прослушивания команд, который обрабатывает
26 // командные события в данной Form.
27 private MyCommandListener cl = new
28 MyCommandListener ();
29
30 //. Экземпляр дисплея, связанный с
31 // данным MID-летом.
32 Display display;
33
34 // Ссылка на связанный с данным объектом
35 // объект MID-лета.
36 I18NDemo midlet;
37
38 // Уведомление, отображаемое в ответ на
39 // активацию некоторых команд данной Form.
40 Alert alert;
41
42 // Команды, размещаемые в данной форме.
43 private Command showAlert;
44 private Command sayHi;
45 private Command cancel;
46 private Command exit;
47 private Command help;
48 private Command item;
49 private Command ok;
50 private Command screen;
51 private Command stop;
52
53 /**
54 Конструктор No-arg. Устанавливает заголовок по умолчанию
55 для данной формы.
56 */
57 HelloForm()
58 {
59 this(DEFAULT_TITLE);
60 }
61
62 /**
63 Конструктор.
64
65 @param title — заголовок Form.
66 */
67 HelloForm(String title)
68 {
69 super(title);
70
71 midlet = IISNDemo.get Instance()
72
73 // Добавляет строковый элемент в форму.
74 String msg = midlet.getResource("greeting");
75 append(msg);
76
77 display = Display.getDisplay(midlet);
78
79 // Добавляет MyCommandListener в Form для прослушивания
80 // события нажатия клавиши «Back», которое должно
81 // создавать всплывающее диалоговое уведомление Alert.
82 setCommandListener(cl);
83
84 showAlert = new
85 Command(midlet.getRe source("alert"),
86 Command.SCREEN, 1);
87 addCommand(showAlert);
88
89 sayHi = new.
9 °Command(midiet.getResource("sayhi"),
91 Command.SCREEN, 1);
92 addCommand(sayHi);
93
94 cancel = new
95 Command{midlet.getResource("cancel"),
96 Command. SCREEN, 1);
97 addCommand(cancel);
98
99 exit = new
10 °Command(midlet.getResource("exit"),
101 Command.SCREEN, 1);
102 addCommand(exit);
103
104 help = new
105 Command(midlet.getResource("help"),
106 Command.SCREEN, 1);
107 addCommand(help);
108
109 item = new
11 °Command(midiet.getResource("item"),
111 Command.SCREEN, 1);
112 addCommand(item);
113
114 ok = new
115 Command(midlet.getResource("ok"),
116 Command.SCREEN, 1);
117 addCommand(ok);
118
119 screen = new
12 °Command(midlet.getResource("screen"),
121 Command.SCREEN, 1);
122 addCommand(screen);
123
124 stop = new
125 Command(midlet.getResource("stop"),
126 Command.SCREEN, 1);
127 addCommand(stop);
128 }
129
130 // Данный класс просто прослушивает активацию
131 // какой-либо команды. Экземпляр HelloForm
132 // устанавливает экземпляр данного класса как
133 // свой блок прослушивания команд. Экземпляр
134 // объекта не проверяет информацию команды, а
135 // просто отображает модальное Ale показывающее,
136 // что экранная клавиша была активирована пользователем.
137 private class MyCoramandListener
138 implements CommandLister.er
139 {
140 public void commandAction(Command c,
141 Displayable d)
142 {
143 String title =
144 midlet.getResource("alert_title");
145 String msg = null;
146
147 if (c == showAlert)
148 {
149 msg = midlet.getResource("alert_text");
150 alert = new Alert(title,
151 msg,
152 null, AlertType.INFO);
153 alert.setTimeout(Alert.FOREVER);
154 display.setCurrer.t (alert, HelloForm.this);
155 }
156 else if (c == sayHi)
157 {
158 alert = new Alert("Button pressed",
159 msg,
160 r.ull, AlertType.INFO);
161 alert.setTimeout(Alert.FOREVER);
162 display.setCurrent(alert, HelloForm.this);
163 }
164
165 if (c == exit)
166 {
167 IISNDemo.get Instance(). destroyApp (true);
168 }
169 }
170 }
171 }
Проблема разработки интернационализации заключается в схеме поиска, используемой для нахождения локализованных строк в файле JAD. Программно определяемый метод getResource (String key), заданный в строках с 103 по 115, на самом деле определяет и реализует схему поиска. Чтобы обнаружить ресурс, метод getResource (String key) создает имя атрибута, а затем ищет сам атрибут.
Например, следующие два оператора, показанные в строках 84 и 85, выбирают строку заголовка Form, использующейся в приложении.
String formTitle = getResource("title");
form = new HelloForm(formTitle);
Метод создает полное имя атрибута, объединяя три строки: 118NDemo — префикс атрибута для данного приложения, идентификатор атрибута ресурса без какой-либо меняющейся в зависимости от региональной настройки информации и обозначение региональной настройки. Параметр строки title является идентификатором атрибута ресурса, а не заголовком формы.
В строке 36 MID-лет определяет префикс атрибута I18NDemo-. Метод startApp() извлекает информацию о контексте региональной настройки, в котором исполняется приложение, из системного свойства microedition.locale и сохраняет его как экземпляр атрибута.
Объект HelloForm использует значение, выданное вызовом getResource(), как его заголовок. Класс HelloForm в листинге 9.3 повторяет этот сценарий. Он просто вызывает getResource() для поиска локализованных значений всех текстов, которые пользователь видит во время исполнения приложения.
Поскольку реализации MIDP будут, скорее всего, поддерживать только одну региональную настройку, возможно, будет лучше для приложений сделать центральной ссылку региональной настройки, которую, как вы знаете, поддерживает ваше устройство, вместо того чтобы извлекать региональную информацию из свойств системы.
Альтернативный подход заключается в создании нескольких версий файла JAD приложения так, чтобы каждая версия содержала атрибуты для каждой региональной настройки. Добавьте соответствующую версию JAD для требуемого контекста региональной настройки. Конечно, вам понадобится определить контекст локальной настройки, в которой будет использоваться телефон, или просто местные настройки пользователя.
В листинге 9.2 используется системное свойство microedition.locale для извлечения региональной настройки для того, чтобы акцентировать внимание на понятии динамически определяемого контекста региональной настройки и ресурсов, связанных с контекстами региональных настроек. Разграничение ресурсов для различных региональных настроек может помочь пониманию вашей разработки и сделать ваше программное обеспечение более восстанавливаемым. Не забывайте, что в будущем, когда устройства станут более мощными, реализации MIDP смогут очень хорошо поддерживать множество региональных настроек. Когда это произойдет, подход, показанный в листинге 9.2, станет более предпочтительным.