Пишем на Java

Темы о Java и ее разновидностях типа J2me
Phantom
Обсуждатель
Сообщения: 179
Зарегистрирован: Сб янв 05, 2008 12:01 pm
Контактная информация:

Re: Пишем на Java

Сообщение Phantom » Ср янв 16, 2008 2:26 pm

Таак.. Ну а что тогда писать вместо многоточия:

public class PaintCAD extends MIDlet {
...
}

???

Аватара пользователя
blackstrip
Админ
Сообщения: 1176
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: Пишем на Java

Сообщение blackstrip » Ср янв 16, 2008 5:21 pm

Обязательно вписать процедуры стандартные для MIDlet-а, и можно еще свои дописать =)

Вот для примера создаю testproject

package testproject;

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


public class MoyMIDlet extends MIDlet {
static MoyMIDlet instance;
PerviyEkran displayable = new PerviyEkran();
public MoyMIDlet() {
instance = this;
}

public void startApp() {
Display.getDisplay(this).setCurrent(displayable);
}

public void pauseApp() {
}

public void destroyApp(boolean unconditional) {
}

public static void quitApp() {
instance.destroyApp(true);
instance.notifyDestroyed();
instance = null;
}

}

Объяснение:
Наверху сначала - ссылки на используемые пакеты функций (встроенных в мобилу) - через import пишутся

Потом создается экземпляр мидлета MoyMIDlet (там где написано static MoyMIDlet instance) и при запуске мидлета будет выполнен вот этот код
public MoyMIDlet() {
instance = this;
}

где нашему экзмепляру будет присвоено значение вот этого самого запущенного в данный момент класса (обозначаемого в самом себе как this - ява это поймет)

далее идут стандартные процедуры

//эта выполняется при старте
public void startApp() {
Display.getDisplay(this).setCurrent(displayable);
}


//эта при паузе (когда например входящий звонок - и прога приостанавливается)
public void pauseApp() {
}


//это када закрывается прога и удаляется из памяти
public void destroyApp(boolean unconditional) {
}


//а это нестандартная процедура, ее необязательно добавлять, но сделав ее и вписав в нее вот этот код - мона будет
//из любого места проги завершить ее просто вызвав команду MoyMIDlet.instance.quitApp();

public static void quitApp() {
//убиваем прогу
instance.destroyApp(true);
//походу уведомляем наверное экзмепляр нашего мидлета что мидлету пиз*ец =) и пора закрываться
instance.notifyDestroyed();
//убиваем экземпляр мидлета, чтоб его спокойно мог съесть garbage collector (хотя после закрытия проги его и так съест спокойно gc)
instance = null;
}


Осталось непонятным вот это:
public void startApp() {
Display.getDisplay(this).setCurrent(displayable);
}

Ну тут легко объяснить - команда у класса Display запрашивает предоставленный для этого (this) мидлета экземпляр дисплея и говорит ему "ээ слышь экземпляр, давай показывай теперь на экран объект Displayable который имеет имя displayable" (в яве регистр букв имеет большую роль. например если Displayable - это имя класса, то displayable - это ничто, до тех пор пока мы вверху не написали PerviyEkran displayable = new PerviyEkran(); и таким образом объявили что displayable - это будет экземпляр показываемого класса.

Показываемый (Displayable) - это класса, который можно вывести на дисплей.

Поэтому в проге кроме мидлета создаем еще Displayable - называем его PerviyEkran.java, внутрь пишем (точнее это сразу jbuilder пишет автоматом при создании нового дисплаябла)

package testproject;

import javax.microedition.lcdui.*;

public class PerviyEkran extends Form implements CommandListener {
public PerviyEkran() {
super("Displayable Title");
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}

private void jbInit() throws Exception {
// Set up this Displayable to listen to command events

// add the Exit command
addCommand(new Command("Exit", Command.EXIT, 1));
}

public void commandAction(Command command, Displayable displayable) {
/** @todo Add command handling code */
if (command.getCommandType() == Command.EXIT) {
// stop the MIDlet
MoyMIDlet.quitApp();
}
}

}

Вот это создали объект-класс типа Form - то бишь такого отображаемого класса, на который можно поместить стандартные для интерфейса мобилы компоненты - строки, поля ввода, флажки, опшнбоксы, строки прогресса и другие.
Кроме того управляется он пользователем через CommandListener.

команда super("Displayable Title"); инициализирует и запускает этот класс типа Form и ей заголовок вписывает (который наверху будет написан когда форма будет показана на экран, по сути заголовок окна). Без этой команды класс типа Form не может ничо. Она обязательно нужна.

Далее jbInit - необязательная процедура, ее jbuilder создает для удобства - туда можно вписать команды, которые выполнятся при запуске этого класса-формы. По умолчанию джбилдер вписывает туда команду setCommandListener(this); - эта команда говорит яве что принимаемые от пользователя с клавиатуры команды следует приносить в этот класс в процедуру commandAction (см.ее ниже по коду)

команда addCommand(new Command("Exit", Command.EXIT, 1)); добавляет одну команду в этот класс-форму, назначает ей текст Exit, тип Command.EXIT и приоритет 1. Это будет команда на софт-клавише висеть.

А в commandAction описана ее обработка
if (command.getCommandType() == Command.EXIT) {
// stop the MIDlet
MoyMIDlet.quitApp();
}

то бишь если поступила команда типа Command.EXIT - то выполняем процедуру выхода.

Там еще можно кроме команд добавлять компоненты - ну эт долго рассказывать =)

