Как сделать слайд-шоу на J2Me?

Что такое MIDlet?
Поскольку Java 2 Micro Edition поддерживает большое количество устройств, то существуют различные конфигурации этой платформы. Не вдаваясь в подробности, мы будем использовать конфигурацию CDLC (Connected Limited Device Configuration), расширенную профайлом MIDP (Mobile Information Device Profile), который обеспечивает необходимую функциональность для программирования под мобильник.
MIDlet – это и есть приложение Java, которое использует профайл MIDP и конфигурацию CLDC.

Как создать MIDlet?
Если в прошлой статье мы рассматривали создание приложений с помощью Sun ONE Studio, то теперь мы будем использовать J2ME Wireless Toolkit (http://java.sun.com/products/j2mewtoolkit), чье преимущество в относительно небольшом размере дистрибутива, 13МБ могут выкачать даже пользователи с ограниченным доступом в интернет. Тем более, как мы уже писали, денег за это разработчики не просят.
Перед установкой J2ME Wireless Toolkit необходимо установить базовый пакет J2Se, который весит несколько десятков мегабайт — прим. ред.
После установки Wireless Toolkit, запускаем его основную утилиту KToolbar. Доступные после запуска опции это NewProject и OpenProject. Можно открыть демонстрационные проекты и на готовых примерах рассмотреть возможности и особенности языка, мы же создадим новый проект, который назовем SlideShow, также назовем и основной класс MIDlet’а (MIDlet Class Name) в окне создания нового проекта:

После этого появится окно для ввода информации, которая будет использоваться для создания файла манифеста и файла .jad, здесь можно ничего не исправлять и просто нажать ОК.

Посмотрим теперь в папку, где установлен Wireless Toolkit, в каталоге apps появилась папка нашего проекта SlideShow. В ней автоматически создалось еще несколько папок, рассмотрим назначение некоторых из них:

bin — Файлы приложения: файл .jar, файл .jad, MANIFEST.MF
res — Файлы ресурсов приложения, такие, как файлы изображений .png
src — Исходные файлы приложения

Wireless Toolkit не содержит текстового редактора, поэтому нам потребуется любой другой редактор, на худой конец, обычный блокнот. Делаем в текстовом редакторе файл SlideShow.java и сохраняем его в папку src, откуда при компиляции и берется весь исходный код.


Как устроен MIDlet?
Теперь перейдем собственно к коду программы. Все MIDlets должны дополнять класс javax.microedition.midlet.MIDlet, то есть иметь его как базовый. (Те, кто не знаком с объектно-ориентированными языками, на этом этапе могут почитать дополнительную литературу, потому что далее будет использоваться соответствующая терминология). Делается это таким образом:
import javax.microedition.midlet.MIDlet;

public class SlideShow extends MIDlet
{
...
};

Класс MIDlet является абстрактным, поэтому нужно переписать несколько его методов: startApp(), pauseApp() и destroyApp(), которые предписывают действия в зависимости от смены текущего состояния MIDlet’а (при его старте, приостановке или прекращении соответственно).

Метод startApp() всегда вызывается в качестве входной точки MIDlet’а. «А как же main()?», — спросят уже знающие Java программисты. Метода main() мы не видим, но он есть! Это часть реализации MIDP профайла, и программное обеспечение телефона вызывает его без нашего ведома. Так что весь код инициализации мы разместим в методе startApp(), а не в конструкторе класса.


Как показать картинку?
Теперь самое время приготовить картинки для слайд-шоу, которые мы будем показывать на экране. Можно взять уже готовые к демонстрации на телефоне файлы, а можно в графическом редакторе вырезать полюбившиеся фрагменты фотографий из вашего фотоальбома и сохранить их в формате png, следя, чтобы размеры картинок не превышали возможности вашего дисплея. Сохранить все картинки следует в папке ресурсов проекта res.
Для того, чтобы показать картинку на дисплее мобильника, нужно использовать несколько объектов. Собственно картинку содержит объект класса Image. Чтобы связать файл картинки с объектом, нужно воспользоваться методом createImage(String path), где path – путь и имя файла, относительно папки res.

Здесь может возникнуть аварийная ситуация, если, например, неверно указано имя файла или указанный файл это не картинка. Следует помнить, что обработка аварийных ситуаций обязательна в Java с использованием try-catch блоков, иначе приложение просто не откомпилируется.

Следующий, необходимый нам объект это форма. Форма — это экземпляр класса Form, который содержит все объекты, отображаемые на дисплее. Добавляются объекты в форму с помощью метода append(…), а удаляются методом delete(int itemNum). Учитывая все вышесказанное, напишем функцию создания картинки и добавления ее в форму:

import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.Form;
import java.io.IOException;

public void setImage(String path)
{
try {
image = Image.createImage(path);
}
catch (IOException ioe) {
System.out.println(ioe.getMessage());
}
form.append(image);
}


Последний и главный объект в этой иерархии — это экземпляр класса Display, который представляет физическое отображение экрана мобильника. Получить ссылку на объект Display можно с помощью метода getDisplay, а сделать форму текущим отображаемым объектом — используя метод setCurrent. Таким образом, наша функция startApp() будет выглядеть следующим образом:

import javax.microedition.lcdui.Display;

public void startApp() {
display = Display.getDisplay(this);
form = new Form("SlideShow");
setImage("/SlideShow.png");
display.setCurrent(form);
}

Осталось добавить в класс SlideShow члены класса display, form, image и программа, которая показывает картинку SlideShow.png на экране, готова.

Как показать другую картинку?
Но мы не будем останавливаться на достигнутом и пойдем еще дальше. Теперь мы рассмотрим, как задействовать клавиши телефона для смены изображения на экране. Для этого нам понадобится блок прослушивания команд. Для создания такого блока нужно реализовать абстрактный класс CommandListener и переписать его метод commandAction(…). Объект этого класса будет получать уведомления о наличии команд и выполнять соответствующие действия.
Собственно команды являются также объектами класса Command и добавляются в форму с помощью метода addCommand(…). Допишем создание команд и добавление их в форму к функции startApp():

import javax.microedition.lcdui.Command;
...
next = new Command("next", Command.SCREEN, 1);
back = new Command("back", Command.SCREEN, 1);
form.addCommand(next);
form.addCommand(back);

Теперь реализуем класс прослушивания и выполнения команд:

import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;

private class MyCommandListener implements CommandListener {
public void commandAction(Command c, Displayable d) {
if (c == next) {
...
}
if (c == back) {
...
}
}

Объект нового класса связывается с объектом формы с помощью метода setCommandListener(…), добавим создание объекта обработки команд в функцию startApp():

cl = new MyCommandListener();
form.setCommandListener(cl);


Как показать много картинок?
На этом вся подготовительная работа закончена, теперь у нас есть все необходимые объекты, и мы из них, как из кубиков, составим нашу программу. Назовем картинки, которые мы хотим демонстрировать так: 1.png, 2.png, …, заодно добавим два члена класса SlideShow: int slideNum и int maxSlideNum, которые будут содержать текущий номер картинки и общее количество картинок соответственно.
В метод обработки команд добавим логику для смены картинок на экране при нажатии клавиш. В конечном итоге наша программа целиком и полностью будет выглядеть следующим образом:

import ...

public class SlideShow extends MIDlet {
private Display display;
private Form form;
private Command next;
private Command back;
private Image image;
private MyCommandListener cl;
private int slideNum=1;
private int maxSlideNum=6;

public void destroyApp(boolean destroy) {
form = null;
notifyDestroyed();
}

public void pauseApp() {}

public void startApp() {

}
public void setImage(String path) {
...
}

private class MyCommandListener implements CommandListener {
public void commandAction(Command c, Displayable d) {
if (c == next && slideNum < maxSlideNum) slideNum++;
if (c == back && slideNum > 1) slideNum--;
form.delete(0);
setImage("/"+Integer.toString(slideNum)+".png");
}
}
};


Как запустить программу?
Вот собственно и все, осталось скомпилировать программу, используя опцию Build в KToolbar. При сообщении Build failed внимательно посмотрите, ничего ли Вы не упустили. После того, как программа успешно скомпилирована, можно запустить и посмотреть ее в действии в одном из эмуляторов, входящих в состав Wireless Toolkit, используя опцию Run.

Последний шаг программы от компьютера к телефону – упаковка проекта. В меню KToolbar выбираем опцию Project – Package, на этом этапе в папке bin создадутся файлы SlideShow.jar и SlideShow.jad, которые уже можно перенести в телефон и всегда иметь под рукой маленький фотоальбом.

На этом закончим наш урок. Подключите вашу фантазию к техническим возможностям мобильника и будет Вам счастье!

Евгений Буткевич (aka Voolkan)