|
Pers.narod.ru. Тексты. Java2ME. С формы на канву и обратно... |
Взаимодействие формы и канвы в приложении на мобильной яве. Листинг примера
Пишет Vitalya" (vital_ok_[DOG]mail.ru):
Здравствуйте! Снова обращаюсь к Вам... по JAVA2ME. Не могли бы вы, в
качестве примера(желательно с пояснениями) прислать исходник следующего
содержания: В Form два TextField имеются три переменных double a,b,d; d=a+b;
После нажатия кнопки OK на Canvas необходимо вывести a=... b=...
d=...
После просмотра данных при нажатии на любую кнопку вернуться в Form.
Трудности вызывает работа с Canvas особенно клавиши.
Буду очень признателен
если Вы найдете время помочь.
Ниже показан листинг приложения, состоящего из 2 классов - midlet.java управляет главной формой приложения, canvas.java - это графическая канва, создаваемая из мидлета.
Проект компилируется в "базовой" Java 2ME (MIDP1.0/CLDC1.0)
import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.*;
public class midlet extends MIDlet implements CommandListener {
//мидлет является "слушателем" команд
public Command exitCommand,calcCommand;
private Display display;
private Form f;
private TextField ka,kb;
private canvas canvas;
int a,b;
public midlet () {
//конструктор всего мидлета
display = Display.getDisplay (this); //получили дисплей
exitCommand = new Command("Exit", Command.EXIT, 1);
calcCommand = new Command("Calc", Command.OK, 1); //создали кнопки
}
public void startApp() { //запуск мидлета
f = new Form ("Demo"); //создали главную форму
f.addCommand(exitCommand);
f.addCommand(calcCommand);
//добавили на нее кнопки
ka=new TextField ("Input A","",3,TextField.NUMERIC);
kb=new TextField ("Input B","",3,TextField.NUMERIC);
f.append (ka);
f.append (kb);
//и поля ввода
f.setCommandListener(this);
//сделали форму слушателем команд
display.setCurrent(f);
//установили дисплей
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
public void commandAction (Command cc, Displayable dd) {
if (cc == exitCommand) { //обработка кнопки Выход
destroyApp(false);
notifyDestroyed();
}
else if (cc == calcCommand) { //обработка кнопки Calc
try { //Пытаемся получить целые числа из формы
a=Integer.parseInt (ka.getString().trim());
b=Integer.parseInt (kb.getString().trim());
}
catch (NumberFormatException e) {
//Если не удалось - показать системый Alert с ошибкой и выйти
display.setCurrent (new Alert ("Ошибка","Неверный ввод!",
null,AlertType.INFO),display.getCurrent());
return;
}
//Вызываем конструктор для создания канвы:
canvas canvas = new canvas (this,a,b);
//Ставим дисплей на канву:
display.setCurrent(canvas);
}
}
}import javax.microedition.lcdui.*;
class canvas extends Canvas implements CommandListener {
//Класс является и канвой, и слушателем команд
public midlet midlet;
private Command cmdExit = new Command("Назад", Command.EXIT, 1);
private Display dpy;
private Displayable prev;
int a,b;
public canvas (midlet midlet,int a,int b) {
//Конструктор канвы с 3 параметрами
super (); //на всякий случай - сначала конструктор суперкласса
this.midlet = midlet; //ссылка на мидлет еще пригодится
this.a = a; //параметры сохраняем в глобальных переменных
this.b = b;
dpy = Display.getDisplay(midlet); //получаем дисплей у мидлета
prev = dpy.getCurrent(); //и запоминаем его состояние
addCommand(cmdExit); //добавляем команду на канвы
setCommandListener (this); //делаем канву слушателем команд
}
protected void paint(Graphics g) {
//метод paint - всегда вызывается для отрисовки
//очищаем экран:
g.setColor(0xffffffff);
g.fillRect(0,0,g.getClipWidth(),g.getClipHeight());
//и печатаем строку:
g.setColor (0xff0000);
int c=a+b;
g.drawString("A+B="+c,0,0,Graphics.LEFT|Graphics.TOP);
}
public void keyPressed(int keyCode) { //реакиця канвы на клавиши
switch (keyCode) {
case Canvas.KEY_STAR: //По '*' - вернуться назад,
dpy.setCurrent (prev); //то есть, восстановить состояние дисплея
break;
}
}
public void commandAction(Command c, Displayable d) {
//реакция канвы на команды меню
if (c==cmdExit) {
dpy.setCurrent (prev); //сделать то же по выбору команды
}
}
}Для вещественных чисел конвертирование будет выполняться через Float.parseFloat, а компилировать мидлет придется в профиле MIDP2.0/CLDC1.1
Следует также заметить, что при сложной отрисовке на канве лучше работать с графикой из отдельного потока (Thread).
|
|