Модераторы: javastic, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не срабатывают команды, назад и выход! 
V
    Опции темы
Цербер
Дата 30.7.2009, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 333
Регистрация: 21.11.2007

Репутация: 1
Всего: 1



Стал частым гостем этой ветке на форуме  smile 
Доброе время суток форумчане!
Сделал небольшое приложение, нарисовал меню в canvas и при переходах, просто текст в форме, но почему то не срабатывают команды назад и выход.
тут есть решение, но оно мне не помогло  smile, но с помощью этого примера смог реализовать переход с меню на следующий экран, а то голову сломал, не получалось, теперь загвостка в коммандах выхода и возврата.
Вот собственно код:
Код

package tcity;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class Tcity extends MIDlet implements CommandListener{

  private Display display;
  private static Tcity instance;
  private Form form = new Form("Form");
  private Command exitCommand = new Command("Выход", Command.EXIT, 0);
  private Command backCommand = new Command("Назад", Command.BACK, 1);
  mendraw m = new mendraw(); //Создание подкласса mendraw
 
public static Tcity getInstance() {
    if(instance==null) {
        instance = new Tcity();
    }
    return instance;
  }

  public void startApp() {
    instance = this;
    display = Display.getDisplay(this);
    display.setCurrent(m); // Сразу после загрузки мидлета переходит на класс mendraw
  }

  public void commandAction(Command c, Displayable d) {
    if(c==exitCommand) {
        destroyApp(true);
    }
  }

  public void showKey(int key) {
    if(key==1) {
        form.append("Это справочник");
    }
    else if (key==2) {
        form.append("Это помощь");
    }
    else if (key==3) {
        form.append("Это bookmarks");
    }
    else {
        destroyApp(true);
    }
    form.addCommand(exitCommand);
    form.addCommand(backCommand);
    display.getDisplay(this);
    display.setCurrent(form);
  }

  public void pauseApp() {}

  public void destroyApp(boolean _boolean) {
    notifyDestroyed();
  }
}



и канвас

Код

package tcity;

import javax.microedition.lcdui.*;

class mendraw extends Canvas{ 
    int index = 1; // Индекс выделенной кнопочки
    int heightScreen, widthScreen; // Берут разрешение экрана
    int xPosition; // Позиция "x" рисования меню
    int yPosition; // Позиция "y" рисования меню
    int stepY = 30;
    int columnH = 20;
    int fontSize = 20;
    int paddingStr = 2;
    
    public void paint(Graphics g) {
      heightScreen = g.getClipHeight(); //Определяем высоту окна
      widthScreen = g.getClipWidth(); //Определяем ширину окна
      xPosition = widthScreen/2;
      yPosition = heightScreen/5;

      if(heightScreen < (stepY*3+columnH*4)) {
        stepY = 16;
        columnH = 16;
        paddingStr = 1;
      }

      g.setColor(255, 255, 255); // Задаем цвет прямоугольника
      g.fillRect(0, 0, 300, 300); //Заливаем прямоугольник

      g.setColor(55, 60, 62);
      g.drawString("Справочник", xPosition, yPosition + paddingStr, g.TOP | g.HCENTER); // Рисуем первую строку меню
      g.drawString("Помощь", xPosition, yPosition + stepY + paddingStr, g.TOP | g.HCENTER); // Рисуем второю строку меню
      g.drawString("Закладки", xPosition, yPosition + stepY * 2 + paddingStr, g.TOP | g.HCENTER); // Рисуем третью строку меню
      g.drawString("Выход" , xPosition, yPosition + stepY * 3 + paddingStr, g.TOP | g.HCENTER); // Рисуем третью строку меню

      if (index == 1) { // Если индекс равен 1
        g.setColor(142, 199, 54);
        g.fillRect(0, yPosition, widthScreen, columnH); //Заливаем прямоугольник №1
        g.setColor(55, 60, 62);
        g.drawString("Справочник", xPosition, yPosition + paddingStr, g.TOP | g.HCENTER); // Рисуем первую строку меню
      }
      if (index == 2) { // Если индекс равен 2
        g.setColor(142, 199, 54);
        g.fillRect(0, yPosition +  stepY, widthScreen, columnH); //Заливаем прямоугольник№2
        g.setColor(55, 60, 62);
        g.drawString("Помощь", xPosition, yPosition + stepY + paddingStr, g.TOP | g.HCENTER); // Рисуем первую строку меню
      }

      if (index == 3) { // Если индекс равен 3
        g.setColor(142, 199, 54);
        g.fillRect(0, yPosition +  stepY*2, widthScreen, columnH); //Заливаем прямоугольник №3
        g.setColor(55, 60, 62);
        g.drawString("Закладки", xPosition, yPosition + stepY*2 + paddingStr, g.TOP | g.HCENTER); // Рисуем первую строку меню

      }
      if (index == 4) { // Если индекс равен 4
        g.setColor(142, 199, 54);
        g.fillRect(0, yPosition +  stepY*3, widthScreen, 20); //Заливаем прямоугольник №3
        g.setColor(55, 60, 62);
        g.drawString("Выход", xPosition, yPosition + stepY*3 + paddingStr, g.TOP | g.HCENTER); // Рисуем первую строку меню

      }
    }