А вот например еще можно сделать было не класс-форму, а класс-канву (то бишь которая вся состоит из точек, и на ней можно рисовать)

package testproject;

import javax.microedition.lcdui.*;

public class VtoroyEkran extends Canvas implements CommandListener {
public VtoroyEkran() {
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}

private void jbInit() throws Exception {
// Set up this Displayable to listen to command events
setCommandListener(this);
// add the Exit command
addCommand(new Command("Exit", Command.EXIT, 1));
}

public void commandAction(Command command, Displayable displayable) {
/** @todo Add command handling code */
}

protected void paint(Graphics g) {
/** @todo Add paint codes */
}

}

тут уже обязательная процедура paint(Graphics g) - она вызывается при перерисовке экрана или вручную ее можно вызвать процедурой repaint();

тут же можно добавить нормальный обработчик клавиш (keyPressed - по нажатию, keyReleased - по отпусканию или keyRepeated - по долгому держанию чтоб например прокрутить несколько пунктов меню подряд)

public void keyPressed(int keyCode) {
if (keyCode==KEY_NUM0) {repaint();};
}

вот пример - он при нажатии кнопки НОЛЬ на клавиатуре - будет перерисовывать экран вызывая процедуру paint. самому эту процедуру вызывать не имеет смысла напрямую, ибо экран не перерисуется да и в качестве g ты ничо не подсунешь. а когда пишешь repaint - то ява вызывает paint и подсовывает вместо g управляющий экраном объект типа Graphics - и ты уже в процедуре paint можешь например написать

protected void paint(Graphics g) {
g.setColor(255,0,0);
g.fillRect(20,40,getWidth()-20,getHeight()-40);
}

и будет нарисован красный прямоугольник, который от левого и правого бока экрана отстоит на 20 точек, а от верхнего и нижнего - на 40.

Phantom
Обсуждатель
Сообщения: 179
Зарегистрирован: Сб янв 05, 2008 12:01 pm
Контактная информация:

Re: Пишем на Java

Сообщение Phantom » Ср янв 16, 2008 6:42 pm

Блииииииннн... ПОЛНАЯ ЖОПА... Пойду, убьюсь об стенку... Хотя, не... Лучше яду выпью... НЕ! Лучше пойду учить Java... Мало чего понял...

Phantom
Обсуждатель
Сообщения: 179
Зарегистрирован: Сб янв 05, 2008 12:01 pm
Контактная информация:

Re: Пишем на Java

Сообщение Phantom » Ср янв 16, 2008 9:44 pm

Значит так... Гг... Чувствую я, что просто так не разберусь. Нужно всё по полкам разложить. Вот смотри. Сначала подключаем нужные нам библеотеки. На сколько я понял, их всего три:

import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.Display;
import javax.microedition.midlet.MIDlet;

Или больше? И почему бы автоматом сразу все три в любом проекте не вписывать? Чтобы наверняка! А что в них содержится? Как бы функции что ли? Ну вот типа я ща на php движок для сайта пишу, он весь построен на функциях. Все функции вынесены в отдельный файл. Этот файл подгружается через include(); вначале каждой страницы сайта. Эти библиотеки что-то вроде этого?

Потом всегда пишем вот это:

public class a extends MIDlet
{
...
}

