Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:
реклама
SEO оптимизация сайта для мобильных устройств и планшетов.

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Самые основы J2ME, необходимый инструментарий, установка - настройка, написание Hello World

Автор: An12345
14 апреля 2007 года

Начнем с предисловия: это моя первая статья, поэтому если что не понравиться, то не пинайте сильно, в ней я постараюсь открыть основы написания простейших мидлетов для мобильных телефонов, что становится весьма популярно в последнее время , в связи с развитием большинством производителей мобильных телефонов платформы с поддержкой J2ME. В последние пять лет, платформа J2ME , разработанная компанией Sun Microsystems на основе платформы J2SE приобрела огромную популярность во всем мире. Сейчас платформа Java , благодаря разработке CLDC1.1 и MIDP2.0 в J2ME , встречается не только в самых навороченных смартофонах, но даже в карманных органайзерах.

Теперь рассмотрим краткие основы платформы J2ME. Сразу оговоримся , что устройства J2ME собственно делится на два категории : "Первая категория описывает устройства, которые имеют специальное назначение или ограничены в функциях, они не являются универсальными вычислительными машинами - CLDC. Вторая категория описывает устройства, которые обычно имеют большие возможности для средств пользовательского интерфейса (UI) - CDC ."-это объясняет сильное функциональное ограничение этого языка, связанное в первую очередь с низкой производительностью устройств такого класса.

Теперь закончим с бесполезной теорией и приступим непосредственно к изучению профиля CLDC1.0 MIDP2.0 J2ME, для этого сперва рассмотрим пакеты, включенные в стандартный набор CLDC1.0 и их назначение:

Название пакетаКраткое описание
java.ioСтандартные классы ввода-вывода приложения в J2SE
java.langОсновные классы интерфейсов виртуальной машины в J2SE
java.utilКлассы стандартных утилит пакета J2SE
javax.mircoedition.ioКлассы структуры общих соединений CLDC 1.0

Первые 3 пакета (java.io, java.lang, java.util) имеют префикс java. , т.к. происходят от аналогичных пакетов в J2SE и имеют схожие функции , 4 пакет (javax.microedition.io), используется с префиксом javax. , т.к. он содержит функции и интерфейсы, свойственные только языку J2ME и не имеющие реализации в основном пакете J2SE. Но CLDC включает в себя довольно большое количество устройств с различными Возможностями, поэтому он имеет еще более мелкое деление, для мобильных телефонов это MIDP1.0 (Mobile Information Device Profile), который наиболее полно использует функциональные возможности мобильного телефона и содержит следующие пакеты (стоит заметить, что уже существует профиль CLDC1.1 MIDP2.0 , который в данной статье не рассматривается, но имеет большие возможности по сравнению с MIDP1.0):

Название пакетаКраткое описание
java.ioСтандартные классы ввода-вывода java
java.langОсновные классы интерфейсов виртуальной машины java
java.utilКлассы стандартных утилит java
javax.microedition.icduiКлассы интерфейса пользователя в J2ME
javax.microedition.rmsКлассы постоянного хранения данных в J2ME
javax.microedition.midletКлассы определения J2ME приложений
javax.microedition.ioКлассы общих соединений MIDP

В дальнейшем мы более подробно познакомимся с каждым пакетом, его назначением и использованием на наглядных примерах, а сейчас приступим к написанию нашей первой мегапрограммы, которая выведет на экран телефона заветное заклинание, звучащее как "HELLO WORLD!", точнее мы напишем две версии этой уникальной программы, чтобы ознакомится как с простым текстовым выводом, так и с выводом через графический элемент Canvas, который предоставляет более широкие возможности по оформлению текста. Но прежде чем написать наш первый исходный код, мы сперва определимся, какие программы нам будут необходимы для удобного создания J2ME приложений на начальном этапе:

1)J2SDK - собственно сам дистрибьютив Java , который необходим для компиляции, отладки и запуска Ява приложений, который имеет практически все необходимое для разработки приложения, но не имеет графического интерфейса, что на начальных этапах изучения программирования может привести к путанице, поэтому кроме него нам понадобиться еще некоторый инструментарий. Последнюю версию J2SDK всегда можно найти на сайте производителя: http://java.sun.com , но для разработки приложений j2me лучше использовать версии младше, чем SDK1.6, если вы хотите обеспечить оптимальную совместимость со старыми моделями телефонов, для последних моделей можно использовать любую версию!

