Контакты

Для связи с нами можно использовать:
irc://irc.chatnet.ru:#gfs
icq://546460
email://cobalt[@]gfs-team.ru

Все материалы предоставлены только с ознакомительной целью
ГлавнаяСтатьиКодингПишем программы под телефоны на Java. Часть II
© Guru 13.04.2007

Немного отступлюсь от темы и скажу одну вещь. Я понимаю, что забил на свою первую статью по Java, тем самым прикрыл шансы на познание истины дальнейших загадок этого чуда (: Заранее извиняюсь и продолжаю маяться, в смысле заниматься статейками.

В прошлой статье мы остановились на создании обычного приложения под телефон (который естественно поддерживает Java приложения). Приложение выводило в никуда, точнее в некую консоль всеми любимые слова "Hello world". Этого, насколько я понимаю мало. Мы хотим выводить эти слова на дисплей телефона (в нашем случае эмулятора, хотя кому как (: … ). Не буду напрягать Вас шуточками, буковками и прочим хламом, сразу приступлю к делу, однако с уместными комментариями. Что делаем? Во-первых, для тех кто не смог продвинуться в этой сфере деятельности сам: открываем статью, которую я написал очень давно; читаем, вспоминаем, материмся или радуемся. Во-вторых создаем новый проект. Кстати о проектах и средствах разработки. Есть нечто более удобное, чем J2ME WTK, но об этом в конце статьи.

Создали проект, написали некий шаблон.

package hi;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class main extends MIDlet {
    public void startApp() {
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }
}

Что нового в нашем шаблоне? Оператор package объявляет некое пространство с именем "hi". Отмечу, что название пространства должно совпадать с названием директории, в котором это пространство объявляется. Другими словами файл main.java , который относится к пространству "hi" должен находиться в папке "hi". Для чего нужно, это пространство? Объясняю. Для того что бы было легче структуризировать свой проект. Например: у какой-нибудь игры возможно создать несколько пространств, одно для работы с сторонними данными (звук, нажатие клавиш, сохранение) и ещё одно для основной задачи (запуск, прорисовка, обработка выражений). Однако не обязательно заводить пространства для небольших проектов, как наш. Просто, я бы хотел постепенно вводить некоторые важные элементы в обучение. Да и, чуть не забыл. Пространства "пакеты" используются как подключаемые библиотеки (модули) (import hi.some.package.*)

Шаблон есть, действий нет! Сейчас исправим (: Добавляем две переменных в наш класс


public class main extends MIDlet {

    private Form FORM = new Form("MainForm");
    private final Display DISPLAY = Display.getDisplay(this);

Ну, первая переменная думаю для вас понятна. Мы создаем экземпляр формы, которая будет отображена на дисплее, при этом сразу задаем ей титул "MainForm". Вторая переменная немного посложнее по степени понимания (для начинающих). Слово (модификатор) final обозначает, что данную переменную больше нельзя изменить, то есть это константа. Display.getDisplay(this) - здесь мы видим вызов статического (static) метода getDisplay. У этого метода есть один параметр - MIDlet. Как видите, мы передали this (указатель на наш мидлет) и тем самым, в нашу переменную DISPLAY передался указатель на текущий дисплей. Не стоит задаваться в суть выше написанных пояснений про дисплей, просто запомните одну вещь - для работы с дисплеем нам нужно получить к нему доступ, посредством метода getDisplay.

Доступ к дисплею получили, форму создали. Что дальше, как вывести эту форму?

public void startApp() {
        DISPLAY.setCurrent(FORM);
    }

Из текста видно, что все до ужаса страшно легко. Метод setCurrent устанавливает текущий объект для отображения. Однако не все объекты могут быть отображены. Для отображения, объект сперва должен быть унаследован от объекта Displayable (в нашем случае это Form).

Откомпилировав наше приложение, героически открывшийся эмулятор приглашает нас запустить приложение. Запускаем и видим что на верху дисплея отображается имя нашей формы. Естественно радуемся или материмся и продолжаем. Отображение формы для нас мало, даешь обычный текст и всякие кнопочки!

Хорошо, если с обычным текстом будет попроще, то с всякими кнопочками напряг - вспоминаем что у нас телефон, а не ПК. Тут нет мышки и соответственно нам не чем клацать на кнопочки. Однако для чего джойстик? Джойстик для того, что бы переключаться между псевдо кнопочками (: Ладно, поймете это немного позже.

Что нужно, что бы добавить текст на форму?


    public void startApp() {
        StringItem si = new StringItem("Some label","Some text");
        FORM.append(si);
        DISPLAY.setCurrent(FORM);
    }

Как видите, появился новый объект StringItem (javax.microedition.lcdui.StringItem , кстати в lcdui можно найти ещё несколько интересных объектов). Метод формы append добавляет в форму указанный нами объект. Единственный недостаток - невозможно задать координаты отображения.

Хочу, чтобы на форме отображалась картинка!

Слушаюсь, мой повелитель (: Но тут есть один момент. Прежде чем приступить к выводу изображений на дисплей следует узнать об ошибках ввода/вывода, да и вообще об ошибках выполнения программы. Так как рисунок у нас является файлом, то соответственно он будет считываться программой из этого же файла. Путь к файлу задается программистом, но программист тоже человек и может ошибиться. Что происходит тогда? Программа честно выполняется, работает, но при попытке загрузить картинку - вылетает. Почему? Наверно программист указал не верный путь к файлу и забыл обработать критически опасный участок программы (чтение картинки) блоками try … catch . Но, не тут, то было! Любимый Вами WTK увидел этот критический участок при попытке компиляции и жутко высказал свою точку зрения по этому поводу, прекратив всякие действия по этому проекту.

Что теперь делать? Отвечаю - использовать блоки try … catch. Что представляют из себя эти блоки? Опять же, все очень просто. Заключаем критически опасный к ошибкам участок кода в этот блок (пример ниже) и живем дальше.

public void startApp() {
        StringItem si = new StringItem("Some label","Some text");
        try{
            Image img = Image.createImage("/res/path/to/image.gif");
            FORM.append(img);
        }catch (java.io.IOException ioe){
            ioe.printStackTrace();
        }
        FORM.append(si);
        DISPLAY.setCurrent(FORM);
    }

Данный пример в итоге делает все тоже, что и делал до этого наш мидлет, но и в добавок ещё отображает наш рисунок. Кстати не забывайте что файлы ресурсов (рисунки, прочие файлы) должны храниться в папке "res".

Вернемся к нашим блокам. С "try" все понятно - это слово поясняет что в следующих скобках будет выполняться код, который может вызвать ошибки. Завершаются скобки словом "catch", которое поясняет - если мы словили ошибку типа "java.io.IOException", то выполняем следующие действия, которые идут в следующих скобках. В нашем случае мы ловим "java.io.IOException" и обозначаем эту ошибку переменной "ioe", если мы словили это исключение (ошибку) то с помощью этой же переменной "ioe" выводим сообщение об ошибке (у всех объектов ошибок есть свои методы вывода про себя). Если все прошло гладко - мы увидим картинку и наш текст, в противном случае в консоли мы увидим нечто подобное:

java.io.IOException
        at javax.microedition.lcdui.ImmutableImage.getImageFromStream(Image.java:968)
        at javax.microedition.lcdui.ImmutableImage.<init>(Image.java:939)
        at javax.microedition.lcdui.Image.createImage(Image.java:313)

Что дословно обозначает - внимательней надо быть, внимательней!

Как и обещал в первых абзацах этой статьи - хочу рассказать что есть среда разработки более удобнее, однако менее компактней чем WTK. Да и к тому же среда предназначена не только для написания приложений под телефоны, даже возможность писать под телефоны, и пользоваться эмулятором телефоны появляется только при установки отдельного модуля. Эта среда (IDE) называется NetBeans. Сайт среды - www.netbeans.org .Думаю, вы разберетесь как с ним работать. Если не разберетесь - задавайте вопросы на форуме, я обязательно отвечу (если не потеряюсь, что возможно или меня не убьют). Модуль для телефонов (Mobility Pack for CLDC/MIDP) находится на том же сайте.

Пока на этом все. Думаю вы извлекли все необходимое для Вас, В свою очередь, я постарался и ожидаю что все-таки к этой статье просьбы писать дальше будут официальными - на форуме, (: а не на канале Тимы.




© Guru 13.04.2007

e-Commerce Partners Network
Who? написал:

Интересно

Ник:

Текст:
P Br B I Qute



Код: обновить
Последние комментарии
28.07.2017 12:06:17 DavidThymn написал:
VasTutNet точка ru удалим негативные отзывы о Вас,разместим положительные,Спецалист...
Сайт снова работает!
28.07.2017 12:06:16 DavidThymn написал:
VasTutNet точка ru удалим негативные отзывы о Вас,разместим положительные,Спецалист...
Новая статья
26.07.2017 15:18:53 Flossiefal написал:
Принципиально новое обновление "XRumer 16.0 + XEvil": решение бесплатно и быстро...
Релиз
Реклама
http://mix4mobile.in.ua
сварка алюминия электродом
Rambler's Top100