|
JAVA Micro Edition Низкоуровневое программирование мобильных телефонов. |
05.11.2008, 15:31
|
#1
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Получение команд в формах
Впервые решил использовать формы в Java, точнее TextBox. И у меня ни в какую не получается отловить нажатие команд. Смотрите. Я добавляю две команды com1 и com2. Они появляются под софтовыми клавишами. Отлавливаю в commandAction нажатую команду, сохраняю её в переменной. А после ТекстБокса делаю цикл:
while(com==null) Thread.sleep(80);
, где com - это переменная из commandAction. И цикл никогда не прерывается. Я, видимо, как-то жёстко не так делаю.
|
(Offline)
|
|
05.11.2008, 16:10
|
#2
|
Разработчик
Регистрация: 06.04.2008
Сообщений: 541
Написано 196 полезных сообщений (для 637 пользователей)
|
Ответ: Получение команд в формах
Не надо ничего сохранять в переменной. Просто в commandAction создаешь такие конструкции:
public void commandAction(Command c, Displayable d)
{
if (c==ExitMidlet)
{
//операторы
}
if (c==Ok)
{
//операторы
}
//и т. д.
}
|
Где ExitMidlet, Ok - имена твоих команд.
|
(Offline)
|
|
05.11.2008, 16:45
|
#3
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Получение команд в формах
Мля. Видел я такой пример. Не катит. Мне не нужно обрабатывать внутри commandAction. Хотя... Есть идея... Но это несколько криво будет...
|
(Offline)
|
|
05.11.2008, 18:58
|
#4
|
Модератор
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений (для 817 пользователей)
|
Ответ: Получение команд в формах
Посмотри, как это в MP реализовано, там же можно обрабатывать комманды за пределами commandAction.
|
(Offline)
|
|
05.11.2008, 20:04
|
#5
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Получение команд в формах
Я посмотрел. Там что-то очень странное и невнятное. И как я понял он там только одну команду обрабатывает. А если две? Или более? Ужос.
|
(Offline)
|
|
06.11.2008, 02:02
|
#6
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Получение команд в формах
Блин. Как только уже не пробовал. По всем показателям commandAction просто напросто не вызывается вообще! ТекстБокс вызывается, команды вырисовываются (две кнопки "Далее" и "Назад"), но при нажатии на них ничего не происходит. Версия, что мидлет зависает по какой-то причие после нажатия на командную кнопку, не имеет места, так как если убираю цикл ожидания нажатия, то программа выполняется дальше, просто ТекстБокс появляется и мгновенно исчезает. Памагите :'(
|
(Offline)
|
|
06.11.2008, 02:42
|
#7
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Получение команд в формах
Что-то мне сдаётся, что не работает setCommandListener. Он вообще для чего? Я просто по аналогии делал, всё вроде понятно, кроме этого метода. Но компилируется нормально.
|
(Offline)
|
|
06.11.2008, 08:18
|
#8
|
Модератор
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений (для 817 пользователей)
|
Ответ: Получение команд в формах
setCommandListener как раз и заставляет систему сделать активным обработчик commandAction указанного объекта.
|
(Offline)
|
|
06.11.2008, 14:37
|
#9
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Получение команд в формах
ViNT, вот! Я так и подумал! Видимо проблема в нём. commandAction не вызывается вообще. Может я setCommandListener как-то не так вызываю? Я ему передаю в качестве параметра экземпляр класса implements CommandListener. Блин. Я уже сутки не могу заставить обрабатываться команды.
- - -
Во всех примерах, что я видел, implements CommandListener делают главный класс мидлета. Это имеет значение? У меня отдельный класс для этого использован.
Последний раз редактировалось Phantom, 06.11.2008 в 14:54.
|
(Offline)
|
|
06.11.2008, 15:58
|
#10
|
Модератор
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений (для 817 пользователей)
|
Ответ: Получение команд в формах
Собственно, нужно указывать используемый в данный момент объект - отображаемую форму, Canvas и т.д.
|
(Offline)
|
|
06.11.2008, 16:07
|
#11
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Получение команд в формах
Не, я имею ввиду в скобочках круглых.
Я пишу так:
tb.setCommandListener(f);
, где:
tb - это ТекстБокс
f - это я не знаю как назвать правильно. Короче класс имеет вид:
public class functions implements CommandListener{ public static functions f; // вот она переменная f . . . {
Что же не так?
|
(Offline)
|
|
06.11.2008, 16:12
|
#12
|
Оптимист
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений (для 259 пользователей)
|
Ответ: Получение команд в формах
TextBox tx = new TextBox("", "", 10, 0);
tx.setCommandListener(объект класса, который implements CommandListener);
ну и в том классе
public void commandAction(Coomand c, Displayable d){
if(d==tx){....}
|
(Offline)
|
|
06.11.2008, 16:15
|
#13
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Получение команд в формах
Так. Напишу-ка я собственно всё:
import javax.microedition.lcdui.*; public class functions implements CommandListener{ // *********************************** public static functions f; public static Command com1; public static Command com2; public static Display d; public static Displayable cd; public static int com; // *********************************** public void commandAction(Command c,Displayable d){ if(c==com1) com=1; else if(c==com2) com=2; else com=3; a.a.destroyApp(true); // Это временно воткнул, чтобы узнать, когда же наконец этот метод вызовется! } // *********************************** public static String textbox(String title,int size,int o) throws Exception{ String s=null; com=0; TextBox tb=new TextBox(title,"",size,o); d.setCurrent(tb); com1=new Command("Ok",Command.OK,1); com2=new Command("Назад",Command.BACK,2); tb.addCommand(com1); tb.addCommand(com2); tb.setCommandListener(f); c.repaint(); c.serviceRepaints(); while(com==0) Thread.sleep(80); if(com==1) s=tb.getString(); d.setCurrent(c); return s; } // *********************************** }
По моей логике работать это должно так:
Из класса, в котором выполняется основная часть программы будет вызываться метод functions.textbox(), который должен вывести на экран ТекстБокс, ожидать пока пользователь введёт в него что-нибудь, потом нажмёт одну из двух командных клавиш: "Ok" и "Назад". При нажатии "Ok" метод должен возвратить текст, набранный в ТекстБоксе, при нажатии "Назад" метод должен возвратить null. Кроме того ТекстБокс должен переключиться обратно в канвас. Вот. Возможно криво объяснил, так как терминалогия Java у меня до сих пор подхрамывает.
|
(Offline)
|
|
06.11.2008, 18:48
|
#14
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Получение команд в формах
Сделал implements CommandListener главный класс мидлета и всё заработало... Идиотизм какой-то... Где связь?
|
(Offline)
|
|
06.11.2008, 20:17
|
#15
|
Оптимист
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений (для 259 пользователей)
|
Ответ: Получение команд в формах
c.repaint();
c.serviceRepaints();
while(com==0) Thread.sleep(80);
if(com==1) s=tb.getString();
вот это прошу прощения, полный идиотизм с точки зрения программирования. Java - объектный язык и обработка событий нормальный способ взаимодействия.
скажите зачем системе в цикле проверять com==1? если при нажатии "ОК" мы просто начнем выполнять код?
Не идите на поводу методики МР, она во многом ущербна из-за желания автора упростить язык.
public class Main extends MIDlet implements CommandListener{
public static Display display;
public static TextBox tb;
public Command cmdOK = new Command("OK", Command.OK, 0);
public Command cmdBack = new Command("Назад", Command.BACK, 0);
public void startApp() {
display = Display.getDisplay(this);
display.setCurrent(tb = new TextBox("Введите", null, 50, TextField.ANY));
tb.addCommand(cmdOK);
tb.addCommand(cmdBack);
tb.setCommandListener(this);
}
public void commandAction(Command c, Displayable d) {
if(d==tb && c == cmdOK)
display.setCurrent(new Form("Вы ввели", new Item[] {new StringItem("Введено", tb.getString())}));
}
примерно так.
Последний раз редактировалось Piligrim, 06.11.2008 в 20:35.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:32.
|