2)WTK - удобный инструмент, предназначенный непосредственно для разработки приложений на j2me, имеет в составе все необходимые программы и классы, к тому же , оснащен удобным пользовательским интерфейсом(GUI), поэтому он тоже необходим на этапе изучения языка, найти его можно тоже на сайте производителя: http://java.sun.com, где он доступен для бесплатного скачивания.

3)Эмулятор - программа, необходимая для проверки работоспособности приложения на определенном телефоне, в составе WTK уже имеется эмулятор, но иметь эмулятор стороннего производителя обычно очень полезно. Скачать эмулятор для телефона Siemens можно по адресу: http://www.siemens-club.ru/soft-emul.php, где можно скачать и SDK. Эмулятор сименсов состоит из двух частей:SMTK (один пакет для всех эмуляторов) и сам эмулятор телефона, обе части обязательны для скачивания.

4)Также нам потребуется редактор, но в связи со сложностью настройки специализированных редакторов, мы ограничимся на данный момент обыкновенным блокнотом, который поставляется в комплекте с Windows. Если же вы решите установить редактор, то вот список наиболее популярных: JBuilder, IntelliJ IDEA, Eclipse, Netbeans и другие. Все они различаются по возможностям и удобству пользования и выбор одного из них, это дело личных предпочтений, но я выбрал для себя IntelliJ IDEA.

Теперь коротко опишем процесс установки и запуска нашего основного инструментария. Для начала установим заранее загруженный J2SDK, его установка ничем не отличается от установки любого другого приложения под Windows, поэтому сложностей возникнуть не должно, единственная рекомендация - смените путь установки на любой другой, не содержащий пробелов (Например: C:/javasdk/). Теперь проверим, прописана ли у нас Ява в PATH, для этого запустим командную строку (WIN+R -> 'cmd') и введем в ней команду 'java -version' (между 'java' и '-version' - стоит пробел!), если мы увидим что-то похожее на:

C:>java -version
java version "1.4.1_01"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1_01-b01)
Java HotSpot(TM) Client VM (build 1.4.1_01-b01, mixed mode)

То это означает, что Ява удачно прописана в PATH , если в ответ на команду мы видим:

C:>jаva -version

"jаva" не является внутренней или внешней командой, исполняемой программой или пакетным файлом. Тогда нам необходимо проделать следующие действия (для WinXP): Пуск -> Панель управления -> Система -> Дополнительно (вкладка) -> Переменные среды, там найти в нижнем окне переменную path , нажать кнопку изменить и добавить после ее содержимого : ';<C:/javasdk/bin>' , без '', javasdk - ваш путь к SDKб сохранить результат. После этого, если вы не допустили ошибок в процессе изменения path , в командной строке после ввода команды 'java -version' отобразиться что-то похожее не первую вкладку. После установки SDK, установите WTK, его установка тоже не должна вызвать затруднений, единственной особенностью, будет необходимость указать при установке верный путь к C:/javasdk/ , но как правило он верно определяется самостоятельно. После того, как заветная версия Явы отобразиться в командной строке и установлен WTK, можно приступить к следующему этапу, к установке эмулятора. Для начала установим SMTK, который попросит при установке указать путь к SDK, директория , куда он будет установлен, не должна содержать пробелов, иначе это может привести к неработоспособности. Наконец, после установки SMTK (скорее всего версии 2.0), можно запускать программу установки самого эмулятора, советую для качественного тестирования поставить эмуляторы m50, m55, mc60, s65, cx65 , т.к. они имеют разные разрешения экранов и разную функциональность, что благотворно сказывается на надежности тестирования и позволяет посмотреть внешний вид приложений на разных телефонах. После установки проверим работоспособность эмуляторов, для этого запустим SMTK Emulator launcher, расположенную в Пуск -> Siemens Mobility Toolkit -> SMTK Emulator Launcher, должно открыться окно, отображающее список установленных эмуляторов с возможностью быстрого запуска:

После запуска эмулятора, появятся три окна, окно для быстрого управления эмулятором (1), окно вывода эмулятора (2) и соответственно сам эмулятор (3):

