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).

Рейтинг@Mail.ru

вверх гостевая; E-mail