    public void keyPressed(int KeyCode) {
      int press = KeyCode; //Заносим в переменную код нажатой кнопки
      //System.out.println("Вы нажали на кнопочку: " + press);
      
      if (press == -5 || press == 53 || press==20) { //Усли нажата кнопка OK
        Tcity.getInstance().showKey(index);
      }

      if (press == -2 || press == 56 || press==6) { //Усли нажата кнопка DOWN
        if (index > 3) {
          index = 1;
        }
        else {
          index++; // Перемещаем прямоугольники вниз
        }
        repaint(); //Прорисовываем изменения
      }
      if (press == -1 || press == 50 || press==1) { //Если нажата кнопка UP
        if (index < 2) {
          index = 4;
        }
        else {
          index--; // Перемещаем прямоугольники вверх
        }
        repaint(); //Прорисовываем изменения
      }
    }
   
  }

Ещё есть вопрос о разных кодах клавиш, но для этого создам отдельную тему!
PM MAIL ICQ   Вверх
hamsterKSU
Дата 30.7.2009, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 401
Регистрация: 20.10.2006
Где: Украина, Херсон

Репутация: 7
Всего: 11



помоему не установлен comand listener

Добавлено через 7 минут и 17 секунд
там где 
form.addCommand(exitCommand);
form.addCommand(backCommand);

нехватает 
form.setCommandListener(this);
PM MAIL ICQ   Вверх
hamsterKSU
Дата 30.7.2009, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 401
Регистрация: 20.10.2006
Где: Украина, Херсон

Репутация: 7
Всего: 11



немного замечаний, не сочтите занудой, то что бросаеться сразу в глаза
1) не называйте класы с маленькой буквы. Только с большой
2)Повторяющиеся куски кода выносите в методы
вот например 
Код

g.setColor(142, 199, 54);
g.fillRect(0, yPosition, widthScreen, columnH); 
g.setColor(55, 60, 62);
g.drawString("Справочник", xPosition, yPosition + paddingStr,
g.TOP | g.HCENTER); 


можно заменить на
Код

 drawLabel(g, 0x00ff00, 0xff0000, "Справочник", xPosition, yPosition, widthScreen, columnH, paddingStr);

где 
Код

private void drawLabel(Graphics g, int bgColor, int titleColor, String title, int xPos, int yPos, int width, int height, int paddingLeft){
            g.setColor(bgColor);
            g.fillRect(0, yPos, width, height);
            g.setColor(titleColor);
            g.drawString(title, xPos, yPos + paddingLeft, Graphics.TOP | Graphics.HCENTER); 
        }

3) к статическим переменным надо обоащаться через имя класса, а не переменную у ва было g.TOP - лучше Graphics.TOP. 
4) есть конструкция switch вместо кучки ваших if - но это дело вкуса smile

Это сообщение отредактировал(а) hamsterKSU - 30.7.2009, 19:20
PM MAIL ICQ   Вверх
Цербер
Дата 31.7.2009, 07:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 333
Регистрация: 21.11.2007

Репутация: 1
Всего: 1



hamsterKSU вот блин моя не внимательность, конечно же команд листенер, не углядел, буду внимательней. Спасибо большое!

Цитата

1) не называйте класы с маленькой буквы. Только с большой
2)Повторяющиеся куски кода выносите в методы

Угу такого стиля и придерживаюсь, просто класс канвас я взял здесь на форуме, который был представлен для примера графического меню, а я его ещё не оптимизировал

Цитата

3) к статическим переменным надо обоащаться через имя класса, а не переменную у ва было g.TOP - лучше Graphics.TOP. 

не знал, возьму на заметку.



PM MAIL ICQ   Вверх
Цербер
Дата 31.7.2009, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 333
Регистрация: 21.11.2007

Репутация: 1
Всего: 1



hamsterKSU тут появилась ещё одна грабля, когда переходишь по разделам, то прежние результаты не очищаются, т.е. если перешёл в раздел "справочник", он добавил в форму справочник, вышел перешёл в "помощь", отображается строка "это справочник это помощь".
Как очистить прежний результат отображения??
PM MAIL ICQ   Вверх
hamsterKSU
Дата 31.7.2009, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 401
Регистрация: 20.10.2006
Где: Украина, Херсон

Репутация: 7
Всего: 11