Теперь, когда установка эмулятор и работа всех систем проверена и настроена, мы можем, наконец приступить к разработке нашей первой J2ME программы. Сразу оговоримся, что в листинге программы комментарии, которые не воспринимаются как программный код, выделяются двумя способами:

//   Это короткий однострочный комментарий

/**  
*   А это комментарий,
*   на нескольких строках
*   (Второй способ)
*/

Теперь рассмотрим написание нашей первой программы, выводящей на экран 2 строки: 'Hello world!' и 'Всем привет!' (если вы установили WTK в папку, отличную от C:/WTK тогда замените во всех дальнейших шагах путь C:/WTK на ваш путь к WTK) :

1) Запустите WTK (C:/WTK/bin/ktoolbar.bat):

2) Нажмите кнопку 'New Project':

3) Введите в поле 'Project Name' название проекта, в поле 'MIDlet Class Name' название главного класса мидлета, обратите внимание, регистр имеет значение, поэтому Hello и hello - совсем разные названия! В нашем случае, в поле 'Project Name' введем 'HelloMIDlet1' в поле 'MIDlet Class Name' - 'HelloClass'! Нажмите кнопку 'Create Project', откроется новое окно, содержащее настройки нового мидлета, вот краткое описание полей основной вкладки конфигурирования (Required), остальные поля пока можно не менять:

Название опцииЗначение
MIDlet-Jar-SizeРазмер JAR архива приложения
MIDlet-Jar-URLАдрес к JAR архиву в Интернете
MIDlet-NameНазвание приложения
MIDlet-VendorАвтор приложения
MIDlet-VersionВерсия приложения (три числа, разделенные точкой, например 1.0.3)
MicroEdition-ConfigurationCLDC конфигурация приложения
MicroEdition-ProfileПрофиль MIDP приложения

Вот внешний вид окон приложения, после нажатия кнопки 'Create Project', в главном окне WTK отображены пути, где необходимо расположить исходные коды приложения :

4) Теперь мы провели почти все необходимые подготовки и готовы к написанию нашего первого приложения, но сперва нанесем еще один штрих:

ПапкаЗначение
C:/WTK/apps/HelloMIDlet1/binТут мы сможем забрать готовое приложение
C:/WTK/apps/HelloMIDlet1/srcВ этой папке необходимо разместить все исходники
C:/WTK/apps/HelloMIDlet1/resВ этой папке можно разместить внешние ресурсы
C:/WTK/apps/HelloMIDlet1/libСюда нам писать пока не стоит:

5) Итак, рассмотрим нашу первую программу (все данные программы необходимо поместить в C:/WTK/apps/HelloMIDlet1/src/HelloClass.java):

/**HelloClass.java**/

// Сначала подключим классы, которые нам понадобятся для программы
// каждая программа на java начинается именно с этого.

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


// Теперь создадим стандартный рабочий класс J2ME, расширяющий класс
// MIDlet, именно этот класс является обязательным элементом J2ME программы 

