Мидлет Skeleton не работает с методами pauseApp() и destroyApp(), но вы должны реализовать их в любом случае:


public void pauseApp() {}

public void destroyApp(boolean unconditional) {}


Хотя вы уже видели все фрагменты кода, полное содержимое файла SkeletonMIDlet.java представлено в листинге 3.1.

Листинг 3.1. Код класса SkeletonMIDlet, расположенный в файле SkeletonMIDlet.java

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

public class SkeletonMIDlet extends MIDlet implements CommandListener {

private SCanvas canvas;

public void startApp() {

if (canvas == null) {

canvas = new SCanvas(Display.getDisplay(this));

Command exitCommand = new Command("Exit", Command.EXIT, 0);

canvas.addCommand(exitCommand);

canvas.setCommandListener(this);

}

// инициализация холста

canvas.start();

}

public void pauseApp() {} //В данном примере эти методы не используются вовсе, однако все равно

public void destroyApp(boolean unconditional) {} //необходимо предоставить пустые реализации, чтобы удовлетворить требованиям класса MIDLET

public void commandAction(Command c, Displayable s) {

if (c.getCommandType() == Command.EXIT) {

destroyApp(true); //В конце следует вызвать метод destroyApp(), хотя на самом деле

notifyDestroyed(); //работу мидлета завершает метод notifyDestroyed()

}

}

}


Оставшаяся часть кода мидлета Skeleton связана с классом SCanvas и представлена в листинге 3.2.

Листинг 3.2. Класс SCanvas служит как настраиваемый холст мидлета Skeleton

import javax.microedition.lcdui.*;

public class SCanvas extends Canvas {

private Display display;

public SCanvas(Display d) {

super();

display = d;

}

void start() {

display.setCurrent(this); //Это весьма важный код, так как он устанавливает текущий холст для мидлета

repaint();

}

public void paint(Graphics g) {

// очистить холст

g.setColor(0, 0, 0); // черный //Прежде чем начинать

g.fillRect(0, 0, getWidth(), getHeight()); //рисование на холсте,

g.setColor(255, 255, 255); // белый //необходимо очистить фон

// вывести размер экрана

int y = 0;

String screenSize = "Screen size: " + Integer.toString(getWidth()) + " x " + Integer.toString(getHeight());

g.drawString(screenSize, 0, y, Graphics.TOP | Graphics.LEFT);

// вывести число цветов дисплея

y += Font.getDefaultFont().getHeight();

String numColors = "# of colors: " + Integer.toString(display.numColors());

g.drawString(numColors, 0, y, Graphics.TOP | Graphics.LEFT);

// вывести число доступных альфа-уровней

y += Font.getDefaultFont().getHeight();

String numAlphas = "# of alphas: " + Integer.toString(display.numAlphaLevels());

g.drawString(numAlphas, 0, y, Graphics.TOP | Graphics.LEFT);

// вывести полный объем памяти и объем свободной памяти

Runtime runtime = Runtime.getRuntime();

y += Font.getDefaultFont().getHeight();

String totalMem = "Total memory: " + Long.toString(runtime.totalMemory() / 1024) + "KB";

g.drawString(totalMem, 0, y, Graphics.TOP | Graphics.LEFT);

y += Font.getDefaultFont().getHeight();

String freeMem = "Free memory: " + Long.toString(runtime.freeMemory() / 1024) + "KB";

g.drawString(freeMem, 0, y, Graphics.TOP | Graphics.LEFT);

}

}


Класс SCanvas – производный от класса Canvas, его конструктор принимает единственный параметр Display. Конструктор просто определяет переменную display, после чего дисплей мидлета доступен в любом месте кода холста. Метод start() вызывает метод setCurrent() объекта Display и устанавливает холст в качестве экрана. Мидлет может иметь несколько экранов, в этом случае для переключения между ними вы можете использовать метод setCurrent(). Метод start() вызывает метод repaint(), выполняющий перерисовку холста.