либо пересоздавать скрин куда идешь - в твоем случае это форма. либо делать  form.deleteAll()
PM MAIL ICQ   Вверх
Цербер
Дата 31.7.2009, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 333
Регистрация: 21.11.2007

Репутация: 1
Всего: 1



hamsterKSU я пробовал deleteAll();
везде куда можно вставлял, ошибку выдаёт 
Код

cannot find symbol
symbol  : method deleteAll()
location: class javax.microedition.lcdui.Form
    form.deleteAll();
1 error

я вставлял и в код где происходит обработка команды back и в метод showKey и в startApp, но он ругается =(

Цитата

либо пересоздавать скрин куда идешь - в твоем случае это форма

это как?
PM MAIL ICQ   Вверх
W0LF
Дата 31.7.2009, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



почитать джавадок по Form.
Цитата

 void  deleteAll()
          Deletes all the items from this Form, leaving it with zero items.
delete(int itemNum)
          Deletes the Item referenced by itemNum.
 void  set(int itemNum, Item item)
          Sets the item referenced by itemNum to the specified item, replacing the previous item.

выбирайте как Вам больше понравится

Добавлено через 47 секунд
упс, опоздал малость =)

Добавлено через 5 минут и 30 секунд
Цитата(Цербер @  31.7.2009,  13:12 Найти цитируемый пост)
это как? 

это сделать свой класс, унаследовать его от формы, а потом вместо формы использовать его, при чем можно не пересоздавая, а добавить в него методы show() и hide() и в них делать все что нужно.
Цитата(Цербер @  31.7.2009,  13:12 Найти цитируемый пост)
cannot find symbol
symbol  : method deleteAll()
location: class javax.microedition.lcdui.Form
    form.deleteAll();
1 error

это как-то очень странно
Form javadoc


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
Цербер
Дата 31.7.2009, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 333
Регистрация: 21.11.2007

Репутация: 1
Всего: 1



W0LF, hamsterKSU забыл указать что использую MIDP 1.0 - поэтому deleteAll() не работает, в доках написано что со 2 версии работает.

Добавлено через 51 секунду
Цитата

это сделать свой класс, унаследовать его от формы, а потом вместо формы использовать его, при чем можно не пересоздавая, а добавить в него методы show() и hide() и в них делать все что нужно.

попробую так =)

Добавлено через 4 минуты и 59 секунд
Хм щас понял что я не понял до конца как это сделать? Можете небольшой пример привести?
PM MAIL ICQ   Вверх
W0LF
Дата 31.7.2009, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



Код

class MyFormManual extends Form  implements CommandListener{
    public MyFormManual(String title) {
    
        super(title);
        append("Это справочник");
        addCommand(exitCommand);
        addCommand(backCommand);
        setCommandListener(this);
    }
    /**
     *   for MIDP 1.0
     */ 
    public void deleteAll() {
         for (int i = 0; i < size(); i++ ) {
              delete(i); 
         }
    }


    public void commandAction(Command c, Displayable d) {
    if(c==exitCommand) {
        destroyApp(true);
    }
  }
//теперь в Вашем методе
public void showKey(int key) {
    Display display = Display.getDisplay(this);
    if(key==1) {
        display.setCurrent(new MyFormManual());
    }
    else if (key==2) {
        display.setCurrent(new MyFormHelp());
    }
    else if (key==3) {
        display.setCurrent(new MyFormBookmark());
    }
    else {
        destroyApp(true);
    }
    
  } 

}

теперь у вас каждая форма - отдельный класс-вьювер, в котором по совместительству находится контроллер - CommandListener и теперь вы в каждой вьюхе можете задавать ее поведение, не надо нагромождать общий класс мидлета. Больше кода - оптимизация по гибкости но не по скорости. Но это не всегда значит что больше кода вызывает оптимизацию по гибкости =)


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
Цербер
Дата 31.7.2009, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 333
Регистрация: 21.11.2007

Репутация: 1
Всего: 1



W0LF ок пасиба=) буду разбираться!
PM MAIL ICQ   Вверх
Цербер
Дата 1.8.2009, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 333
Регистрация: 21.11.2007

Репутация: 1
Всего: 1



W0LF то что надо! спасибо!  smile 
PM MAIL ICQ   Вверх
math64
Дата 2.8.2009, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Толко код для deleteAll:
Код

    public void deleteAll() {
         while (size() > 0) {
              delete(0); 
         }
    }

При использовании for изменяется size() и for удалит не всё.
PM   Вверх
W0LF
Дата 2.8.2009, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



да, недоглядел...


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
Цербер
Дата 3.8.2009, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 333
Регистрация: 21.11.2007

Репутация: 1
Всего: 1



math64 пасиба за подсказку, уже поправил!
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.0607 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.