public class HelloClass extends MIDlet{

// Переопределим стандартные функции класса MIDlet: startApp(),
// pauseApp() и destroyApp(boolean n) которые отвечают
// соответственно за действия при запуске приложения, его
// приостановке и выходе из // него. В нашем  случае переопределен
// только startApp(), который содержит собственно всю программу
// функция destroyApp() и pauseApp() в нашем случае не играют никакой
// роли, однако их указание даже в пустом виде - обязательно!

public void destroyApp(boolean d){notifyDestroyed();}
public void pauseApp(){}
public void startApp(){

// Создаем после запуска приложения (startApp()) локальную форму с
// именем form, обратите внимание на синтаксис определения:
// <тип переменной>< ><имя переменной><
// >=< >new< ><Класс(<Параметр 1>,
// <Параметр 2>, :)><;>
// Тип переменной обычно совпадает с именем класса!
// Обратите внимание, что конструктор Form(String title) имеет
// только 1 параметр - заглавие формы. 

Form form = new Form("Начало!");

// Теперь к уже созданной форме с именем 'form' необходимо
// прилепить элементы, в наше5м случае это текст, но на его
// месте может быть и какой-нибудь другой элемент , но об
// этом читайте в официальной документации с адреса http://java.sun.com.
// В нашем случае для присоединения к форме надписей, используется
// функция класса Form() с именем append(String Text), вызываемая
// как form.append("Text"); , заметьте, что мы используем в
// качестве параметра для функции русскую строку, что может
// привести к некорректному отображению в некоторых моделях
// телефонов (в основном старых), поэтому 3 строку мы запишем
// в виде Unicode аналога строки 'Привет всем!', который
// выглядит как : // " \u0412\u0441\u0435\u043C\u0020\u043F
// \u0440\u0438\u0432\u0435\u0442\u0021"
// при запуске мы увидим, что на месте Unicode будут отображены
// русские символы. комбинация \n означает конец отображаемой
// строки и переход на новую.  

form.append("Hello World!\n");
form.append("Всем привет!\n");
form.append("\u0412\u0441\u0435\u043C\u0020\u043F\u0440\u0438\u0432\u0435\u0442\u0021");

// А эти 2 строки являются самыми важными, т.к. именно они отвечают
// за вывод данных на экран, сперва мы получаем в объект класса Display,
// названный  display текущее содержание экрана телефона:

Display display = Display.getDisplay(this);

// A эта строка пишет в объект display содержимое формы form,
// определенной выше.
 
display.setCurrent(form);

// Закрываем startApp(){:} и класс HelloClass(){:}
}
}

6) Теперь, когда исходный код сохранен в нужном файле, рассмотрим процесс Компиляции и запаковки мидлета. Вернитесь в KToolBar WTK (если вы закрыли его, то прочитайте выше как запустить и нажмите на кнопку Open Project -> HelloMIDlet1). Нажмите кнопку Build, если в не допустили ошибок в пунктах 1-5, то вы увидите сообщение следующего содержания:

Project settings saved Building "HelloMIDlet1"
Build complete

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

7) Если в пункте 6 вы получили приведенное сообщение, то значит программа написана без ошибок и успешно скомпилирована, соответственно ее можно Запустить, для этого выберите эмулятор в строке 'Device:' и нажмите кнопку 'Run', вы должны увидеть изображение телефона, нажмите кнопку 'Launch' на клавиатуре виртуального телефона, не экране должно появиться что-то, напоминающее рисунок, расположенный ниже. Как видите строка "Всем привет!" и строка, написанная в Unicode : "\u0412\u0441\u0435\u043C\u0020\u043F\u0440\u0438\u0432\u0435\u0442\u0021" выглядят на экране всех эмуляторов одинаково, на экране большинства мобильных телефонов это будет точно также, но, как и было сказано выше, некоторые телефоны (например, Samsung) не смогут отобразить строку 'Всем привет', но без проблем отобразят строку в Unicode:



8) После того, как программа проверена на эмуляторе WTK, необходимо собрать ее в JAR пакет, который может быть загружен в мобильное устройство. Для создания архива средствами WTK, необходимо выполнить следующие действия:

Project -> Package -> Create Package. После выполнения данной команды, при успешном ее завершении на экран выведется:

Project settings saved Building "HelloMIDlet1"
Wrote c:\WTK\apps\HelloMIDlet1\bin\HelloMIDlet1.jar
Wrote c:\WTK\apps\HelloMIDlet1\bin\HelloMIDlet1.jad
Build complete

В каталоге С:/WTK/apps/HelloMIDlet1/bin будут созданы файлы HelloMIDlet1.jar и HelloMIDlet1.jad, которые могут быть загружены в мобильное устройство, или протестированы эмулятором, в нашем случае это Siemens Emulator. Для запуска приложения в эмуляторе, необходимо нажать правой кнопкой на файле HelloMIDlet1.jar и выбрать пункт 'Открыть с помощью: -> Emulator', появится

Окно выбора эмулятора, где необходимо выбрать нужный эмулятор:



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

9) Не этом шаге, разработка вашего первого приложения для мобильного телефона завершена и можно плавно перейти ко второму примеру.

Второй пример покажет как можно обойтись без использования интерфейсов высокого уровня и получить максимальный контроль над форматом выводимых данных. Сейчас мы создадим приложение, которое выведет на экран уже знакомую нам фразу 'Hello World' красным цветом с серой тенью на желтом фоне, обрамленную синей рамкой =)

