Как писать алерты в J2ME и не запутаться
В приложениях и играх для java-телефонов часто требуется показать пользователю сообщение: уведомить о завершении операции, об ошибке, о конце игры или просто вывести подсказку. Для этого используется класс Alert
.

Написать его очень просто, но на разных телефонах он отображается по-разному. Например:
на Nokia Asha 200 алерты сопровождаются иконками и звуком,
на Samsung GT-C3520 все алерты выглядят одинаково и проигрывают один и тот же звук.
А так как чаще всего приложения идентичны по коду на разных устройствах, нельзя выбирать AlertType
наугад, иначе одни пользователи увидят просто сообщение, а другие, например, ошибку.
Пишем алерт своими ручками
Сейчас создадим и покажем класс Alert
с типом AlertType.ERROR
. Начнём с того, что типов всего пять:
AlertType.ALARM
AlertType.CONFIRMATION
AlertType.ERROR
AlertType.INFO
AlertType.WARNING
Alarm
используется для уведомлений — например, будильник, новое сообщение и так далее.
Confirmation
, несмотря на название, не служит для подтверждения действий. Этот тип просто сообщает пользователю, что операция прошла успешно.
Error
— тут всё ясно из названия. Используется для ошибок и уведомлений о том, что действие запрещено или недоступно.
Info
применяется для информирования пользователя или даже для вопросов к нему. Конечно, для таких целей можно взять и другой тип, но именно этот чаще всего подходит лучше всего.
Warning
завершает нашу цепочку. Как и предполагает название, он просто предупреждает пользователя.
Начнём создавать алерт. Все действия выполняются в NetBeans 7.3.1, а тестируется на девайсе Nokia Asha 200.
Создадим проект Java ME > Мобильные приложения
. Можете назвать его как угодно, например AlertDemo. Выбираем CLDC-1.1 и MIDP-2.0. Когда вы нажмете кнопку Готово
, у вас появится окно с шаблонным кодом. Первым делом, нужно импортировать библиотеку javax.microedition.lcdui
и все подклассы, для работы с экраном и графикой. Делаем это через import
.
package alertdemo;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*; // импортируем библиотеку и все подклассы.
public class Midlet extends MIDlet implements CommandListener {
public void startApp() {
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
Также, нужно после extends MIDlet
вставить implements CommandListener
, иначе событие выбора элемента листа не будет срабатывать, следовательно наш алерт не будет выводиться.
Объявим очень важные переменные: display
и menu
. Без переменной display
не будет работать взаимодействие с экраном, а без переменной menu
не появится список.
package alertdemo;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class Midlet extends MIDlet implements CommandListener {
private Display display;
private List menu;
public void startApp() {
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
А теперь приступим к заполнению метода startApp()
. В этом методе будет храниться информация о содержании меню, и о том, что показывать на дисплее.
Получим и запишем дисплей в переменную display
. Для этого вставим строчку display = Display.getDisplay(this);
в начале метода startApp()
.
Затем создадим новый лист и запишем его в переменную menu
. Для этого нужно создать новый экземпляр объекта List
передав в конструктор заголовок окна и режим выбора. В нашем случае, заголовок "Магазин", но можно как захотите, а режим List.IMPLICIT
, или же выбор элемента по нажатию кнопки ОК/Select. menu = new List("Магазин", List.IMPLICIT);
.
Создадим элемент листа. Воспользуемся методом menu.append()
, передав в значениях текст элемента, и иконку, которая будет стоять слева от текста. Но в нашем случае, иконка не нужна. menu.append("Купить дошик", null);
Затем настроим слушатель команд. Обратимся к методу menu.setCommandListener()
для установки слушателя, и передадим параметр this
. menu.setCommandListener(this);
.
Также, установим что показывать на дисплее. Обращаемся к методу display.setCurrent()
передав значение menu
, как список который нужно показывать. display.setCurrent(menu);
.
package alertdemo;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class Midlet extends MIDlet implements CommandListener {
private Display display;
private List menu;
public void startApp() {
display = Display.getDisplay(this);
menu = new List("Магазин", List.IMPLICIT);
menu.append("Купить дошик", null);
menu.setCommandListener(this);
display.setCurrent(menu);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
Наконец-то мы дошли до самой ожидаемой части. Создание алерта!
Нам нужно создать метод public void commandAction(Command c, Displayable d)
, и поместить в него ветвление условий if (c == List.SELECT_COMMAND && d == menu)
. Затем, внутри ветвления, объявить переменную index, которая будет равняться номеру выбранного в меню пункта. int index = menu.getSelectedIndex();
.
И прямо сейчас начинается самое интересное!
Пишем if (index == 0)
, и приступаем к написанию алерта.
Alert alert = new Alert("Ошибка", "Не хватает средств", null, AlertType.ERROR);
Заголовок.
Тело, или же содержание алерта
Кастомная иконка
Тип алерта
То есть, объявляем переменную с типом Alert
, которая содержит новый экземпляр объекта Alert
, и в конструкторе указываем параметры. Вы думаете всё? Нет!
Необходимо указать таймаут и обновить дисплей. Делаем это двумя строчками: alert.setTimeout(3000);
и display.setCurrent(alert, menu);
. И обратите внимание: в таймауте значение указывается в миллисекундах. Если вы хотите, чтобы таймаута не было, и алерт висел пока пользователь сам не закроет его, нужно вместо миллисекунд написать Alert.FOREVER
.
Запускаем на Nokia Asha 200... Опа!

Упс! Я опять забыл настроить мидлет. Но это делается очень просто. ПКМ по проекту > Свойства > Дескриптор приложения > Мидлет. Нажимаем Добавить...
, и затем жмякаем ОК. Да, вот так вот элементарно просто.
А теперь, попробуем повторить нашу попытку. Запускаем... Отлично

package alertdemo;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class Midlet extends MIDlet implements CommandListener {
private Display display;
private List menu;
public void startApp() {
display = Display.getDisplay(this);
menu = new List("Магазин", List.IMPLICIT);
menu.append("Купить дошик", null);
menu.setCommandListener(this);
display.setCurrent(menu);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
public void commandAction(Command c, Displayable d) {
if (c == List.SELECT_COMMAND && d == menu) {
int index = menu.getSelectedIndex();
if (index == 0) {
Alert alert = new Alert(
"Ошибка",
"Не хватает средств",
null,
AlertType.ERROR
);
alert.setTimeout(3000);
display.setCurrent(alert, menu);
}
}
}
}