import java.io.*;
public class SSCanvas extends Canvas {
private Display display;
private Image[] slides;
private String[] captions = { "Love Circle Bowl", "Double Wide Spine", //Индексы массива соответствуют изображениям
"Flume Zoom Over-vert", "Kulp De Sac Bowl",
"Louie\'s Ledge" };
private int curSlide = 0;
public SSCanvas(Display d) {
super();
display = d;
// загрузить изображения
try {
slides = new Image[5];
slides[0] = Image.createImage("/LoveCircle.jpg");
slides[1] = Image.createImage("/DoubleWide.jpg");
slides[2] = Image.createImage("/FlumeZoom.jpg");
slides[3] = Image.createImage("/KulpDeSac.jpg");
slides[4] = Image.createImage("/LouiesLedge.jpg");
}
catch (IOException e) {
System.err.println("Failed loading images!");
}
}
void start() {
display.setCurrent(this);
repaint();
}
public void keyPressed(int keyCode) {
// получить игровое событие
int action = getGameAction(keyCode);
// обработать нажатия клавиш
switch (action) {
case LEFT:
if (–curSlide < 0)
curSlide = slides.length – 1;
repaint();
break;
case RIGHT:
if (++curSlide >= slides.length)
curSlide = 0;
repaint();
break;
}
}
public void paint(Graphics g) {
// очистить экран
g.setColor(255, 255, 255); // белый
g.fillRect(0, 0, getWidth(), getHeight());
// вывести текущее изображение
g.drawImage(slides[curSlide], getWidth() / 2, getHeight() / 2,
Graphics.HCENTER | Graphics.VCENTER);
// установить шрифт
Font f = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD,
Font.SIZE_MEDIUM);
g.setFont(f);
// вывести текущее содержание
g.setColor(0, 0, 0); // черный
g.drawString(captions[curSlide], getWidth() / 2, 0,
Graphics.HCENTER | Graphics.TOP);
}
}Чтобы интегрировать холст в мидлет, необходимо создать объект класса SSCanvas в классе SlideshowMIDlet:
private SSCanvas canvas;
Затем в конструкторе класса SlideshowMIDlet эта переменная инициализируется. Полный код мидлета Slideshow приведен в листинге 4.4. Листинг 4.4. Код мидлета Slideshow
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class SlideshowMIDlet extends MIDlet implements CommandListener {
private SSCanvas canvas; //Использование настраиваемого холста – это уникальный фрагмент кода мидлета
public void startApp() {
if (canvas == null) {
canvas = new SSCanvas(Display.getDisplay(this));
Command exitCommand = new Command("Exit", Command.EXIT, 0);
canvas.addCommand(exitCommand);
canvas.setCommandListener(this);
}
// Start up the canvas
canvas.start();
}
public void pauseApp() {}
public void destroyApp(boolean unconditional) {}
public void commandAction(Command c, Displayable s) {
if (c.getCommandType() == Command.EXIT) {
destroyApp(true);
notifyDestroyed();
}
}
}Как вы, вероятно, заметили, этот код практически идентичен классу мидлета Olympics, созданного нами ранее. Это подтверждает, что большая часть функций возложена на класс, производный от Canvas.
Тестирование готового приложения
После того как мидлет Slideshow собран, вы непременно захотите протестировать его в J2ME-эмуляторе. Не забудьте, что кнопки Влево и Вправо используются для навигации по слайд-шоу. На рис. 4.6 показан фрагмент работы мидлета Slideshow.