Вниз  Java-программирование (1-ые посты)
- 28.11.2014 / 16:55
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Offline
Цитата RblSb:
Проблема в том, что я не знаю как остановить исполнение кода в меню
Ты же совсем не про это спрашивал, а про CommandListener? Два разных вопроса, имхо.
При переходе на другой экран, "выполнение кода" в меню и так прекращается, только поток на паузу поставь (там флаг поставь в цикл).
__________________
 let live

Изменено aNNiMON (28.11 / 16:56) (всего 1 раз)
- 28.11.2014 / 17:00
RblSb
  Пользователь

RblSb 
Сейчас: Offline
aNNiMON, так и делаю

l.run=false; //флаг для run() на отрисовку в цикле
t.interrupt(); //теперь можно завершить поток
new WriteText().text(1,"Ширина карты",""+Map.mapx,3,TextField.NUMERIC); //текстбокс
selectmenu(screen); //обновление текста меню, по идее должно происходить после выхода из текстбокса, но судя по отладке происходит сразу после перехода в текстбокс

именно поэтому решил делать обработку команд отдельно от CommandAction, ибо так реализовано в МП-исходнике.

Изменено RblSb (28.11 / 17:02) (всего 2 раза)
- 28.11.2014 / 17:02
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Offline
RblSb, кстати, анонимный класс тебе в помощь.

Вот вместо:
  1. new WriteText().text("Текст",""+Map.name,3,TextField.NUMERIC);
  2. Map.name=WriteText.gtext;

Можно написать:
  1. final TextBox textbox = new TextBox("Текст",""+Map.name,3,TextField.NUMERIC);
  2. textbox.addCommand(new Command("Назад",Command.BACK,2));
  3. textbox.addCommand(new Command("OK",Command.OK,1));
  4. textbox.setCommandListener(new CommandListener() {
  5.     public void commandAction(Command command,Displayable displayable) {
  6.         if (command == ok) {
  7.           Map.name = textbox.getString();
  8.         }
  9.         Main.display.setCurrent(backscreen);
  10.     }
  11. });
Ну и переключения экрана, остановка потока остаются в силе. Правда я хз, поможет ли это, зато от статического поля избавишься, Map.name будет напрямую изменяться по нажатию ok в текстбоксе.
__________________
 let live

Изменено aNNiMON (28.11 / 17:08) (всего 4 раза)
- 28.11.2014 / 17:08
RblSb
  Пользователь

RblSb 
Сейчас: Offline
aNNiMON, сударь, похоже на то что нужно, сейчас буду пробовать :) правда несколько многовато каждый вызов текстбокса писать нужно, но это после трех дней поиска инфы уже не волнует.
- 28.11.2014 / 17:09
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Offline
RblSb, я так понимаю, таких текстбоксов у тебя много? Можно, чтоб каждый раз не создавать новый текстбокс, использовать старый. В общем, подробнее с кодом распиши, поможем.
__________________
 let live

Изменено aNNiMON (28.11 / 17:10) (всего 1 раз)
- 28.11.2014 / 17:20
Naik
  Пользователь

Naik 
Сейчас: Offline
RblSb, ну какой еще "вызов текстбокса"? :gg: Достаточно приостановить поток канваса (флаг установить, можно даже не завершать поток, а пусть ганяет вхолостую пока ты вводишь что-то, например
  1. boolean input = false, run = true;
  2.  
  3. final TextBox textbox = new TextBox("Текст",""+Map.name,3,TextField.NUMERIC);
  4. textbox.addCommand(new Command("Назад",Command.BACK,2));
  5. textbox.addCommand(new Command("OK",Command.OK,1));
  6. textbox.setCommandListener(new CommandListener() {
  7.     public void commandAction(Command command,Displayable displayable) {
  8.         if (command == ok) {
  9.           Map.name = textbox.getString();
  10.         }
  11.         Main.display.setCurrent(MyMenuCanvas.this);
  12.         input = false;
  13.     }
  14. });
  15.  
  16.  
  17. public void run() {
  18.     while (run) {
  19.         if (input) { try { Thread.sleep(300); } catch (InterruptedException ex) {} continue; }
  20.         // А тут пошла отрисовка меню
  21.     }
  22. }
  23.  
  24. public void keyPressed(int keyCode) {
  25.     if (keyCode == 53) { input = true; Main.display.setCurrent(textbox); }
  26.     // ....
  27. }


Изменено Naik (28.11 / 17:22) (всего 2 раза)
- 28.11.2014 / 19:12
RblSb
  Пользователь

RblSb 
Сейчас: Offline
aNNiMON, сударь, нет, в общем получается не больше 4-ех в разных классах. А как можно твой код зациклить? То есть чтобы после закрытия одного текстбокса появлялся другой.
- 28.11.2014 / 19:14
Naik
  Пользователь

Naik 
Сейчас: Offline
RblSb, Зачем? Просто обрабатывать нажатие кнопки и очищать, Забудь про паскал, почитай про событийную модель интерфейса.
http://ru.m.wikipedia.org/wiki...ное_программирование

П.С. потоки зашиты в прошивку, тебе не нужно никаких потоков на формах, только обработчики событий.

Изменено Naik (28.11 / 19:20) (всего 3 раза)
- 28.11.2014 / 19:26
RblSb
  Пользователь

RblSb 
Сейчас: Offline
Naik, потому что мне нужно ввести два текста за одно нажатие, и цикл - самое простое решение. Хотя может в этом случае больше подойдет TextField, но он некрасивый гг.

Изменено RblSb (28.11 / 19:27) (всего 1 раз)
- 28.11.2014 / 19:28
Naik
  Пользователь

Naik 
Сейчас: Offline
RblSb, При первом нажатии кнопки Ок сохраняешь текст в строке 1, очищаешь поле, при втором сохраняешь в строке 2 и закрываешь. И хоть целый массив так заполняй

Изменено Naik (28.11 / 19:29) (всего 1 раз)
Наверх  Всего сообщений: 16875
Фильтровать сообщения
Поиск по теме
Файлы топика (794)