где "a" - это название файла-исходника, в котором мы это пишем. Или не обязательно писать название именно файла-исходника? Что в данном случае обозначает слово MIDlet? Ну я так понял, что "public" создаёт "class" "a", который при помощи ключевого слова "extends" наследует свойства от "MIDlet". А "MIDlet" по ходу определяется в этой библиотеке что ли: javax.microedition.midlet.MIDlet?

Потом весь код программы пишется уже внутри этого (где многоточие):

public class a extends MIDlet
{
...
}

??? Определение переменных тоже обязано быть внутри? Все функции, классы, процедуры (что там ещё существует) тоже внутри определяются? Термины ОБЪЕКТ и КЛАСС - это одно и то же? Термин КЛАСС имеет какое-то соответствие с тем, что все программные файлы имеют расширение .class, или это совпадение?

Так... Далее...

public void pauseApp(){}
public void destroyApp(){}
public void startApp(){}

Это всё должно быть внутри опять же этого:

public class a extends MIDlet
{
...
}

Это я понял. Значение каждой из этих функций (или правильнее сказать классов?) я тоже понял. За пределами этих трёх фигней может что-нибудь быть? Если может, то что? Определение переменных? Определение функций? А весь остальной код что, должен находиться в public void startApp(){}? Ведь startApp запускается при запуске мидлета...

ВО!!! Самое главное, что я не понял:

ЧЕМ КЛАСС ОТЛИЧАЕТСЯ ОТ ФУНКЦИИ? Функция может принимать значения и возвращать одно, либо не возвращать вообще при типе данных "void". А класс??? Я так и не могу понять, что ж в нём такого особенного? НАХ ОН НУЖЕН?

Вот если я пойму всё, что наплёл в этом посте, то тогда пойму всё...

Аватара пользователя
blackstrip
Админ
Сообщения: 1176
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: Пишем на Java

Сообщение blackstrip » Чт янв 17, 2008 3:10 pm

не знаю как в скачанном тобой netBeans-е, но в jbuildere как тока ты пишешь наверху класса слово import и ставишь пробел - сразу выдается список все пакэджей и классов внутри них. можно из пакаджа сразу все классы доставать: написав например import javax.microedition.lcdui.* - сразу из подуровня lcdui извлечешь все классы и подключишь их к проге.

если ставил например WTK или другой эмуль мобил - то там можешь найти api.jar, в нем внутри (открыв его винраром, ведь это обычный zip) например увидишь папку javax, в ней папку microedition, в ней lcdui, в ней кучу класс-файлов. тада сразу станет понятно что это за import такой =)

определение переменных и определение процедур(или функций) - на одном и том же уровне внутри класса.
пример:
public class MoyMIDlet extends MIDlet {

//объявим например целую переменную
public int a;
//а еще бывает private int a; это када в частном порядке будем пользовать ее тока внутри объекта где она объявлена

public MoyMIDlet() {
}

public void startApp() {
}

public void pauseApp() {
}

//объявим теперь и сразу загоним в нее стартовое значение
static String stroka = "preved";
//када переменную делаешь static - то для любого экземпляра класса (в котором она находится) это будет один и тот же объект
//и к этой можно будет даже из другого класса обратиться спокойно. люблю я пользоваться static переменными

public void destroyApp(boolean unconditional) {
}

//объявим нестандартную процедуру
public void Procedurka(int a) {
//можно прям на ходу создать новую переменную и объявить ее прям в заголовке цикла - int i
for (int i=1;i<5;i++) {
a=a+43;
}
stroka = Integer.toString(a);
//после выхода из процедуры int i пропадет и съестся garbagecollector-oм
}

//объявим нестандартную функцию
public int Slogenie(int a, int b) {
int c = a+b;
return(c);
}

}


класс это кусок проги, ему ты можешь приписать например extends Form - и это станет класс который может быть формой для показа на экран (с ее стандартными и нестандартными функциями и процедурами). короч класс это более высокий уровень - в него можно кучу процедур(или функций) вписать.

ЗЫ моим первым языком был еще в школе бейсик, поэтому в яве - процедуры это для меня то что void (то бишь ничо не возвращают), а функции это все остальные (которые хоть чото возвращают) =)

Phantom
Обсуждатель
Сообщения: 179
Зарегистрирован: Сб янв 05, 2008 12:01 pm
Контактная информация:

Re: Пишем на Java

Сообщение Phantom » Чт янв 17, 2008 5:02 pm