Кроме того, мы добавим кнопку для корректного выхода из мидлета.

Для этого нам понадобится создать не один класс, как в первом случае, а 2:

1) HelloClass.java - этот класс необходим для правильного запуска приложения на мобильной платформе, от содержит методы работы мидлета и его целью является передача управления классу HelloCanvas.

2) HelloCanvas.java - класс, предназначенный непосредственно для отрисовки и отображения нашей надписи на экране.

Перейдем непосредственно к созданию нашего второго мидлета:

1) Выполните шаги 1-4 из первого примера, но на 3 шаге укажите 'Project Name' HelloMIDlet2.

2) Перейдите в папку с исходными текстами (C:/WTK/apps/HelloMIDlet2/src/) и создайте 2 файла: HelloClass.java и HelloCanvas.java.

3) HelloMIDlet2.java:

/**HelloClass.java**/

// Подключаем необходимые пакеты
 
 import javax.microedition.midlet.*;
 import javax.microedition.lcdui.*;

// Создаем главный класс мидлета, implements CommandListener
// означает, что класс может служить обработчиком команд.

 public class HelloClass extends MIDlet implements CommandListener{

//Получаем дисплей мидлета, на котором будет отображена надпись.

  Display d = Display.getDisplay(this);

// Создаем элемент exit, который будет служить командой выхода.
// Обратите внимание, тип Command.EXIT никак не влияет на действие
// которое мы припишем команде и по умолчанию команда ничего не делает!

    private Command exit = new Command("Exit", Command.EXIT, 0);    
    public void startApp() {

// Вместо того, чтобы создать форму как мы делали в первом примере, 
// создаем объект типа HelloCanvas, который у нас определен как класс
// пропрсовки:

        HelloCanvas Canv = new HelloCanvas();

// Метод Элемент.addCommand(Command command) добавляет к Элементу
// Заранее созданную команду, в нашем случае с надписью "Exit"
// (см. Command exit:)

        Canv.addCommand(exit);

// Указываем, какой класс будет обрабатывать коммандды этого меню.
// т.к. наш класс является implements CommandListener, то можно указать this,
// т.е. команды будут обрабатываться методом commandAction этого класса.

        Canv.setCommandListener(this);

// Выводим наш элемент на экран. (см. Первый пример):

        d.setCurrent(Canv);
   }
    
// метод остается пустым, т.к. в этом приложении он не задействован 
// (см. Пример 1)

    public void pauseApp() {}

// заставляем приложение завершить работу при вызове метода
// destroyApp(boolean b);
    
    public void destroyApp(boolean u) {notifyDestroyed();}

// Благодаря методу приведенному ниже, наше приложение способно реагировать
// на активирование команд, метод является обязательным для классов,
// заданных как implements CommandListener. 

    public void commandAction(Command command, Displayable displayable) {

// Сверяем активную команду (передается методу автоматически при
// активации команды) если была выбрана команда exit, то вызываем
// метод, завершающий работу приложения (см. выше)

      if(command == exit){destroyApp(false); }

// Конец Метода и класса.

    }
}

4) HelloCanvas.java:

/**HelloCanvas.java**/

// Импортируем необходимые классы:

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;

// Создаем класс, являющийся 'холстом', для чего задаем extends Canvas,
// обязательным элементом для работы этого класса является функция
// paint(Graphics g), которая автоматически вызывается системой при
// создании объекта данного класса и получает параметр Graphics g

public class HelloCanvas extends Canvas{

// Получаем Ширину и Высоту экрана соответственно (не всегда работает верно!!!)
    
    private int w = getWidth();
    private int h = getHeight();

// Реализуем метод paint(), который и быдет прорисовывать нашу строку =)

