LWUIT: Hello, World!

Для начала нам потребуется скачать и установить LWUIT. Для этого скачайте архив и распакуйте его на жёсткий диск.

Теперь создадим новый проект в NetBeans. Выберете меню File -> New Project. В списке категорий (Categories) выберете Mobile, затем проект (Projects) MobileApplication и нажмите Next.

Введите имя проекта (Project Name), например LWUIThelloWorld. Теперь снимите галку с Create Hello MIDlet, так как мы собираемся создавать мидлет с нуля. Нажмите Next. Следующие 2 окна в данном случае не представляют интереса. Пропустите их, нажав Next, затем Finish. Итак, проект создан.

Сейчас нужно подключить к проекту библиотеку LWUIT. Для этого в окне Projects нажимаем правой кнопкой на нашем проекте, и выбираем Properties. В появившемся окне выбираем категорию Libraries & Resources, и нажимаем Add Jar/Zip. Укажите файл LWUIT.jar и нажмите OK. Библиотека подключена.

Теперь мы переходим к написанию HelloWorld. Добавьте новый мидлет, нажав правой кнопкой на проекте и выбрав New -> Midlet. В появившемся окне введите имя мидлета, например LWUIThelloWorld. Нажмите Finish.

Файл нового мидлета должен иметь такой вид:


public class LWUIThelloWorld extends javax.microedition.midlet.MIDlet

{
 public void startApp() {
}

 public void pauseApp() {
}

 public void destroyApp(boolean unconditional) {
}

}

 

Обратите внимание, что в из проекта убраны подключения файлов пакетов (import), а имя класса MIDlet прописано полностью (javax.microedition.midlet.MIDlet). Это связано с тем, что пространство имён LWUIT в значительной степени перекрывает пространство имён MIDP, но одноимённые классы имеют другие конструкторы, методы и, отчасти, несколько иное назначение.

Наша программа должна будет выводить на экран окно с надписью "Hello, World!", имеющее всего одну кнопку Exit. После нажатия на эту кнопку должно появляться диалоговое окно подтверждения выхода, и, в случае положительного ответа, программа должна завершать работу.

Создадим сначала главное окно программы. Для этого в функцию startApp() впишите следующий код:


Display.init(this);

Form f = new Form("Hello world!");
f.setLayout(new BoxLayout(BoxLayout.Y_AXIS));
f.show();

В начале файла добавьте импорт необходимых пакетов:


import com.sun.lwuit.Display;

import com.sun.lwuit.Form;
import com.sun.lwuit.layouts.BoxLayout;

Нажатием F6 запустим мидлет на выполнение. На экране появится окно, состоящие из одного заголовка "Hello world!". Чуть позже мы раскрасим окно, и добавим кнопку Exit.

Разберём только что написанный код.


Display.init(this);

Инициализация дисплея. Этот метод должен быть вызван до показа какой-либо формы.


Form f = new Form("Hello world!");

Создаём новый экземпляр f класса Form. Конструктор в качестве параметра получает строку - заголовок формы.


f.setLayout(new BoxLayout(BoxLayout.Y_AXIS));

Указываем способ размещения компонентов на форме. В данном случае это BoxLayout - компоненты будут следовать друг за другом, как бы "уложенные в коробку". Константа BoxLayout.Y_AXIS означает, что компоненты будут "уложены" вертикально, вдоль оси Y.


f.show();

Показываем форму на экране.

Главное окно готово, однако на нём нет компонентов. Добавим новый компонент - надпись. Для этого до f.show(); введите следующий код:


Label label1 = new Label("Лейбл");
f.addComponent(label1);

А в импорт добавьте строку


import com.sun.lwuit.Label;

Рассмотрим код более подробно.


Label label1 = new Label("Лейбл");

Создание нового экземпляра label1 класса Label. Конструктор в качестве параметра получает строку - заголовок надписи.


f.addComponent(label1);

Добавляем компонент на форму.

Следующие, что мы сделаем - добавим кнопку Exit. Добавьте приватный член класса:


private Command cmdExit = new Command("Exit");

В процедуру startApp(); добавьте


f.addCommand(cmdExit);

Подключите следующий пакет:


import com.sun.lwuit.Command;

Теперь у нас есть кнопка Exit, но она ничего не делает. Обработка событий в LWUIT сходна с обработкой событий в MIDP. Сделаем так, что бы по нажатию кнопки Exit появлялось диалоговое окно, и, если пользователь выберет OK, приложение завершало свою работу.

Добавим слушателя событий:


public class LWUIThelloWorld extends javax.microedition.midlet.MIDlet implements ActionListener

и


public void actionPerformed(ActionEvent evt)

{
 Command cmd = evt.getCommand();
 if(cmd == cmdExit)
 {

   Command okCommand = new Command("OK", true);
   Command cancelCommand = new Command("Cancel");
   Dialog d = new Dialog();
   Command result = d.show("Выход", "Вы дествително хотите выйти?",
   new Command[] {okCommand, cancelCommand}, Dialog.TYPE_CONFIRMATION, null, 0, null);
   if(result==okCommand)
        {
notifyDestroyed();
}

 }
}

В функцию startApp() укажите слушателя для формы:


f.setCommandListener(this);

Добавьте импорт следующих пакетов:


import com.sun.lwuit.events.ActionListener;

import com.sun.lwuit.events.ActionEvent;
import com.sun.lwuit.Dialog;

Дадим пояснения к добавленному коду. ActionListener - интерфейс с единственным методом - public void actionPerformed(ActionEvent evt). Этот метод вызывается когда происходит некоторое событие над компонентом.


private Command cmdExit = new Command("Exit");

Создаётся новый экземпляр cmdExit класса Command - команда, по которой будет происходить выход из приложения. Параметр конструктора - строка, название команды.


f.addCommand(cmdExit);

Команда добавляется на панель программных клавиш (menu bar softkeys) формы.


Command cmd = evt.getCommand();

Получаем команду, соответствующую событию.


Command okCommand = new Command("OK", true);

Command cancelCommand = new Command("Cancel");
Dialog d = new Dialog();

Создаём две новых команды - OK и Cancel, а затем диалог.


Command result = d.show("Выход", "Вы дествително хотите выйти?",

 new Command[] {okCommand, cancelCommand}, Dialog.TYPE_CONFIRMATION, null, 0, null);

Выводим диалог на экран. Метод show() объекта класса Dialog возвращает команду, соответствующую выбору пользователя. Сохраняем ответ пользователя в переменой Result.


if(result==okCommand){
notifyDestroyed();
}

Завершаем работу, если пользователь нажал Ok.

Наше приложение практически готово. Для большей привлекательности раскрасим форму и элементы управления. Собственно, в этом и заключается главное достоинство LWUIT. Здесь будут рассмотрены только стили, создаваемый в Run Time. Темы и их загрузка из файлов ресурсов буду рассмотрены в последующих статьях.

Создайте следующие приватные члены класса LWUIThelloWorld:


private Style styleRed = new Style(0x000000,0xAA0000,0xA0A0A0,0xFF0000,Font.getDefaultFont(),(byte)250);
private Style styleGreen = new Style(0x000000,0x00AA00,0xA0A0A0,0x00FF00,Font.getDefaultFont(),(byte)200);
private Style styleBlue = new Style(0x000000,0x0000AA,0xA0A0A0,0x0000FF,Font.getDefaultFont(),(byte)100);

В начале файла добавьте:


import com.sun.lwuit.plaf.Style;

import com.sun.lwuit.Font;

Здесь создаются экземпляры styleRed, styleGreen, styleBlue класса Style. Этот класс отвечает за параметры отображения компонентов. В данном случае конструктор получает следующие параметры: цвет тона, цвет фона, цвет выделенного тона, цвет выделенного фона, шрифт, уровень прозрачности. Цвет 0x000000 соответствует чёрному, 0xFF0000 - красному и т.д. Font.getDefaultFont() возвращает шрифт по умолчанию. (byte) 0 означает полную прозрачность, (byte) 255 - полную непрозрачность.

Примените один из созданных стилей к компоненту Label, например. Добавьте эту строчку сразу после вызова конструктора.


label1.setStyle(styleGreen);

На этом наша программа готова. Дальше читателю предлагается самому поэксперементировать со стилями.

Исходные коды можно скачать здесь

Листинг файла LWUIThelloWorld.java


import com.sun.lwuit.Display;

import com.sun.lwuit.Form;
import com.sun.lwuit.layouts.BoxLayout;
import com.sun.lwuit.Label;
import com.sun.lwuit.Command;
import com.sun.lwuit.events.ActionListener;
import com.sun.lwuit.events.ActionEvent;
import com.sun.lwuit.Dialog;
import com.sun.lwuit.plaf.Style;
import com.sun.lwuit.Font;


public class LWUIThelloWorld extends javax.microedition.midlet.MIDlet implements ActionListener
{
 private Command cmdExit = new Command("Exit");
 private Style styleRed = new Style(0x000000,0xAA0000,0xA0A0A0,0xFF0000,Font.getDefaultFont(),(byte)250);
 private Style styleGreen = new Style(0x000000,0x00AA00,0xA0A0A0,0x00FF00,Font.getDefaultFont(),(byte)200);
 private Style styleBlue = new Style(0x000000,0x0000AA,0xA0A0A0,0x0000FF,Font.getDefaultFont(),(byte)100);

 public void startApp()
 {

 Display.init(this);
 Form f = new Form("Hello world!");
 f.setLayout(new BoxLayout(BoxLayout.Y_AXIS));
 Label label1 = new Label("Лейбл");
 label1.setStyle(styleGreen);
 f.addComponent(label1);
 f.addCommand(cmdExit);
 f.setCommandListener(this);
 f.show();

 }

 public void pauseApp() {
}
 public void destroyApp(boolean unconditional) {
}

 public void actionPerformed(ActionEvent evt)
{
 Command cmd = evt.getCommand();

 if(cmd == cmdExit)
  {

 Command okCommand = new Command("OK", true);
 Command cancelCommand = new Command("Cancel");
 Dialog d = new Dialog();
 Command result = d.show("Выход", "Вы действительно хотите выйти?",
 new Command[] {okCommand, cancelCommand}, Dialog.TYPE_CONFIRMATION, null,
0, null);

 if(result==okCommand){
notifyDestroyed();
}

   }
 }

 }

Дмитрий Соколов, 16.05.2008