Гыы... А я юзал бэйсик на БК0010 1986 года выпуска (старше меня :D ). Там по ходу чуть ли не самый древний бэйсик был. И мануал к нему был. Так там по-моему вообще не было ни функций, ни процедур. Гыы... В марте прошлого года я познакомился с php, узнал, что такое функции, как их создавать и т. п. В августе начал учить C++ , понял, что такое процедуры. (но так и не продолжил его учить, школа началась и т. п.) А сейчас опять загорелся своей давней мечтой - писать для мобилы. Думаю, что время зря не потеряю, так как в Java принцип написания программы похож на другие языки (ну так пишут по крайней мере), и когда Java умрёт, тогда можно будет "безболезненно" перейти на другой язык программирования. Так... А где можно вообще про синтаксис почитать на русском языке? Где взять описание всех встроенных в Джаву функций (тоже на русском)? Так сказать русский мануал.
ЗЫ моим первым языком был еще в школе бейсик, поэтому в яве - процедуры это для меня то что void (то бишь ничо не возвращают), а функции это все остальные (которые хоть чото возвращают) =)
Я этого же буду придерживаться.

Ах да, я же не Нет Бионсом этим пользуюсь, я на него забил. Я просто через блокнотик (точнее через Notepad2) пишу и через WTK компилю... Хотя... Может стоит сначала через Нет Бионс попробовать... ХЗ даже...

Phantom
Обсуждатель
Сообщения: 179
Зарегистрирован: Сб янв 05, 2008 12:01 pm
Контактная информация:

Re: Пишем на Java

Сообщение Phantom » Чт янв 17, 2008 7:25 pm

Во! Нашёл учебник. Пока, правда, только начало прочитал... Оно многообещающее. Там написано, что эта книга научит даже того, кто вообще не имеет опыта в программировании! ВСем, кто учит Джаву, рекомендую:
http://rs179gc.rapidshare.com/files/505 ... dition.rar
#################################
Поправка:
Прочитал уже четверть книги! Прямо на одном дыхании. Читал не всё, некоторое пропускал (например описание установки всяких эмуляторов телефонов). Оказывается, пакетов всего 11:
java.lang
java.util
java.io
javax.microedition.lcdui
javax.microedition.lcdui.game
javax.microedition.io
javax.microedition.media
javax.microedition.media.control
javax.microedition.pki
javax.microedition.midlet
javax.microedition.rms

В книеге даны названия всех классов, которые в них находятся и краткое пояснение к каждому на русском языке. Но непосредственно про кодинг ещё ничего не прочитал! Как раз на этом остановился.

Аватара пользователя
blackstrip
Админ
Сообщения: 1176
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: Пишем на Java

Сообщение blackstrip » Пт янв 18, 2008 2:49 am

ну количество пакетов зависит от мобилы. например в мобилах с блютусом есть пакет javax.bluetooth для работы с блютус соединениями, ну и еще другие бывают всякие. у тя там походу общие для всех мобил тока описаны.

еще есть пакеты для работы с внутренним GPS-приемником например (если в мобиле такой есть). а в моем сименсе Е71 есть доп.класс для работы с встроенным радио например.

Phantom
Обсуждатель
Сообщения: 179
Зарегистрирован: Сб янв 05, 2008 12:01 pm
Контактная информация:

Re: Пишем на Java

Сообщение Phantom » Пт янв 18, 2008 1:28 pm

РЫСЬ, это я перечислил общие для Мидэпэ 2.0! Там ещё описаны конкретно для разных моделей!!! Я их не рассматривал пока. В сети я не нашёл описания всех этих классов на русском языке (по крайней мере в html формате). Придётся для себя делать свой мануал... Собирать по крупицам... Потом на сайте выложу, если будет, что выкладывать! В этой книге есть, вроде как, полное описание, но мне кажется не всего. Тем более учебник большой, формат DjView'овский, скопипастить то, что нужно не получится. А мне нужно, что бы сразу всё перед глазами было, в виде тезисов. Придётся вручную переписывать. Если сделаю, то точно выложу на сайте, будет у меня первый сайт в рунете, на котором будет русский мини-мануал по J2me... Гыы...

Phantom
Обсуждатель
Сообщения: 179
Зарегистрирован: Сб янв 05, 2008 12:01 pm
Контактная информация:

Re: Пишем на Java

Сообщение Phantom » Пт янв 18, 2008 1:40 pm

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

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 9 гостей