Java 2 Micro Edition (J2ME)

       

Oбработка команд и событий


В компоненте Canvas вы можете добавлять и удалять высокоуровневые команды и устанавливать один блок прослушивания команд на Canvas, как и в других отображаемых компонентах. Canvas также может внедрять CommandListener и регистрироваться как свой собственный блок прослушивания.

Однако, в дополнение к обработке высокоуровневых команд, класс Canvas также обрабатывает низкоуровневые команды. Компоненты Canvas сами являются источниками низкоуровневых событий клавиш и указателя, которые генерируются действиями пользователя по вводу с клавиатуры и перемещением указателя на устройстве. Они также являются своими собственными блоками прослушивания низкоуровневых событий. Класс Canvas определяет интерфейс для обработки низкоуровневых событий как часть своего собственного API, другого интерфейса блока прослушивания не реализуется.

Реализация MIDP передает информацию о событии низкого уровня объекту Canvas, вызывая соответствующий метод в объекте Canvas. В таблице 6.1 перечислены возможные методы.

Таблица 6.1. Методы уведомления о событиях низкоуровневого API

Название метода Описание
protected void keyPressedfint KeyCode) Клавиша была нажата и отпущена
protected void keyReleased.(int KeyCode) Клавиша была отпущена

protected void keyRepeated(int KeyCode) Клавиша была нажата несколько раз
protected void pointerPressed (int x, int y) Указатель был нажат
protected void pointerDragged (int x, int y) Указатель был перемещен
protected void pointerReleased(int x, int y) Указатель был отпущен
protected abstract void paint (Graphics g) Произошел запрос Canvas на перерисовку

Для выполнения обработки событий низкого уровня ваш конкретный подкласс Canvas должен подменять один или больше методов, перечисленных в таблице 6.1. Не подменяя пустые описания класса Canvas, вы пропускаете события и вышеупомянутую возможность их обработки. Кроме того, ваш подкласс Canvas должен описывать метод paint (), который объявляется абстрактным в Canvas.

В листингах 6.1 и 6.2 представлена простая схема обработки команд и событий в Canvas. Код в листинге 6.1 является кодом MID-лета для демонстрационной программы, большая часть которой выглядит знакомо. Код в листинге 6.2, однако, создает подкласс Canvas - Displayable, который согласно коду, показанному в листинге 6.1, размещается на экране.


Листинг 6.1. Демонстрационной программе CanvasDemol требуется MID-лет, как и любое другое приложение МIDР

import javax.microedition.midlet.MIDlet;

import javax.microedition.lcdui.Display;

/"

Определяет MID-лет, отображающий пустой Canvas на дисплее устройства.

Отображаемый Canvas является Экземпляром класса Canvasl.

@смотри Canvasl

*/

public class CanvasDemol extends MIDlet

{

// Поддерживает ссылку на экземпляр данного класса.

private static CanvasDemol midlet;

// Поддерживает ссылку на Canvas, который пользователь

// видит на дисплее.

private static Canvasl instance;

private Display display; private Canvasl canvas;

/**

Конструктор No-arg. Вызывает конструктор no-arg класса MID-лета.

*/

public CanvasDemol()

super();

display = Display.getDisplay(this); instance = canvas; midlet = this;

{

/**

Возвращает ссылку на MID-лет, связанный с данным отображаемым объектом.

@возвращает MID-лет, который отображает этот объект.

**/

public static CanvasDemol getMIDlet()

{

return midlet;

{

public void startApp()

{

canvas = new Canvasl ();

display.setCurrent(canvas);

(

public void pauseApp()

{

}

public void destroyApp(boolean destroy)

{

instance = null;

canvas = null;

void quit ()

{

destroyApp(true);

notifyDestroyed();

}

}

Листинг 6.2. Чтобы использовать Canvas, вы должны создать подкласс Canvas

import javax.microedition.lcdui.Canvas;

import javax.microedition.lcdui.Command;

import javax.microedition.lcdui.CommandListener;

import javax.microedition.lcdui.Display;

import javax.microedition.lcdui.Displayable;

import javax.microedition.lcdui.Graphics;

/**

Определяет подкласс Canvas, который отображается с помощью MID-лета

CanvasDemol. Этот Canvas имеет единственную команду «Exit», так что

пользователь может завершить работу демонстрационной программы.

@Осмотри CanvasDemol

*/

public class Canvasl extends дополняет Canvas

implements CommandListener

{

private Command exit = new Command("Exit", Command.EXIT, 1);



/**

Конструктор No-arg.

*/

public Canvasl ()

{

// Обратите внимание на вызов super (), который является конструктором

// r.o-arg Canvas! Это очень важно. Без вызова superf) ваши экземпляры

// Canvas не смогут действовать как настоящие Canvas. Они не будут

// отображать правильно, они не будут рисовать должным образом и они

// не смогут обрабатывать события, super () ;

addCommand(exit); setCommandListener (this);

printCanvasInfo() ;

}

/**

Рисует внешний вид Canvas, видимый пользователю.

В данном случае он не рисует ничего.

Поэтому этот Canvas не имеет визуального представления.

*/

public void paint(Graphics g)

{

}

public void commandAction(Command c, Displayable d)

{

if (c == exit)

CanvasDemol.getMIDlet().quit();

}

/**

Определяет, что обработка должна быть сделана в ответ на

событие отпускания клавиши, произошедшее в данном Canvas.

Этот метод подменяет тот же самый метод в Canvas.

*/

public void keyReleased(int keyCode)

{

printKeyEventlnfo(keyCode);

}

/**

Определяет некоторую обработку событий, связанных с клавишами.

Этот метод просто печатает в стандартном результате некоторую

диагностическую информацию о событиях, связанных с клавишами, на Canvas.

*/

protected void printKeyEventlnfо(int keyCode)

{

System.out.println("Key code = " + keyCode);

System.out.println("Key name = " + getKeyName(keyCode));

System.out.println("Game action = " + getGameAction(keyCode));

}

/*'*

Печатает диагностическую информацию об атрибутах

и возможностях объекта Canvas.

"/

protected void printCanvasInfо ()

{

System.out.println("Device height = " + getHeight ());

System.out.println("Device width = " + getWidth());

System.out.println("Pointer events = " + hasPointerEvents());

System, out. printl'n ("Pointer motion events = " +

hasPointerMotionEvents());

System.cue.println("Repeat events = " + hasRepeatEvents());

}

}

Чтобы убедиться, что в Canvas все еще осуществима обработка высокоуровневых команд, запустите MID-лет, показанный в листинге 6.2. Вы увидите, что дисплей, показанный на рисунке 6.2, имеет экранную клавишу Exit (Выход), которая при активации завершает работу МID-лета.



Рисунок 6.2. Canvas все еще может выполнять обработку команд. Он может быть источником командных событий, которые реализация поставляет в зарегистрированный блок прослушивания команд


Содержание раздела