ГлавнаяНеобходимые приложенияНастройка приложенийГлавный классВысокоуровневое программированиеНизкоуровневое программированиеКласс GameCanvasРисование. Класс GraphicsИзображения. Класс ImageОбработка нажатийФайл манифестаСохранения. Работа с RecordStoreРабота с таймеромПолезные ссылкиОб автореСайт ФПМиКТСтуденческий сайт
Сайт о Java ME

Низкоуровневое программирование. Обработка нажатий.

Обработка нажатий клавиатуры

Для обработки нажатий в GameCanvas нужно воспользоваться методом getKeyStates. Он возвращает значение последней нажатой клавиши. Для того, чтобы узнать назначение нажатой клавиши, необходимо воспользоваться константами, например, LEFT_PRESSED, FIRE_PRESSED и т.д. Вот пример программы, которая осуществляет обработку нажатий клавиш

Файл HelloMIDlet.java

package hello;

import javax.microedition.midlet.*;

public class HelloMIDlet extends MIDlet{

    Canva canva;

    public HelloMIDlet() {
        canva=new Canva(this);
    }

    public void startApp() {
        while(true){
            canva.paint();
        }
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
		canva=null;
    }
}

Файл Canva.java

package hello;

import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.game.GameCanvas;

public class Canva extends GameCanvas{

    Display myDisplay;

    Canva(HelloMIDlet midlet){
        super(true);
        myDisplay=Display.getDisplay(midlet);
        myDisplay.setCurrent(this);
        setFullScreenMode(true);
    }

    void paint(){
        paint(getGraphics());
        flushGraphics();
    }

    public void paint(Graphics g){
        int x=getKeyStates();
        String s="";
        if(x==LEFT_PRESSED){
            s="Left";
        }else if(x==RIGHT_PRESSED){
            s="right";
        }else if(x==UP_PRESSED){
            s="up";
        }else if(x==DOWN_PRESSED){
            s="down";
        }else if(x==FIRE_PRESSED){
            s="fire";
        }
        g.setColor(Integer.MAX_VALUE);
        g.fillRect(0, 0, g.getClipWidth(), g.getClipHeight());
        g.setColor(0);
        g.drawString(s, 10, 10, 0);
    }
}
MobileApplication2.jad
MobileApplication2.jar

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

Файл HelloMIDlet.java:

package hello;

import javax.microedition.midlet.*;

public class HelloMIDlet extends MIDlet{

    Canva canva;

    public HelloMIDlet() {
        canva=new Canva(this);
    }

    public void startApp() {
        canva.start();
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
		canva=null;
    }
}

Файл Canva.java

package hello;

import java.util.Timer;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.game.GameCanvas;

public class Canva extends GameCanvas{

    Display myDisplay;
    String s;
    MyTimer timer;

    Canva(HelloMIDlet midlet){
        super(true);
        myDisplay=Display.getDisplay(midlet);
        myDisplay.setCurrent(this);
        setFullScreenMode(true);
    }

    void start(){
        timer=new MyTimer(this);
        new Timer().schedule(timer, 0, 10);
    }

    void paint(){
        paint(getGraphics());
        flushGraphics();
    }

    public void flushKey(){
        int x=getKeyStates();
        s="";
        if(x==LEFT_PRESSED){
            s="Left";
        }else if(x==RIGHT_PRESSED){
            s="right";
        }else if(x==UP_PRESSED){
            s="up";
        }else if(x==DOWN_PRESSED){
            s="down";
        }else if(x==FIRE_PRESSED){
            s="fire";
        }else{
            s=x + "";
        }
        paint();
    }

    public void paint(Graphics g){
        g.setColor(Integer.MAX_VALUE);
        g.fillRect(0, 0, g.getClipWidth(), g.getClipHeight());
        g.setColor(0);
        g.drawString(s, 10, 10, 0);
    }
}

Файл MyTimer.java

package hello;

import java.util.TimerTask;

public class MyTimer extends TimerTask{

    Canva canva;

    MyTimer(Canva canva){
        this.canva=canva;
    }

    public void run() {
        canva.flushKey();
    }
}
Не все нажатия клавиши можно определить таким способом. Некоторые клавиши можно обработать с помощью объекта объекта Command, другие являются системными, третьи, хоть и не являются системными, но все равно не обрабатываются. В общем, разработчики виртуальных машин постарались усложнить нам жизнь.

Обработка нажатий в сенсорном телефоне.

Тут все гораздо проще. Есть три переопределяемых public- метода:
  • pointerPressed(int x, int y) - момент нажатия на экран.
  • pointerDragged(int x, int y) - удерживание.
  • pointerReleased(int x, int y) - момент отпускания.
При возникновении одного из этих событий вызывается соответствующий метод, в который в качестве параметров передаются координаты нажатия.

Напомню, что для того, чтобы выбрать в качестве эмулятора сенсорный телефон, нужно щелкнуть на проекте правой кнопкой мыши, выбрать пункт "Свойства" ("Properties") и на вкладке "Платформа" ("Platform") выбрать в качестве девайса "DefaultFixTouchPhone".

Так как все предельно ясно, то перейдем сразу к примеру (единственное, что стоит уточнить: если в момент отработки метода, например, pointerPressed, вызовется еще один этот метод, то только что вызванный метод встанет в очередь и начнет работать после того, как отработает первый метод).

Файл HelloMIDlet.java

package hello;

import javax.microedition.midlet.*;

public class HelloMIDlet extends MIDlet{

    Canva canva;

    public HelloMIDlet() {
        canva=new Canva(this);
    }

    public void startApp() {
        canva.paint();
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
        canva=null;
    }
}

Файл Canva.java

package hello;

import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.game.GameCanvas;

public class Canva extends GameCanvas{

    Display myDisplay;
    String s="";

    Canva(HelloMIDlet midlet){
        super(true);
        myDisplay=Display.getDisplay(midlet);
        myDisplay.setCurrent(this);
        setFullScreenMode(true);
    }

    void paint(){
        paint(getGraphics());
        flushGraphics();
    }

    public void pointerPressed(int x, int y){
        s=x + " " + y;
        paint();
    }

    public void pointerDragged(int x, int y){
        s=x + " " + y;
        paint();
    }

    public void pointerReleased(int x, int y){
        s="";
        paint();
    }

    public void paint(Graphics g){
        g.setColor(Integer.MAX_VALUE);
        g.fillRect(0, 0, g.getClipWidth(), g.getClipHeight());
        g.setColor(0);
        g.drawString(s, 10, 10, 0);
    }
}
MobileApplication2.jad
MobileApplication2.jar
Назад	Далее