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

Написать его очень просто, но на разных телефонах он отображается по-разному. Например:
на Nokia Asha 200 алерты сопровождаются иконками и звуком,
на Samsung GT-C3520 все алерты выглядят одинаково и проигрывают один и тот же звук.
А так как чаще всего приложения идентичны по коду на разных устройствах, нельзя выбирать AlertType наугад, иначе одни пользователи увидят просто сообщение, а другие, например, ошибку.
Пишем алерт своими ручками
Сейчас создадим и покажем класс Alert с типом AlertType.ERROR. Начнём с того, что типов всего пять:
AlertType.ALARMAlertType.CONFIRMATIONAlertType.ERRORAlertType.INFOAlertType.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);
}
}
}
}