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).
гостевая; E-mail |