![]() |
Получение команд в формах
Впервые решил использовать формы в Java, точнее TextBox. И у меня ни в какую не получается отловить нажатие команд. Смотрите. Я добавляю две команды com1 и com2. Они появляются под софтовыми клавишами. Отлавливаю в commandAction нажатую команду, сохраняю её в переменной. А после ТекстБокса делаю цикл:
while(com==null) Thread.sleep(80); , где com - это переменная из commandAction. И цикл никогда не прерывается. Я, видимо, как-то жёстко не так делаю. |
Ответ: Получение команд в формах
Не надо ничего сохранять в переменной. Просто в commandAction создаешь такие конструкции:
Цитата:
|
Ответ: Получение команд в формах
Мля. Видел я такой пример. Не катит. Мне не нужно обрабатывать внутри commandAction. Хотя... Есть идея... Но это несколько криво будет...
|
Ответ: Получение команд в формах
Посмотри, как это в MP реализовано, там же можно обрабатывать комманды за пределами commandAction.
|
Ответ: Получение команд в формах
Я посмотрел. Там что-то очень странное и невнятное. И как я понял он там только одну команду обрабатывает. А если две? Или более? Ужос.
|
Ответ: Получение команд в формах
Блин. Как только уже не пробовал. По всем показателям commandAction просто напросто не вызывается вообще! ТекстБокс вызывается, команды вырисовываются (две кнопки "Далее" и "Назад"), но при нажатии на них ничего не происходит. Версия, что мидлет зависает по какой-то причие после нажатия на командную кнопку, не имеет места, так как если убираю цикл ожидания нажатия, то программа выполняется дальше, просто ТекстБокс появляется и мгновенно исчезает. Памагите :'(
|
Ответ: Получение команд в формах
Что-то мне сдаётся, что не работает setCommandListener. Он вообще для чего? Я просто по аналогии делал, всё вроде понятно, кроме этого метода. Но компилируется нормально.
|
Ответ: Получение команд в формах
setCommandListener как раз и заставляет систему сделать активным обработчик commandAction указанного объекта.
|
Ответ: Получение команд в формах
ViNT, вот! Я так и подумал! Видимо проблема в нём. commandAction не вызывается вообще. Может я setCommandListener как-то не так вызываю? Я ему передаю в качестве параметра экземпляр класса implements CommandListener. Блин. Я уже сутки не могу заставить обрабатываться команды.
- - - Во всех примерах, что я видел, implements CommandListener делают главный класс мидлета. Это имеет значение? У меня отдельный класс для этого использован. |
Ответ: Получение команд в формах
Собственно, нужно указывать используемый в данный момент объект - отображаемую форму, Canvas и т.д.
|
Ответ: Получение команд в формах
Не, я имею ввиду в скобочках круглых.
Я пишу так: PHP код:
tb - это ТекстБокс f - это я не знаю как назвать правильно. Короче класс имеет вид: PHP код:
|
Ответ: Получение команд в формах
Код:
TextBox tx = new TextBox("", "", 10, 0); Код:
public void commandAction(Coomand c, Displayable d){ |
Ответ: Получение команд в формах
Так. Напишу-ка я собственно всё:
PHP код:
Из класса, в котором выполняется основная часть программы будет вызываться метод functions.textbox(), который должен вывести на экран ТекстБокс, ожидать пока пользователь введёт в него что-нибудь, потом нажмёт одну из двух командных клавиш: "Ok" и "Назад". При нажатии "Ok" метод должен возвратить текст, набранный в ТекстБоксе, при нажатии "Назад" метод должен возвратить null. Кроме того ТекстБокс должен переключиться обратно в канвас. Вот. Возможно криво объяснил, так как терминалогия Java у меня до сих пор подхрамывает. |
Ответ: Получение команд в формах
Сделал implements CommandListener главный класс мидлета и всё заработало... Идиотизм какой-то... Где связь?
|
Ответ: Получение команд в формах
Код:
c.repaint(); скажите зачем системе в цикле проверять com==1? если при нажатии "ОК" мы просто начнем выполнять код? Не идите на поводу методики МР, она во многом ущербна из-за желания автора упростить язык. Код:
public class Main extends MIDlet implements CommandListener{ |
Ответ: Получение команд в формах
Ну это я там уже лишнего наворотил в попытках заставить всё это работать. Проблемы так таковые две:
1) У меня commandAction вообще не вызывался, пока я не перенёс его в главный класс мидлета. Вот где тут связь - вообще не представляю. 2) А обрабатывать нажатие клавиш мне надо в основном цикле программы, а не в отдельном методе, поэтому я и получаю нажатые команды в переменную, а после их сравниваю. По мне, так в данном случае это оптимальный вариант. |
Ответ: Получение команд в формах
1. Такое чувство, что просто переменную забыли проинициализировать, вот и не вызывается.
2. В яве нет понятия основной цикл программы, как и в Дельфи. Это событийная среда. Ну да дело ваше. |
Ответ: Получение команд в формах
Ну вот не могу я въехать в ООП... :'(
|
Ответ: Получение команд в формах
Цитата:
|
Ответ: Получение команд в формах
Ладно, буду исправляться. =)
- - - Только вот понять не могу. Ну вот есть классы в программе. Каждый класс представляет свой тип данных, которым можно крутить вертеть при помощи методов, объявленных внутри. Но ведь по-любому сама программа не может выполняться путём цепочки методов, где первый метод вызывает второй, тот вызывает третий и так далее. Должна быть основная часть программы, которая всем этим рулить будет. В интернете сколько читал про ООП, ничего про это не видел. Везде только и пишут, что в ООП классы надо представлять как ящики, о внутренностях которых ничего не известно, но из него торчат проводки (методы), которыми он может взаимодействовать с другими ящиками. То есть получается, что у меня есть куча ящиков, но нет распределительного пульта управления. По мне так это то же самое, если бы я в процедурном языке написал кучу функций, но не имел возможности написать основную часть программы, которая будет вызывать эти функции. - - - Растолкуйте плиз. |
Ответ: Получение команд в формах
А ещё такй вопрос. А если создать в программе два класса implements CommandListener, то что будет? Они оба будут на команды одновременно реагировать? Или вообще не скомпилируется такая программа?
|
Ответ: Получение команд в формах
Цитата:
|
Ответ: Получение команд в формах
CommandListener может быть сколько угодно, активным, т.е. тем которому передаются команды, считается тот, который установлен с помощью setCommandListener объекта на экране.
Зачем нужен условнобесконечный цикл если система всё делает сама. Зачем ждать в нём результата ввода в TextBox если мы в обязательно попадём в commandAction? Обрабатываем в нём рекцию и всё! Система сама будет ждать следующую команду или просто клавишу если это Canvas. Программа завершится только если вызвать destroyApp(true); notifyDestroyed(); Напишу пример, чуть позже. |
Ответ: Получение команд в формах
Цитата:
pilgrim, + 1000000!!! |
Ответ: Получение команд в формах
Так, а это, какие ещё события есть в J2me? Нажатие/отпускание клавиш в канвасе, нажатие команд в формах, startApp, pauseApp, destroyApp... Что ещё такое полезное есть?
|
Ответ: Получение команд в формах
Ещё вот что интересное заметил. Ведь если в классе есть метод, который называется также, как и сам класс, то он автоматически вызывается при инициализации (ну или как правильно сказать) класса? Я вот сколько смотрел примеров создания простого приложения про это ничего сказано не было. Везде пишут, что первым вызывается startApp(). А вот фиг. Я проверил экспериментально. Если в классе есть метод с таким же названием, как и сам класс, то при запуске мидлета сначала вызывается он, а потом уже startApp(). У меня такой вопрос: этот метод будет вызываться только при первом запуске приложения или всегда перед startApp()? Если только при первом запуске приложения, то почему нигде не написано, что туда можно вынести код инициализации приложения? Почему пишут, что его надо в startApp() засовывать с проверкой не инициилизирован ли до сей поры ещё мидлет? Хотя с другой стороны, если, например главный класс имеет название a.class, и я в другом классе сделаю экземпляр (или это назвается объект-наследник?) этого класса:
PHP код:
PHP код:
|
Ответ: Получение команд в формах
Цитата:
Допустим есть класс PHP код:
PHP код:
|
Ответ: Получение команд в формах
Ну я это и имел ввиду! Но почему же везде пишут, что код инициализации главного класса надо в startApp() засовывать? Примерно так:
PHP код:
|
Ответ: Получение команд в формах
Ещё вот не понимаю логики. В мидлет паскалевских классах.
1) Зачем создаётся объект Image размером в экран телефона? 2) Почему потом через этот Image получается Graphics при помощи getGraphics()? 3) Почему метод paint() в классе, который extends Canvas, отрисовывает этот Image на дисплей? 4) И при каких условиях вызывается paint? Я так понимаю, что в этот Image размером с экран телефона отрисовывается всё, что я рисую на канвасе (текст, изображения, фигуры всякие), а при вызове repaint вызывается paint (где-то я читал, что он иногда может вызваться не сразу после вызова repaint, а когда ему будет хватать процессорных ресурсов, если запущенно много потоков, например), который как раз отрисовывает на экране телефона этот Image, в который мы до этого рисовали. Поправте, плиз, если я что-то не так говорю =) То есть я могу даже создать несколько таких картинок, создать для каждой свой Graphics и в каждый по очереди нарисовать что-то? А как потом подсунуть нужный Graphics в paint? Или нельзя держать одновременно несколько Graphics'ов в памяти? Блин, если всё, что я написал выше, не полная чушь, то я кажется начинаю глобально вникать в тему! =) |
Ответ: Получение команд в формах
Я ради теста создал два имэджа размером с экран мобилы, создал два графикса, отрисовал в каждый разные картинки. Вызываю repaint после отрисовки первого и после второго. Второй не отрисовывается, только первый. В paint в качестве параметра передаётся какой-то Графикс. Как система решает какой из них передать?
- - - Чуть позже: Ой блин, жёстко ступил. Я в обоих случаях в paint отрисовывал первый Image =) А какой там Графикс - это по ходу вообще не важно, paint ведь сразу на экран телефона рисует, верно? То есть это, как я понимаю, Графикс самого экрана видимо. Верно? |
Ответ: Получение команд в формах
Админы, сорри, я тут не по теме наоффтопил :@ , можно это перенести в отдельную тему, например, в раздел FAQ. Может кому-то пригодится. Зайдёт кто-нибудь, кто нифига не понимает в Java, почитает и может чего-то новое узнает =)
|
Ответ: Получение команд в формах
Ещё такой вопрос. Как мне вызвать destroyApp() из какого-нибудь класса, если я не знаю заранее имя главного класса мидлета? Можно сделать метод, который нужно будет вызывать из главного класса примерно так:
PHP код:
PHP код:
|
Ответ: Получение команд в формах
Ух я дорвался. Вот ещё что непонятно.
Почему такая запись работает: PHP код:
PHP код:
|
Ответ: Получение команд в формах
возможно у строки определен оператор (или конструктор) преобразования в строку из указателя на строку (это второй вариант)
|
Ответ: Получение команд в формах
Ээээ... А по-ламерски можно, а то я не понял? =)
|
Ответ: Получение команд в формах
читай что такое указатель
|
Ответ: Получение команд в формах
Ну я читал как-то давно, когда пытался учить С++. Указатель - это типа переменная, которая содержит в себе адрес другой переменной. Его можно использовать вместо самой переменной. (правда я тогда так и не понял нафига он нужен). А что, в Джаве тоже указатели есть?
Это слишком что-то заумное: "возможно у строки определен оператор (или конструктор) преобразования в строку из указателя на строку (это второй вариант)" |
Ответ: Получение команд в формах
public static coolclass midlet;
так будет правильней. и лучше в startApp midlet=this; тогда из любого класса coolclass.midlet.destryApp(true); |
Ответ: Получение команд в формах
Image создается, чтобы в МР в любом месте работал drawText и т.д. Graphics экрана известен только в paint, а он из МР недоступен. Отрисовка возможна только на Graphics а чей он, экрана или Image системе всё равно.
paint вызывается после setCurrent, при любых изменениях размера ( например setFullScreen), принудительно после repaint, после возвращения мидлета из паузы. Примерно так. |
Ответ: Получение команд в формах
Цитата:
Цитата:
|
Ответ: Получение команд в формах
Круто. Я просто рад до ж#%ы!!! Всё так легко стало получаться. Ща переделываю предыдущий проект =) Выкинул целую кучу ненужной фигни!!! Вместо условно бесконечного цикла перенёс всё в keyPressed(), теперь перерисовка экрана происходит только при нажатии на кнопку, а не постоянно =))) Мне только и нужно, чтобы экран перерисовывался только при каком-то действии пользователя, там в основном менюшки. Вот только сейчас даже не знаю как лучше сделать иерархию меню. Ну да ладно, что-нибудь придумаю! Всем огромное спасибо!!!
|
Ответ: Получение команд в формах
Цитата:
тогда Main.instance.destroyApp() будет работать всегда :) |
Ответ: Получение команд в формах
Не, никто не мешает =) Так и делаю. Только у меня главный класс всегда называется a.class, а класс, который наследник канваса (ну или как там оно правильно говорится) - b.class. =)
|
Ответ: Получение команд в формах
Цитата:
|
Ответ: Получение команд в формах
ViNT, нуу... :@ Фиг его знает... Краткость - сестра таланта. Меня вообще некоторые ходячим обфускатором называют, потому что логику в названиях моих переменных только я вижу :-D Привык всё делать так, уж не знаю почему. :dontknow: Да и тем более я так и не понял, как пользоваться Proguard'ом, уже и Хэлп перелистал и как только не пробовал, всё время пишет, что не может найти Мэйн класс. Так что пусть хотя бы так запутано будет :-D
|
Часовой пояс GMT +4, время: 02:30. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot