БлогNot. С формы на канву и обратно...

С формы на канву и обратно...

Взаимодействие формы и канвы в приложении на мобильной яве. Листинг примера

Пишет 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)

Файл midlet.java
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);
  }
 }
    
}
Файл canvas.java
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).

 Статья отправлена на постоянное хранение

05.03.2009, 11:07 [10112 просмотров]


теги: программирование графика java2me

К этой статье пока нет комментариев, Ваш будет первым