Низкоуровневое программирование. Обработка нажатий.
Обработка нажатий клавиатуры
Для обработки нажатий в 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