Веб программирование

Графика в J2ME

 
 

Всем привет, это снова я!

Сегодня я вам покажу как рисовать в J2ME, запускайте WTK, откройте наш файл Main.java блокнотом и напишите туда этот код, если что не понятно - там есть комментарии:

/*Я не сказал в прошлом уроке, но комментариев есть, кажется 2 вида, этот
на несколько строчек, я просто не часто комментирую код, вот комментарий
на 1 строчку:*/
//комментарий в строку

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

public class Main extends MIDlet{

public Canv ca;
/*Создаём объект с именем ca и типом Canv, потом мы создадим второй класс,
который будет рисовать графику и будет наследоваться от Canvas, и назовем его
как не странно Canv, а файл "Canv.java"*/
public Display d;
public static Main midlet;
/*Потом объясню зачем нам этот объект, пока просто напишите*/

public Main(){
midlet=this;
/*Если честно - я сам не знаю как это работает, нашёл в интернете. Так, как нельзя
просто так из другого класса написать например "Main.destroyApp(true)", мы пишем этот
код и потом из другого класса пишем: "Main.midlet.destroyApp(true);", этот код
вызовет метод destroyApp из этого класса*/
}

public void startApp() {

if(d == null){
ca = new Canv();
/*Инициализируем наш второй класс, в аргументы всегда передаётся то, что требует конструктор класса
(в прошлом уроке я показывал конструктор класса), у нас он ничего не требует, например можно написать
конструктор так:
public MyClass(String s, boolean b,int i){
}
тогда для инициализации надо будет написать например: new MyClass("abc",true,123);
*/

d = Display.getDisplay(this);
d.setCurrent(ca);
/*В отличии от прошлого урока мы передаём экран не форме, а другому классу,он у нас графический*/

}

}

public void pauseApp() {
}

public void destroyApp(boolean u) {
notifyDestroyed();
}

}

Написали? Отлично, только не компилируйте, ото будут ошибки, теперь создаём наш 2 класс, он будет наследоваться от Canvas, и в нём мы закрасим экран оранжевым цветом, а потом выведем картинку в центр экрана, на которой написано Hello!

Создаём в папке с исходниками файл Canv.java , открываем блокнотом (или чем там у вас, как я уже сказал - можете использовать Notepad ++) , и копируем туда этот код:

import javax.microedition.lcdui.*;

public class Canv extends Canvas{

public Image MyImg;
/*Об этом объекте я ещё не говорил, этот объект сначала инициализируете,
а потом его можно рисовать на экране, это не совсем аналог Image на vb6,
так, как его нельзя просто перенести, переносится он во время рисования,
но есть ещё объект Sprite, у которого есть метод setPosition(x,y);
*/

public int wid = getWidth();
/*Создаём переменную типа Integer и записываем в неё нашу ширину экрана*/
public int hei = getHeight();
/*То же самое, но высота*/
public int KeyFire = getKeyCode(FIRE);
/*Создаём переменную KeyFire и получаем в него код клавиши Fire на клавиатуре
телефона, мы его потом будем использовать*/

public Canv(){
/*Наш конструктор*/

try{
/*Создание картинки обязательно должно быть в блоке try{ , так, как если
в этом блоке произойдёт ошибка - то он просто пропустится, и программа пойдёт дальше,
дело в том, что пользователь может просто например удалить картинку из архива
приложения, да вы не ослышались, jar - обычный архив, который можно открытьWinRar.
Если произойдёт ошибка - то программа пойдёт в блок catch(Exception e){
в нём можно например написать ошибку на экране телефона и завершить работу программы*/

MyImg = Image.createImage("/Hello.png");

} catch (Exception e) {
/*Типо ошибка, пишем Error и выключаемся ;)
*/

}

}

public void paint(Graphics g){
/*Этом метод автоматически вызывается системой для рисования на
экране, как видим нам передаётся объект графики, с помощью
него мы и будем рисовать*/

g.setColor(255,100,0);
/*Меняем цвет рисования на оранжевый, setColor(Red,Green,Blue);*/

g.fillRect(0,0,wid,hei);
/*Рисуем закрашённый прямоугольник fillRect(x,y,width,height);*/

g.drawImage(MyImg,(wid/2)-20,(hei/2)-10,20);
/*Рисуем нашу картинку, drawImage(Image,x,y,Типо положения (x и y могут быть
и точками верхнего - левого угла, а могут быть серединой картинки) - пишите
просто 20);
*/

}

protected void keyPressed(int KeyCode){
/*Этот метод вызывается тогда, когда пользователь нажал клавишу, KeyCode - это
код нажатой клавиши*/

if(KeyCode==KeyFire){
/*Если пользователь нажал клавишу Fire, ок или в центр джойстика, незнаю как
у вас там на клавиатуре - то завершаем работу программы*/
/*Если не получается (при нажатии ничего не происходит - то замениет значение
переменной KeyFire на любой из этих кодов:
Левый софт = -6
Правый софт = -7
UP = -1
DOWN = -2
LEFT = -3
RIGHT = -4
FIRE = -5
0 = 48
1 = 49
2 = 50
3 = 51
4 = 52
5 = 53
6 = 54
7 = 55
8 = 56
9 = 57
*/

Main.midlet.destroyApp(true);

}

}

}


Если прочитали все комментарии и написали этот код в файл - то продолжаем:

Во 2 классе мы использовали картинку, поэтому её нужно добавить в прект.

Находим папку res в папке проекта, рисуем в паинте или в другом редакторе картинку с

надписью Hello! и сохраняем туда с названием "Hello.png", соблюдайте регистр букв!

Дальше переходим в WTK и жмём "Build", если есть ошибки - то проверьте код

ещё раз, или скачайте мой проект (там вся папка проекта):

Скачать файл [7580 кб]

Нету ошибок? Тогда мы идем к вам дальше!

Жмём как в прошлый раз "Project -> Package -> Create Package", получаем готовый jar - архив, и жмём "Run", должно быть примерно так:

Немного радуемся, и продолжаем. Мы в коде написали завершение работы по кнопке Fire, поэтому теперь жмём Enter и приложение выключается.

Теперь можете смело закидывать на телефон это приложение.

На этом всё!

Если что не понятно - в комментарии.

P.S. Напишите в комментарии - продолжать мне такие статьи по J2ME ?


Есть вопросы? Спроси на нашем форуме!!
Mishin870390 [29.03.2013 15:44]

Админ, если не сложно - добавь раздел J2ME, Java или Java 2 Micro Edition. Я могу создавать статьи по этому языку, так как я знаю синтаксис 15 языков вклчая ассемблер, хорошо из них знаю Visual Basic 6 и Java 2 Micro Edition, а по Visual Basic 6 тута уже много статей

Mishin870390 [29.03.2013 15:57]

Спасибо! ))

admin1310 [29.03.2013 16:03]

Назвали Java )

admin1310 [29.03.2013 16:04]

Отлично )) Если будут еще статьи, пиши, с радостью опубликуем )

Mishin870390 [29.03.2013 16:11]

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

mrJester [23.04.2013 23:47]

Как с сенсором работаааааааааааааааааааать????

Mishin870390 [24.04.2013 16:26]

точно, забыл же написать про это статью, там короче в графическом классе пишешь:

protected void pointerPressed(int x, int y){
/Какие - то действия в зависимости от x и y/
/Нажатие на экран/
}

protected void pointerDragged(int x, int y) {
/Перемещение пальца по экрану/
}

protected void pointerReleased(int x, int y) {
/Пользователь убрал палец с экрана/
}

это по типу такие же методы, как и keyPressed(int KeyCode) и keyReleased(int KeyCode)

Mishin870390 [24.04.2013 16:27]

не знаю почему убираются звёздочки, но я там поставил комментарии

zm2003160 [11.07.2013 11:43]

а как сделать картинку на весь экран, как при запуске Miniwin?

Mishin870390 [17.07.2013 19:59]

zm2003, вот функция для получения картинки других размеров. ей передаешь исходную Image, ширину новой картинки и высоту новой картинки. и она возврашает Image
использовать примерно так: Image newimage = resizeimage(oldimage,50,50);