    protected void paint(Graphics g) {

// Задаем желтый цвет (RRR,GGG,BBB);
// Рисуем закрашенный прямоугольник, полностью перекрывающий экран.
// метод fillRect(x0,y0,w,h) рисует прямоугольник шириной w и высотой h, 
// начиная с точки (x0, y0), отсчет ведется от левого верхнего угла!

        g.setColor(255,255,117);
        g.fillRect(0,0,w,h);

// Серый цвет...

        g.setColor(183,183,187);

// Рисуем строку "Hello World!", Средняя верхняя точка которой
// расположена в точке (w/2+1, h/3+1) (фон)
        g.drawString("Hello World!", w/2+1, h/3+1, Graphics.HCENTER|Graphics.TOP);
     
// Красный цвет...

        g.setColor(213,34,9);

// Строка, нарисованная по тому же принципу, но со смещением 1 пиксель
// по диагонали (собственно надпись)

        g.drawString("Hello World!", w/2, h/3, Graphics.HCENTER|Graphics.TOP);

// Синий цвет...

        g.setColor(47,19,202);

// Рисуем контур по тому же принципу, что и закрашенную фигуру в начале.

        g.drawRect(10,h/3-h/4,w-20,h/3+h/4);

// Закрытие процедуры и класса.

    }    
}

Если вы все сделали правильно, то после нажатия кнопки Run вы увидите результат работы нашего приложения:

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

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

Отзывы, вопросы и предложения вы можете адресовать на an12345@bk.ru, я с удовольствием вам отвечу.

Кроме того, рекомендую вам посетить наш IRC канал #j2me в сети RusNET (irc.run.net:6669, irc.ru:6669) где вы сможете задать интересующие вас вопросы и просто пообщаться в хорошей компании :

До свидания!

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
96K
15 ноября 2015 года
Александр Володин
0 / / 15.11.2015
Мне нравитсяМне не нравится
15 ноября 2015, 13:00:06
Нажимаю Build, пишет No source to compile, хотя всё делал по инструкции...
2.
95K
18 февраля 2015 года
Хушбахт Ботиров
0 / / 18.02.2015
+2 / -0
Мне нравитсяМне не нравится
18 февраля 2015, 16:15:21
Super!!!...
Спасибо!
3.
66K
30 ноября 2010 года
Аскет
0 / / 30.11.2010
+10 / -11
Мне нравитсяМне не нравится
30 ноября 2010, 18:29:31
>> Статья любителя для любителя
Статью писал явно дилетант.
Особо задевают такие каракули:
Код:
// <тип переменной>< ><имя переменной><

// >=< >new< ><Класс(<Параметр 1>,

// <Параметр 2>, :)><;>

--------------------------------------------------------
Во первых и в главных. Описанный "необходимый" уже излишек.
SDK, блокнот, ну и эмулятор. ВСЁ. Это и есть необходимый софт.

Для "Самых основ J2ME" как минимум надо всё делать «ручками», а не через автоматизированные IDE, дабы не сбивать с толку неискушённого пользователя.
4.
51K
29 июня 2009 года
mjellnir
0 / / 29.06.2009
+1 / -13
Мне нравитсяМне не нравится
29 июня 2009, 11:17:05
Статья любителя для любителя да ещё и с грамматическими ошибками. Надеюсь автор с 2007-года больше не писал статей.
5.
50K
12 мая 2009 года
medveduk-88
0 / / 12.05.2009
+1 / -9
Мне нравитсяМне не нравится
12 мая 2009, 15:19:43
как вот такое сделать????

в виде Unicode аналога строки 'Привет всем!', который
// выглядит как : // " \u0412\u0441\u0435\u043C\u0020\u043F
// \u0440\u0438\u0432\u0435\u0442\u0021"
6.
43K
28 сентября 2008 года
AluringAbyss
0 / / 28.09.2008
+7 / -2
Мне нравитсяМне не нравится
28 сентября 2008, 16:08:35
Классная статья. Рассчитана для людей, чего-то понимающих в программинге, но для полных чайников именно в Java. Спасибо автору. Жду продолжения))
7.
42K
24 августа 2008 года
zaken
0 / / 24.08.2008
+13 / -1
Мне нравитсяМне не нравится
24 августа 2008, 15:01:19
Спасибо! Очень хорошее изложение. Жду продолжения.
8.
35K
30 ноября 2007 года
romanjava
0 / / 30.11.2007
+6 / -2
Мне нравитсяМне не нравится
30 ноября 2007, 23:17:49
нет такого софта на сайте
8.1.
79K
11 января 2012 года
Ддима
0 / / 11.01.2012
+7 / -2
Мне нравитсяМне не нравится
11 января 2012, 17:26:06
Статья СУПЕР, большое спасибо.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог