Логин:   Пароль:






Новости
Рассылки
Форум
Поиск


Java
- Апплеты
- Вопрос-ответ
- Классы
- Примеры
- Руководства
- Статьи
- IDE
- Словарь терминов
- Скачать

Мобильная Java
- Игры
- Примеры
- Статьи
- WAP, WML и пр.

JavaScript
- Вопрос-ответ
- Примеры
- Статьи

Веб-мастеринг
- HTML
- CSS
- SSI

Разминка для ума
Проекты
Книги
Ссылки
Программы
Юмор :)




Rambler's Top100
Rambler's Top100

Мобильная Java: СтатьиПрограммируем на J2Me - 3

Программируем на J2Me - 3

Вы все еще хотите писать программы для мобильных телефонов? Тогда нам по пути, продолжаем наши уроки мобильного программирования. Тем, кто только что к нам присоединился, рекомендуем сначала ознакомиться хотя бы со вторым уроком, где мы рассмотрели устройство MIDLETa, разобрали пример работы с объектами Image, Form и CommandListener, а еще лучше попробовать все описанное на практике.

Сегодня нам понадобятся те же средства, которые мы использовали во втором уроке, это базовый пакет J2SE, а также инструментарий J2ME Wireless Toolkit. В третьем уроке мы рассмотрим еще несколько объектов, позволяющих сделать интерактивное меню, а также познакомимся с простейшей графикой, задействовав при этом клавиши телефона.

И пусть Вас не пугает мудреный термин «объектно-ориентированное программирование». Объекты, как набор детских кубиков с буквами, чем больше кубиков есть в нашем распоряжении, тем больше слов мы можем из них составить. Сегодняшний пример — это управляемая точка, рисующая фигуры на экране мобильника. Стартовое меню приложения – опции для выбора цвета точки.

Class MIDlet

О том, как создать новый проект в J2ME Wireless Toolkit и воспользоваться классом javax.microedition.midlet.MIDlet, мы писали в прошлом уроке. Создадим новый проект, который, как и основной класс приложения, назовем FloatPoint. Нам понадобятся три члена класса: уже рассмотренный нами Display, объект стартового меню и объект, управляющий точкой. Функция startApp(), вызываемая при запуске MIDLETa, создает объект стартового меню и выводит его на экран:

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

public class FloatPoint extends MIDlet { 

private Display display; // объект отображения экрана
private CommandList menuList; // объект стартового меню
private Point point; // объект, управляющий точкой
…
public void startApp() {
display = Display.getDisplay(this);
menuList = new CommandList();
display.setCurrent(menuList); }
} 

Class List

Теперь реализуем класс CommandList, который будет представлять стартовое меню приложения. За основу возьмем класс List, в который добавим поддержку обработки функциональной клавиши для выбора нужного пункта меню, реализуя класс CommandListener.

В конструкторе класса напишем добавление команды выбора цвета и связь нашего меню с блоком прослушивания команд, как мы делали на прошлом уроке. Далее добавим в меню четыре пункта с названиями цветов с помощью метода append(String, Image). Первый аргумент метода – это строка текста меню, второй – иконка, отображаемая рядом с пунктом меню, обойдемся пока без нее, работу с объектом Image мы уже изучили, поэтому добавить ее Вам не составит труда. Также следует не забывать в конструкторе расширенного класса первой же строчкой вызывать конструктор родителя: super().

В функции выполнения команды commandAction с помощью метода getSelectedIndex() получим номер выбранного пункта меню и в соответствии с ним выставим переменную color, которую передадим в конструктор класса Point. Итак, учитывая все эти детали, получим следующий класс:


private class CommandList extends List implements CommandListener { 

private Command ok; 

public CommandList() {
super("Select Color", List.IMPLICIT);
ok = new Command("Ok", Command.OK, 1);
addCommand(ok);
setCommandListener(this);
append("Red", null);
append("Green", null);
append("Blue", null);
append("Black", null);
}
public void commandAction(Command c, Displayable s) {
int color=0;
if (c == ok) {
int i = menuList.getSelectedIndex();
switch(i) {
case 0 : color = 0xff0000; break;
case 1 : color = 0x00ff00; break;
case 2 : color = 0x0000ff; break;
case 3 : color = 0x000000; break;
}
point=new Point(color);
display.setCurrent(point);
}
}
} 
Рис.1. Так выглядит меню на эмуляторе телефона Nokia 7210

Class Canvas

Для реализации следующего класса ознакомимся с двумя новыми объектами низкоуровнего API – Canvas и Graphics. Объекты Canvas отображаются на экране, но поскольку они не являются производными от класса Screen, такими как List, Form или TextBox, они не используют какие-либо элементы абстракции экрана, например добавление заголовка невозможно.

Класс Canvas является абстрактным, поэтому для использования он требует реализации подкласса, который будет описывать поведение при обработке событий, а также с помощью класса Graphics определит свой собственный внешний вид, который задает абстрактная функция paint(Graphics).

Как и в других отображаемых объектах, сюда же можно внедрить блок прослушивания команд для того, чтобы задействовать и функциональные клавиши. В нашем примере новый класс Point, наследованный от Canvas будет хранить текущие координаты и цвет точки, доступные ширину и высоту экрана и флаг, указывающий на то, что экран должен быть очищен.

Нажатие на любую клавишу панели приводит к формированию двух клавишных событий: событие нажатия и событие отпускания клавиши. Для того чтобы задействовать клавиши, нужно обработать событие нажатия клавиши, за обработку этого события отвечает функция keyPressed(int keyCode), которая вызывается автоматически при нажатии. В этой функции мы допишем смещение точки по оси x или y в зависимости от нажатой цифры. После чего перерисуем экран, используя метод repaint().

Также добавим две команды clear и back для очистки экрана от наших каракуль и возврата к стартовому меню. Посмотрим на получившийся код класса Point:


private class Point extends Canvas implements CommandListener{ 

private int x; // координата х точки
private int y; // координата у точки
private int width; // ширина экрана
private int height; // высота экрана
private int color; // цвет точки
boolean clearFlag=true; // флаг очистки экрана
private Command clear;
private Command back; 

public Point(int _color) {
super();
width=getWidth();
height=getHeight();
x=width/2;
y=height/2;
color=_color;
clear = new Command("Clear", Command.OK, 1);
back = new Command("Back", Command.BACK, 1);
addCommand(clear);
addCommand(back);
setCommandListener(this);
} 

public void commandAction(Command c, Displayable s) {
if (c == clear) { // очистить экран и установить точку в центр
clearFlag=true;
x=width/2;
y=height/2;
repaint(); } 

if (c == back) { // выйти в стартовое меню
startApp(); }
} 

public void keyPressed(int keyCode) { 

switch (keyCode) {
case KEY_NUM1: x--; y--; break;
case KEY_NUM2: y--; break;
case KEY_NUM3: x++; y--; break;
case KEY_NUM4: x--; break;
. . . }
repaint();
} 

public void paint(Graphics g) {
. . .
}
} 

Class Graphics

Осталось реализовать функцию paint(Graphics g), которая и будет вызываться при каждой перерисовке экрана. В качестве аргумента функция получает объект класса Graphics. Справедливо может возникнуть вопрос, откуда же берется этот объект, если мы его не создавали? Отвечаем, объект Graphics, с которым мы будем работать создан автоматически при инициализации объекта Canvas. Это одна из главных причин, почему вы должны убедиться, что Ваш конструктор подкласса вызывает конструктор родителя super().

Класс Graphics поддерживает следующие действия: рисование и заливка двухмерных геометрических фигур, выбор цветов для графической ручки, выбор шрифтов для рисования текста, отсечение областей для рисования, перенос координатной системы.

В функцию paint(..) мы добавим проверку флага очистки экрана и при надобности просто зальем прямоугольник размером с экран белым цветом. После чего, используя метод setColor, зададим цвет точки и отобразим ее на экране с помощью линии длиной в один пиксел.


public void paint(Graphics g) {
if (clearFlag) {
g.setColor(0xffffff);
g.fillRect(0, 0, width, height);
clearFlag=false;
}
g.setColor(color);
g.drawLine(x,y,x,y);
} 

Рис.2. Так выглядит окончательная программа в действии.

Вот собственно и все, до стандартной «Змейки» от Nokia остался один шаг. Предлагаем Вам сделать этот шаг самостоятельно в качестве домашнего задания. Хорошая и доступная документация, в том числе и на русском языке, поможет Вам решить возникающие проблемы.

В современном мире сотовый телефон стал неотъемлемым атрибутом нашей жизни. Человек без мобильника вызывает сейчас не меньшее удивление, чем лет 10 назад человек с мобильником. Именно поэтому технология чрезвычайно перспективна, каждый третий человек на планете – обладатель мобильного телефона, а значит и потенциальный потребитель программного продукта. Удачи Вам!

Автор: Евгений Буткевич (aka Voolcan)

Warning: mysql_connect() [function.mysql-connect]: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /pub/home/javaport/javaportal/books/show2b.php on line 11

Warning: mysql_db_query() [function.mysql-db-query]: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /pub/home/javaport/javaportal/books/show2b.php on line 19

Warning: mysql_db_query() [function.mysql-db-query]: A link to the server could not be established in /pub/home/javaport/javaportal/books/show2b.php on line 19

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /pub/home/javaport/javaportal/books/show2b.php on line 30
Узнай о чем ты на самом деле сейчас думаешь тут.


[an error occurred while processing this directive]



Warning: mysql_connect() [function.mysql-connect]: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /pub/home/javaport/javaportal/news/worldnews.php on line 91

Warning: mysql_db_query() [function.mysql-db-query]: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /pub/home/javaport/javaportal/news/worldnews.php on line 93

Warning: mysql_db_query() [function.mysql-db-query]: A link to the server could not be established in /pub/home/javaport/javaportal/news/worldnews.php on line 93

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /pub/home/javaport/javaportal/news/worldnews.php on line 95