public static Image resize
image(Image image, int i, int j)
{
int ai[] = new int[image.getWidth() * image.getHeight()];
image.getRGB(ai, 0, image.getWidth(), 0, 0, image.getWidth(), image.getHeight());
int ai1[] = reescalaArray(ai, image.getWidth(), image.getHeight(), i, j);
Image image1 = Image.createRGBImage(ai1, i, j, true);
return image1;
}

private static int[] reescalaArray(int ai[], int i, int j, int k, int l)
{
int ai1[] = new int[k * l];
for(int i1 = 0; i1 < l; i1++)
{
int j1 = (i1 * j) / l;
for(int k1 = 0; k1 < k; k1++)
{
int l1 = (k1 * i) / k;
ai1[k * i1 + k1] = ai[i * j1 + l1];
}
}
return ai1;
}

zm2003160 [17.07.2013 21:51]

Спасибо. А то совсем плохо в jav'е разбираюсь.А как сделать массив картинок?

Mishin870390 [17.07.2013 22:26]

пишешь Image MyImage[];
потом делаешь так:
MyImage = new Image[количество];
MyImage[0] = Image.createImage ...
MyImage[1] = Image.createImage ...
так можно делать не только с картинками
и это не совсем java, это его часть - j2me

zm2003160 [18.07.2013 09:45]

Происходит ошибка.Вот код
Обьявляю public Image MyImage[]
Потом в startApp:
MyImage = new Image[2];
MyImage[1] = Image.createImage(/Cut.png);
MyImage[2] = Image.createImage(/Copy.png);
MyList = new List("MyList",Choice.IMPLICIT,str,MyImage);
Как правильно?

Mishin870390 [18.07.2013 18:18]
  1. Напиши что выдает компилятор, так труднее ответить.
  2. Ты создаешь картинки Image.createImage(); чтобы это использовать надо поместить в блок try{} catch (Exception e) {}
    например:
    try{
    MyImage[1] = Image.createImage(/Cut.png);
    MyImage[2] = Image.createImage(/Copy.png);
    } catch (Exception e) {если возникли ошибки, то выполняем этот код}
    Exception e - общая ошибка, её можно писать, если нет необходимости узнать тип ошибки. Если например надо уловить ошибку с доступом к файлу - import java.io.IOException; и потом catch (IOException e) {}
    вот документация http://docs.oracle.com/javame/config/cldc/ref-impl/midp2.0/jsr118/index.html
    там снизу обычно пишется Exception Summary и дальше все ошибки
    чтобы узнать что случилось надо написать catch (Exception e) {e.printStackTrace();} тогда в окне компилятора будет информация об ошибке
Mishin870390 [18.07.2013 18:21]

P.S. в документации в центре выбери пакет (например java.io), и тогда появится список классов в пакете, а там и ошибки - Exception Summary

zm2003160 [18.07.2013 18:32]

я понял почему, надо было в графическом классе писать

Mishin870390 [18.07.2013 18:38]

zm2003, нет, разницы нету! главное, чтобы в классе, в котором пишешь был import javax.microedition.lcdui.Image; или import javax.microedition.lcdui.*;
сказал бы что за ошибку выдает компилятор...
да и кстати, ты создал массив картинок размерностью 2, но используешь его 2 элемент... элементы ВСЕХ массивов начинаются с 0
вообще не заметил это))

Mishin870390 [18.07.2013 18:41]

ещё может быть ты не обявил MyList или str.
а вообще не обязательно называть объекты как у меня) я просто для примера MyList, MyImage и т.д.

zm2003160 [18.07.2013 18:44]

но когда я писал в canvas ошибок небыло

Mishin870390 [18.07.2013 18:46]

закинь в файлообменник проект и дай ссылку в лс
исправлю...

zm2003160 [18.07.2013 18:48]

C:***************j2mewtk2.5.2appsMobile OSsrcos.java:22: illegal start of expression
img[0] = Image.createImage(/cop.png);
вот ошибка.

Mishin870390 [18.07.2013 18:50]

ну как бы /cop.png надо писать в кавычках "/cop.png". лучше пиши в личные сообщения

zm2003160 [18.07.2013 18:58]

я тебе в сообщения код класса написал



Оставлять комментарии можно только зарегистрированным




Предупреждение: Вся информация представлена исключительно в образовательных целях.
Ни авторы, ни администрация не несут ответственности в случае ее использования в противозаконных целях.