Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java ME (J2ME) > Помогите перенести программу с Java SE на ME |
Автор: bncom 20.9.2009, 16:16 | ||||
День добрый! Начал изучать Java недавно, а тут уже дали задание сделать программу на ME, реализующую принципы ООП. Сделал программу на Java SE (точнее, позаимствовал пример из книги Хорстманна, но сути не меняет, главное, что разобрался во всем):
Теперь нужно написать эту программу в ME. Есть стандартный шаблон (который Хеллоу Ворд выводит), но как отталкиваться дальше, я не знаю.
Буду благодарен, если поможете оформить программу в стандартах ME, чтобы уже дальше я мог тоже посмотреть, как это делается. |
Автор: Galaran 20.9.2009, 17:06 |
Язык тот же. Только библиотека другая Т.е. тут только System.out.print() и GregorianCalendar, Date заменить на ME аналоги |
Автор: bncom 20.9.2009, 19:50 |
Мне бы поподробнее, на примере. С ME я вообще не знаком (хоть и это и один язык, однако все же немного тут по-другому). |
Автор: W0LF 21.9.2009, 11:56 |
wtk/apps там есть куча примеров |
Автор: Dancer 21.9.2009, 13:12 |
bncom, ты же сам написал, что тебе дали задание, чтобы ты лучше разобрался, то есть самостоятельно, если я правильно понимаю ![]() Вот и разбирайся. Тебя тут уже все, кто как смог - направили. Дай и мне, мои 2 цента в копилку бросить ![]() 1) Поставивь WTK от SUN, и смотри javadocs которые там идут, по началу тебе нужно будет MIDP API. javax.microedition.* 2) Фишки, которые юзаются в 1.5/1.6 в ME не прокатят, так что "Employee : e" забываем ![]() for(int i = 0; i < staff.length; i++) {} // что-то вроде этого 3) Шаблон мидлета у тебя есть, там есть Display на который ты и выводишь свои элементы типа TextBox (TextBox t = new TextBox("Lab #1", "Hello, World!", 256, 0);) Значит, тебе нужно организовать код, который будет выводить что-то на экран мобилки, а не в кносоль, как ты делал в SE (System.out.prinln(....)) Ну и выводи ![]() Элементы могут быть StringItem, TextField, собственно писанные..... Form form = new Form("Title"); for(int i = 0; i < staff.length; i++) { form.append(new StringItem("Name: ", staff[i].getName() + " rub", Item.PLAIN); form.append(new StringItem("Name: ", staff[i].getSalary() + " rub", Item.PLAIN); } .... display.setCurrent(form); 4) Остальные классы у тебя есть, так что вперёд - дерзай! ![]() |
Автор: bncom 21.9.2009, 15:05 |
Ок, сейчас буду попробую реализовать. |
Автор: bncom 21.9.2009, 16:21 | ||||||||||||
Дерзанул, возникло пару вопросов. Во-первых, я решил свои три класса разместить в трех файлах. Так, по-идеи, правильнее и понятнее выглядит. Во-вторых, почему-то при создании дочернего класса, наследующего свойства суперкласс, у меня вылезает Warning.
Warning: Exporting non-public type through public API В-третьих,
у меня лично вызывает ошибку, спасает только более тривиальный подход:
Однако почему-то строка StringItem hello = new StringItem... в куске кода:
Вызывает ошибку Cannot find symbol. Какой символ он найти не может, не пойму. В четвертых, помогите разобраться с классом GregorianCalendar. Ему, как я понимаю, соответсвует в МЕ класс Calendar. Прописал:
Получил:
В итоге ошибка следующего характера: Implement all abstract methods |
Автор: eugine_s 21.9.2009, 16:50 |
public class != class Телепаты в отпуске. Какая ошибка? Что-то я не вижу где используются StringItem-ы (s1, s2 - создаются, но не добавляются на форму). Кажется так: Calendar calendar = Calendar.getInstance(); |
Автор: Dancer 21.9.2009, 18:33 | ||||||
bncom, ну ты блин и лентяй!!!! ![]() Код компилиться, запускать - не запускал, не где. Код для MIDP 2.0, если нужно для 1.0, то там нету поддержки плавающей точки, то есть убрать придётся всякие double. Не забудь, что в твоём мидлете прописан package - hello, то есть, исходники у тебя так же должны быть в папке hello. Что-то вроде src/hello/*.java (HeloMIDlet.java, Employee.java, Manager.java) Вот твои классы: HelloMIDlet.java
Employee.java
Manager.java
|
Автор: bncom 21.9.2009, 19:52 | ||
Dancer, спасибо, помог. В принципе, у меня уже и так все было сделано, единственное, с классом календаря не разобрался.
Интересный подход, в книжке у меня такого вообще нет ![]() Почему-то в профиле MIDP-2.1 запускаться программа не захотелась у меня, поменял на MIDP-2.0 - все заработало. Сейчас буду пробывать прикрутить возможность ввода зарплаты, а потом их вывод с фамилиями. |
Автор: susanin 21.9.2009, 23:36 |
Вот это уж точно!! ![]() |
Автор: bncom 22.9.2009, 13:39 | ||||||
У меня наверно сейчас голова лопнет. Сижу уже какое время, пытаюсь реализовать переход с одного экрана на другой. Экран #1: выводится TextField. Туда заносится процентная надбавка для зарплаты. Экран #2: отображается на Form список служащих с увеличенной зарплатой. Начал тут кумекать:
Вот дальше я не понимаю, где мне располагать "Создаем объект Manager", цикл для вывода инфы о зарплате? Если я оставлю его в private void init() - то это скорее всего будет неправильно, т.к. на экране отобазится: 1. кнопка ВЫХОД 2. кнопка ПЕРЕХОД (она же ОК) 3. Текст "Введите надбавку" 4. Список служащих с зарплатой А ведь надо список служищих в новом окне разместить, уже после ввода надбавки. Иду в обработчки событий:
Вот что надо в if (c == perexodMain) прописывать? |
Автор: W0LF 22.9.2009, 15:21 |
модлет - такого нет, есть мидлет. по хорошему, нужно создавать несколько классов, наследоваться от Form, в них прописывать какую-то логику, а потом делать переход между ними. чтоб сделать переход, нужно делать в классе, наследуемом от мидлета статический метод который будет устанавливать дисплей. и я уже писал, что в wtk/apps есть примеры, насколько я помню. Dancer не напишет Вам все Ваши лабораторные(хотя по себе в свое время помню что он оччень терпеливый =) ) и никто особо этим заниматься не будет... это время.. спишите лучше у однокурсников, переименовывая имена классов и интерфейс, если Вы не собираетесь заниматься в будущем этой профессией =) |
Автор: bncom 22.9.2009, 16:55 |
Да а я разве говорил, что надо писать за меня лабораторные? Я понимаю, если бы пришел с пустыми руками, а попросил бы за меня написать. Вот это я понимаю был бы наглежь. А тут я просто прошу показать, КАК надо, т.к. в книжке про это хоть и на писано, но для меня лично не очень понятно. Ведь не зря же говорят, что один раз лучше показать, чем сто раз говорить... Очачатался я очачатался =) wtk у меня не стоит, а установлено java Platform ME SDK. APPS - это что такое? |
Автор: Dancer 22.9.2009, 17:26 | ||
Platform ME SDK и WTK в данном случае одно и то же. Это сейчас у Sun стало называться, платформ бла-бла-бла, а раньше это был просто Wireless Tool Kit (WTK) Куда ты поставил это дело? Должна быть папка что-то Disk:/bla-bla-bla/WKT_ROOT, назовём её %WTK_HOME% (для удобства) %WTK_HOME%/apps - там есть примеры приложений с исходниками, их там дохрена, смотри не хочу. Кстати, я тебе советовал смотреть javadocs которые идут вместе с WTK, ты их нашёл????? %WTK_HOME%\docs\api - документация %WTK_HOME%\docs\api\midp-2.0\index.html - как только научишься пользоваться этими доками, так сразу отпадёт куча ненужных вопросов. Ну уж а как до кода с примерами доберёшься, думаю их остаться должно будет ещё меньше. у тебя есть display - это твоё окошко (для твоего приложение) в "реальный мир" ![]() display.setCurrent(что-то, что наследовано от Displayable) то есть, Form, List, Canvas вот и пользуй это дело: display.setCurrent(myform); когда произошло нажатие на кнопку, пришёл event ты это дело обработал, понимаешь что нужно другую формочку на экран пихнуть, вот и пихни display.setCurrent(myform); Ну, а W0LF, тебе правильно написал, делай статический метод, для получения дисплея, и можешь это дело юзать в любом своём классе. Вызываться это будет так: HelloMIDlet.getDisplay().setCurretn(bla-bla-bla);
Тут похоже всётаки у тебя проблема не с ME, а с Java как с таковой. Ну а по поводу книжек - на русском по ME хороших не видел, но зато ты можешь здесь многому понабраться, как в FAQ, так и в постах, которые уже не поразу написаны. Читай, пробуй. |
Автор: susanin 22.9.2009, 18:50 |
для такого уровня книжек полно. взять к примеру Е.Л. Буткевич - Пишем программы и игры для сотовых телефонов |
Автор: Dancer 22.9.2009, 19:29 | ||
В книжках такого уровня ошибок было столько....., что мама не горюй, по ним лучше не учиться, либо не сможешь, либо плохому научат (хотя, может быть в последних изданиях всё стало лучше), то что видел - откровенные "какакшки" были. Да и по правде говоря, кроме javadocs который с WTK идёт, по большому счёту больше ничего и не нужно. (по себе помню) всё имхо, конечно ![]() |
Автор: susanin 22.9.2009, 20:29 | ||
сори за офтоп ![]() а вы не скажете как явадоки из se добавить в me? потому что если пишешь на me, то явадоков на функции из se не видно...что уж только не пробовал...скачивал архивы с сайта с документацией..добавлял их к стандартным явадокам...все равно не видно |
Автор: Dancer 23.9.2009, 10:03 |
Ну, вообще то, ME доки в себе всё что нужно имеют и только эти методы можно будет использовать из java.lang java.io и т.д. (имею ввиду исползьовать в ME коде) С SE вообще не стоит это дело как-то пытаться пересекать. Я если честно не понял для чего это нужно. Если хочется видеть и то и то, ну в браузере делаешь закладки на нужные index.html и пользуешь ![]() Можно конечно пойти ещё одним "хитрожопым" путём и вбабахать линки на java.microedition.* в html файлы, которые идут с SE. Но пожинить это дело просто так не получитсья (хотя, как я уже ранее писал, необходимости не вижу) Если бы были исходники классов ME с /** */ то можно было бы это дело подложить в паку вместе с src SE, пробежаться по всему этому делу javadoc командой и получить новые доки, куда эти пакеты уже будут включены. |
Автор: W0LF 23.9.2009, 11:02 |
здается мне, что имелось ввиду подключение джавадока в IDE, так иногда быстрее, туда же обычно и исходники фреймворков лепят, чтоб можно было и исходники смотреть. смотря какая IDE, в Intellij Idea, например, просто в настройках проекта можно было подсунуть или javadoc или sources, и все. |
Автор: susanin 23.9.2009, 16:31 |
именно! например хочу я создать в me приложении объект класса Formatter Formatter f = new Formatter(); но явадока на этот класс в me нет...только в se...не создавать же проект se только для того чтобы посмотреть инфу на этот класс... |
Автор: Dancer 23.9.2009, 16:52 |
ЭЭЭЭЭ как бы сказать то...... Я конечно дурак, но не на столько. Если мы будем использовать класс Formatter в своём ME приложении, то компиляция то пройдёт, этого добиться можно, в этом я не сомневаюсь, но как потом будет проходить преверификация??? Она же не пройдёт. И уж тем более, даже если сможем обмануть преверифайер, ну или создать JAR обойдя preverify и зальём в телефон и запустим это дело, на телефоне это упадёт!!!!! Так как нет поддержки данного класса производителем, потому что этот класс не входит в набор API. То нахрена нам его пользовать, если на реальном аппарате это никто не поддерживает???? Тут либо пишем свой Formatter (в своём проекте, своего приложения) и его пользуем, на что IDE впринципе нормально реагирует и покажет и методы этого класса и т.д., если ещё и коментарии в нём в стиле javadoc то и все остальные прелести "прогресса" будут то же. Ну или как W0LF писал, можно это дело поженить в IntelliJ, в NetBeans тоже можно такое сделать. Сказать какие либы пользуются в проекте, где лежать src, где javadocs. Это уже всё зависит от пользуемого IDE, сейчас они сильно продвинутые стали, так что полазий в настройках ![]() |
Автор: susanin 23.9.2009, 17:10 | ||
ну вообще хотел сделать форматированный ввод в textfield...думал для этого попробовать какие то средства из se...но там похоже таких тоже нет...
т.е. если я правильно понял в sdk для me есть классы и соответственно явадоки к ним только те, которые поддерживаются телефоном, и другие (кроме самописных) классы использовать не вариант? |
Автор: Dancer 23.9.2009, 17:33 | ||
УГУ, 99,9% true ![]() только не в SDK, скажем так, а в Sun спецификациях, которые называются JSR (слышал навреное?), так вот, именно эту спецификацию производители аппаратов должны поддерживать, то есть в телефоне будут доступны именно те классы и методы, которые представленны в той или спецификации. Ну и производитель соответственно презентует, какие JSR он поддержал. Так же, производитель может сделать поддержку собсвенных классов, которые могут быть доступны пользователю, а могут быть и не доступны, но эти классы никак не будут проходить под каким либо JSR. Вот например, говориться что мобилка поддерживает JSR-75 - это говорит о том, что мидлеты могут ползовать классы для обращения к PhoneBook, базе Events (календарь в мобиле с ремайндерами), и иметь доступ к файловой системе. То есть в своём мидлете можно будет пользовать javax.microedition.pim.* методы и быть уверенным, что аппараты которые поддерживают данный JSR имеют одинаковый интерефейс, и будут работать в принципе одинаково с одним и тем же кодом ;). MIDP2.0 - JSR-118 CLDC-1.0 - JSR-37 MultiMedia - JSR-135 Bluetooth - JSR-92 SMS/MMS - JSR-120/JSR-205 и т.д. На эту тему тут уже не поразу было писано, пошукай конфу. У нас "песочница" очень сильно ограничена, и плюс ко всему, то что ты сможешь пускануть на компе под эмулятором, не факт что один в одни будет работать/отображатсья на конечном устройстве. Сам посчитай сколько сопряжений интерфейсов проходит. ![]() |
Автор: susanin 23.9.2009, 17:44 |
Dancer, большое спасибо за разъяснения! плюсую! ![]() |
Автор: W0LF 23.9.2009, 19:39 |
![]() там на шапке темы есть кнопочка со смайликом - "пометить как решенный", ее желательно плиз тыцать, когда вопрос разрешился. |
Автор: bncom 25.9.2009, 13:19 |
Решил подключить к НетБинсу плагин поддержки J2ME. Скачал. установил, все как положено. Затем НетБинс нашел на компе у меня SDK Me, импортировал то, что ему нужно было (точнее, я как понял, он просто у себя порописал пути до моего установленного SDK Me и все). Создюа новый проект, пакет с классами, вставляю туда код из моего проекта, который был написан в Java Platform ME SDK. Как бы все красиво и ладненько. Запускаю на исполнение, бла-бла... и тут ошибка выскакивает: Updating application descriptor: C:\Users\admin\Documents\NetBeansProjects\Lab1\dist\Lab1.jad Application descriptor does not declare any MIDlet. Direct execution is not allowed. Generated "C:\Users\admin\Documents\NetBeansProjects\Lab1\dist\Lab1.jar" is 3868 bytes. Эмулятор запускается, но программу не запускает. Вопрос: из-за чего это? |
Автор: eugine_s 25.9.2009, 14:53 |
Скорее всего в свойствах проекта не прописал класс мидлета. Для проверки можешь глянуть вот сюда: C:\Users\admin\Documents\NetBeansProjects\Lab1\dist\Lab1.jad и найти в нем строку MIDlet-1: В ней должно быть MIDlet-1: Midlet-Name, Midlet-Icon, Midlet-MainClass (Midlet-Icon может быть пустым) |
Автор: bncom 25.9.2009, 18:39 |
Так точно, было не прописано. Спс за помощь. |