Низкоуровневое программирование. Класс GameCanvas.
  
Начнем мы низкоуровневое программирование с изучения класса GameCanvas. Он является потомком Canvas-а и содержит более удобные методы для работы с телефоном.
  
Итак, для начала нам нужно создать новый класс и объявить его подклассом GameCanvas (для удобства вновь созданный класс назовем Canva). Теперь нужно переопределить конструктор класса (можно передать в качестве параметра к конструктору экземпляр главного класса). В конструкторе необходимо прописать команду super(true). Не забудьте создать экземпляр класса Canva в главном классе.
  
Вернемся опять к классу Canva. Пропишем там объект Display myDisplay и в конструктор добавим фразу myDisplay=Display.getDisplay(midlet);. Он получает экземпляр объекта Display для дальнейшей работы с ним. После этого также нужно написать там же строку myDisplay.setCurrent(this);. Это сфокусирует объект Display на данном классе.
  
Также можно добавить команду setFullScreenMode(true);. Она устанавилвает в качестве области рисования всю площадь экрана, что может оказаться полезным для некоторых моделей телефонов. 
Некоторые сенсорные телефоны для поддержки старых мидлетов предоставляет экранную клавиатуру, которая отнимает пол-экрана. Как ее отключить, читайте в разделе "Файл манифеста". 
Теперь разберемся, как рисовать графические объекты. Для этого существует public-метод paint(Graphics g). Этот метод получает в свое распоряжение внеэкранный буфер Graphics g, на котором и происходит рисование (о том, как именно его получить, читайте ниже). Переопределите его в классе Canva и добавьте в него такие строчки:
g.setColor(1000);
g.fillRect(0, 0, g.getClipWidth(), g.getClipHeight());
  |  
Первая строка задает цвет, которым будут рисоваться объекты на экране. Вторая строка рисует закрашенный прямоугольник, начинающийся с верхнего левого угла телеяона и заканчивающийся правым нижним углом, который получен методами g.getClipWidth() и g.getClipHeight(). Подробнее с методами класса Graphics мы познакомимся в следующей главе, сейчас же посмотрим, как вывести это на экран.
  
Для этого есть два способа: вызвать метод repaint класса Canva либо 2 метода: 
paint(getGraphics());
flushGraphics();
 
Первый метод мызыаает наш public-метод paint(Graphics g), получая при этом буфер Graphics методом getGraphics() (который, как показыаает практика, по сути один и тот же, так что можно его всего один раз получить, а потом много раз использовать), второй же метод (flushGraphics) отрисовывает наш буфер на экран.
  
Как можно догадаться, метод repaint просто заменяет эти два метода, но почему-то везде предлагают идти более длинным путем, то есть использовать связку paint(getGraphics()); flushGraphics();
  
Итак, для того, чтобы воспользоваться этими методами, создадим в классе Canva метод paint() и впишем в него данные методы. После чего, в методе startApp главного класса вызовем наш только что созданный метод
Для того, чтобы запустить программу, необходимо для начала убрать все лишнее из метода startApp (все лишнее - это все, кроме метода canva.paint()).
  
Весь код программы целиком выглядит таким образом:
Файл 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.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){
        g.setColor(1000);
        g.fillRect(0, 0, g.getClipWidth(), g.getClipHeight());
    }
}
MobileApplication4.jad 
MobileApplication4.jar 
Необходимо понимать, что метод paint(Graphics g) может вызывать и сам телефон в какой угодно момент (естественно, если в момент вызова метода предыдущий еще не отработал, то вызов метода ставится в очередь). Поэтому данное поведение необходимо учитывать. Например, следущая программа вместо того, чтобы показать белый фон с надписью "call" будет демонстрировать красный фон (по крайней мере, на стандартном эмуляторе).
 Файл 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;
    boolean call=false;
    Canva(HelloMIDlet midlet){
        super(true);
        myDisplay=Display.getDisplay(midlet);
        myDisplay.setCurrent(this);
        setFullScreenMode(true);
    }
    void paint(){
        call=true;
        paint(getGraphics());
        flushGraphics();
        call=false;
    }
    public void paint(Graphics g){
        if(call){ //Если вызов от нас, рисуем белый фон и надпись call
            g.setColor(Integer.MAX_VALUE);
            g.fillRect(0, 0, g.getClipWidth(), g.getClipHeight());
            g.setColor(0);
            g.drawString("call", 10, 10, 0);
        }else{// Если вызов произошел не от нас, рисуем красный фон
            g.setColor(250, 0, 0);
            g.fillRect(0, 0, g.getClipWidth(), g.getClipHeight());
        }
    }
}
MobileApplication4.jad 
MobileApplication4.jar 
 |