Nickolay.info. Программы. Java2ME. С чего начать? |
Чтобы начать программировать на JavaME, нам понадобится не так уж мало софта. Все три нужные софтины я выложил в одном месте, чтоб Вам не пришлось искать их по всему инету.
Сначала ставим Java2 Runtime Environment (скачать файл j2rei586.exe, 9 мб). Она представляет собой базовый набор библиотек для замены дебильной мелкософтовской явы нормальной sun'овской. Качаем, запускаем на все вопросы отвечаем положительно. Теперь у нас есть нормальная среда для запуска мидлетов и апплетов.
Теперь нужен Java2SDK, файл j2sdk-1_4_2_05-windows-i586-p.exe по ссылке. Это большой пакет порядка 50 Мб, но без него не обойтись - он пригодится не только при компиляции Java2ME из любой среды, но и для изготовления тем, скинов и прочей ерунды для Вашего телефона. Многие средства работы с Java требуют предустановленного Java2 SDK. В пути, указанном к SDK, не должно быть пробелов, лучше вообще его не менять.
Третий шаг - собственно компилятор. даже если Вы позднее будете пользоваться более продвинутыми средствами, как то JBuilder 8 или 9, IntelliJ Idea или Sun Forte, все равно рекомендую поставить "базовый" компилятор Wireless Toolkit или просто WTK от Sun: рекомендуемая версия 2.2 + update + обфускатор, 20 Мб, подробности - в readme.txt внутри архива (скачать архив wtk22.zip по ссылке). Для многих целей хватит вместо версии 2.2 версии WTK 2.0 (скачать по ссылке файл j2me_wireless_toolkit-2_0_01-windows.exe, 10 Мб).
В WTK нет встроенного редактора, только компилятор, зато делать проекты там проще простого - ведь писать текст можно и в Блокноте! Запускаем из вложенной папки bin файл ktoolbar.bat, после загрузки нажимаем New Project, в поле Project Name вводим имя проекта, оно же будет именем папки, которую WTK создаст внутри своей вложенной папки apps. Думаю, понятно, что все имена должны быть латинскими и без пробелов. В поле MIDlet class name задаем имя главного класса по тем же правилам, нажимаем Create project. Появляется окно настроек Settings. Как минимум, имеет смысл заполнить поля MIDlet-Vendor (впишите там себя вместо Sun :-), и на вкладке midlets выбрать единственную имеющуюся там запись, нажать внизу Edit и определиться, будете ли Вы рисовать иконку приложения (если нет - сотрите поле Icon). Нажимаем OK, внутри папки apps в папке с именем мидлета создано все необходимое. Файлы *.java выкладываем в src, иконку, картинки и прочие ресурсы, если они есть, в res, а готовый мидлет будем забирать из bin. Для изготовления мидлета достаточно нажать Project->Build, а затем Project->Package->Create Package. Пункт Run позволяет выполнить мидлет в "цветном телефоне по умолчанию" (DefaultColorPhone) или другом эмуляторе.
Вот пример простейшего "Hello, world!" с одной формой, зато грамотно проверяется блокирование повторного запуска и т.п.:
/* Файл midlet.java, главный класс приложения назван midlet, файл помещен в apps/ИмяПроекта/src */ import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import javax.microedition.io.*; import java.io.*; public final class midlet extends MIDlet implements CommandListener { /* ВНИМАНИЕ! Команды назначены сразу! */ static final Command exitCmd = new Command( "Stop", Command.EXIT, 2 ); static final Command startCmd = new Command( "Start", Command.SCREEN, 1 ); /* Текстовая форма для адреса. */ private final TextField name = new TextField( "Say \"Hello\" for whom?", "", 255, TextField.ANY ); /* Текстовая форма для результата -- в ответе будет текущие дата/время опрашиваемого хоста. 255 символов должно хватить. :) */ private final TextField rc = new TextField( "Result:", "", 255, TextField.UNEDITABLE ); /* Проверка -- а запущен ли уже мидлет? */ private boolean isStarted = false; /* Запуск мидлета отсюда. */ protected void startApp () { if( isStarted ) { return; /* Блокируем повторный запуск мидлета. */ } /* Собственно, "тело мидлета". */ /* Основная форма мидлета. С ней потом и работаем. */ Form frm = new Form( "Mobile \"Hello, World\"" ); /* Набиваем элементы формы. */ /* Здесь мы вставляем редактируемое пользователем поле. */ frm.append( name ); /* А вот это поле пользователем отредактировано быть не может. Но его может отредактировать само приложение. */ frm.append( rc ); /* Заставляем форму "слушаться" обработчиков. */ frm.addCommand( exitCmd ); frm.addCommand( startCmd ); frm.setCommandListener( this ); /* Всё. Форма готова -- на экран её, плюс, блокировка повторного запуска. */ Display.getDisplay( this ).setCurrent( frm ); isStarted = true; } /* То, что произойдёт при нормальном останове мидлета. */ protected void destroyApp (boolean b) { this.notifyDestroyed(); /* Уведомляем JVM (KVM). */ } /* На случай "паузы" в мидлете. Если нужна приостановка работы мидлета, то лучшего места просто не найти. */ protected void pauseApp () { /* На "паузе" можно сохранить состояние экрана. И, по окончании "паузы", продолжить дальше, восстановив состояние экрана. Применяется, как правило, в играх. */ } /* Обработка команд мидлета. */ public void commandAction ( Command c, Displayable d ) { String name_str = name.getString( ); if( c == exitCmd ) { destroyApp( false ); } else if( c == startCmd ) { /* Вот тут-то и всё самое страшное и произойдёт... :) Если честно, то здесь было бы не хило выставить проверку на введённые значения, Exception и в Alert'е вывести, если чего не так, но... мне лень городить огород в демке. */ rc.setString( "Hello, " + name_str ); } } }
А в этом приложении уже 2 класса и первый из них вызывает второй - кажется, мы тут квадратное уравнение решаем :-)
/* Файл midlet.java, главный класс приложения назван midlet, файл помещен в apps/ИмяПроекта/src */ import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class midlet extends MIDlet implements CommandListener { public Command exitCommand,calcCommand,backCommand; private Display display; private Form f,f2; private TextField ka,kb,kc; StringItem res; float a,b,c,x1,x2; public midlet () { display = Display.getDisplay (this); exitCommand = new Command("Exit", Command.EXIT, 1); calcCommand = new Command("Calc", Command.OK, 1); backCommand = new Command("Back", Command.BACK, 1); } public void startApp() { f = new Form ("Equation"); f.addCommand(exitCommand); f.addCommand(calcCommand); ka=new TextField ("Input A","",3,TextField.NUMERIC); kb=new TextField ("Input B","",3,TextField.NUMERIC); kc=new TextField ("Input C","",3,TextField.NUMERIC); f.append (ka); f.append (kb); f.append (kc); f.setCommandListener(this); display.setCurrent(f); f2 = new Form ("Results"); f2.addCommand(backCommand); res = new StringItem ("x1 and x2",""); f2.append (res); f2.setCommandListener(this); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } public void commandAction (Command cc, Displayable dd) { if (cc == exitCommand) { destroyApp(false); notifyDestroyed(); } else if (cc == calcCommand) { try { a=Float.parseFloat (ka.getString().trim()); } catch (NumberFormatException e) { new Message (this, f, "Error").show ("Bad A!"); return; } try { new Message (this, f, "Error").show ("Bad B!"); b=Float.parseFloat (kb.getString().trim()); } catch (NumberFormatException e) { return; } try { c=Float.parseFloat (kc.getString().trim()); } catch (NumberFormatException e) { new Message (this, f, "Error").show ("Bad C!"); return; } float d=b*b-4*a*c; if (d>0) { x1=(float)(-b+Math.sqrt(d))/(2*a); x2=(float)(-b-Math.sqrt(d))/(2*a); res.setLabel ("\n"+x1+"\n"+x2); } else { res.setLabel ("\nNo real roots"); } display.setCurrent(f2); } else if (cc == backCommand) { display.setCurrent(f); } } } /* Файл Message.java из той же папки */ import javax.microedition.lcdui.*; public class Message extends Form implements CommandListener { StringItem label; midlet midlet; Displayable parent; public Message (midlet midlet, Displayable parent, String hdr) { super (hdr); this.midlet = midlet; this.parent = parent; label = new StringItem ("", ""); append (label); addCommand (midlet.backCommand); } public void show (String s) { label.setText (s); Display.getDisplay(midlet).setCurrent (this); setCommandListener (this); } public void commandAction (Command c, Displayable d) { Display.getDisplay(midlet).setCurrent(parent); } }
Возможно, Вы захотите сделать еще 4-й шаг - писать под любимого производителя, тогда, скорей всего, понадобится скачать его Toolkit и эмулятор к нему. Я на вопросы "где" отвечать не буду, для Симензов, например, все есть на www.siemens-club.org
Ссылки на нужные материалы и книги ищите в моем FAQ, удачи в разработке, PerS (2006).
гостевая; E-mail |