J2ME

جلسه اول:
سلام به همه !
این هم از j2me .
بالاخره استارت آموزشش رو زدم.
تو این جلسات تصمیم داریم که دوره همی برنامه نویسی برای موبایل رو با استفاده از جاوا از ساده ترین سطحش شروع کنیم و تا جایی که می کشه جلو بریم.

و اما شروع :
MIDP (Mobile Information Device Profile)d بستر نرم افزاری دستگاه های همراه است.
برنامه هایی که تحته این تکنولوژی بخوان نوشته بشن باید از کلاسه خاصی به نام MIDPlet  استفاده کنن که این کلاس در مسیر javax.microedition.midlet قرار داره.

اینجا (یعنی تو j2me) مثله اپلیکشن های j2se نیست که main و ... (از این جو چیزا ) بخواهیم. می گم که اینجا باید از MIDlet استفاده کنیم. MIDlet تو j2me رو میشه با Applet تو j2se مقایسه کرد. (در کل این حرفا فعلاً به درد نمی خوره :دی)

یه MIDlet (که همون بدنه اصلی برنامه امون خواهد بود) می تونه تو یکی از چهار تا حالت زیر باشه:

1) loaded:
این حالتیه که برنامه اومده بالا و مقیم شده تو حافظه و ....

2) active:
بیشتر اوقات برنامه تو این حالت قرار داره ، یعنی فعاله دیگه :دی

3) paused:
برنامه موقتاً متوقف شده !

4) destroyed:
برنامه بی برنامه!

وقتی که برنامه تحته موبایل اجرا میشه و منابع اون بارگذاری میشن تابع startApp فراخوانی میشه.
این تابع نقطه ورود اصلی برنامه هست. یعنی از اینجا به بعده که کد های درست درمون ما شروع می شن.وقتی این تابع فراخوانی میشه (به صورت خودکار) برنامه در حالت active قرار می گیره. به دو طریق برنامه از این حالت خارج میشه:

1) تابع pauseApp رو فراخوانی کنیم و برناهم رو موقتاً متوقف کنیم.

2) destroyApp رو فراخوانی کنیم و کلاً برنامه رو ختمه به خیر کنیم . (البته توجه کنید صرفاً فراخوانی این تابع کاری انجام نمی ده ، بعداً جلوتر ها موقعی که داشتم خروج از برنامه رو توضیح می دادم استفاده از این تابع رو هم توضیح می دم)

خب دیگه کم کم حرف رو کم کنیم و شروع کنیم به کار:دی
اول باید یه IDE انتخاب کنیم که توش کار کنیم ، من توصیه می کنم از NetBeans استفاده کنیم. (نکته: من خودم از این IDE بدم میاد ها! منتهی واسه j2me گزینه خوبی هست!)

دوم اینکه دیگه بریم با این IDE کد بزنیم دیگه :دی (این که گفتن نداشت).

پس NetBeans را ران می کنیم!:

از طریق منوی File گزینه New Project رو انتخاب می کنیم. تو پنجره ای که ظاهر میشه اول Java ME رو انتخاب می کنیم و سپس در پنجره سمت راست گزینه Mobile Application رو انتخاب می کنیم.
مثله شکل :
نکته : من دارم با NetBeans 7.0 توضیح می دم ، اگه شما یه نسخه دیگه دارید ممکنه یه نموره این گزینه ها فرق کنه :دی




و مثله خیلی جاهای دیگه روی Next کلیک می کنیم.

تو پنجره جدیده که باز میشه یه اسم واسه پروژه انتخاب می کنیم. و تیکه Create Hello MIDlet رو هم بر می داریم.

اینم عکسش:


مجدداً روی Next کلیک می کنیم.
تو پنجره جدیدی که باز می شه یه Device انتخاب می کنیم. این که چی انتخاب کنیم فعلاً مهم نیست ، اصلاً میشه بعداً هم عوضش کرد ، جلوتر توضیح می دم اینا رو.فعلاً یه چی انتخاب کنید ، من DefaultCldcPhone2 رو انتخاب کردم.
بقیه گزینه ها رو هم مثل عکس تنظیم کنید  و این بار به جای Next زارت روی Finish کلیک کنید بره دیگه!



حالا نوبته چیه؟؟؟ بله! درست گفتید :دی ، همونطور که قبلاً هم گفتم برای اجرای برنامه ها به یه MIDlet نیاز داریم. پس باید یه MIDlet ایجاد کنیم. برای اینکار تو قسمت Project (سمت چپ) روی پروژه کلیک راست کنید و سپس New و بعد هم MIDlet رو انتخاب کنید:



تو پنجره ای که باز میشه یه اسم واسه MIDlet انتخاب کنید و روی Finish کلیک کنید .:)
من اسمش رو گذاشتم MY_1_MIDlet .
می بینیم که کد زیر به صورت خودکار زده میشه :




خب اینم کدمون ، سه تا تابع رو که قبلاً توضیحه مختصری دادم در موردشون ، تو درس بعد توی تابع startApp یه سری کد می زنیم که بتونیم یه چیزایی اجرایی کنیم.فعلاً همین قدر کافیه :دی !

جلسه دوم:
خب جلسه قبل که کاره خاصی نکردیم :دی ، فقط NetBeans رو اجرا کردیم! این جلسه باید یه کم بیشتر از خودمون فعالیت نشون بدیم !
خب اینجا یه نموره با جاوای معمولی فرق داره، طبق معمول اولین چیزی که می خواهیم اینه که بتونیم یه جورایی با کاربر ارتباط بر قرار کنیم ، یه چیزی نشونش بدیم،یه چیزی ازش بگیریم و و....
برای ارتباط با کاربر باید از کلاس Display استفاده کنیم.هر MIDlet یه Display مخصوص به خودش رو داره که هنگام کار با هر MIDlet باید به Display  مربوط به اون دسترسی پیدا کنیم و روی اون کار کنیم.برای دستری به Display مربوط به هر MIDlet  از متد getDisplay  استفاده می کنیم :
Display currentDis=Display.getDisplay(MIDlet m)d   
که m اون MIDlet ای هست که داریم روش کار می کنیم.
پس از اینکه به Display مربوط به یه MIDlet دسترسی پیدا کردیم می تونیم با استفاده از متد setCurrent مشخص کنیم که چه چیزی نمایش داده شود!!!
(یه نموره این حرفا فعلاً خشکه ولی تو عمل که کد بزنیم قشنگ جا می افته!)

به دو صورت میشه از متد setCurrent برای تعیین نمایش فعلی استفاده کرد:

Display.getDisplay(MIDlet midlet).setCurrent(Alert alert,Displayable disp)d
Display.getDisplay(MIDlet midlet).setCurrent(Displayable disp)d
اولی ابتدا یه Alert رو به کار بر نشون میده (بعداً در مورد Alert توضیح می دم) و سپس یه Displayable رو .
دومی هم خب معلومه دیگه ،Alert که بهش ندادیم! فقط یه Displayable رو نشون میده دیگه! (الکی الکی برای این دو خط توضیح کاراکتر حروم کردیم :دی)

برای ارتباط با کاربر (چه نمایش چه دریافت ) یه سری ابزار مثله Alert نیاز داریم که همشون تو مسیر زیر هستن:
javax.microedition.lcdui.*d
خب بیایید فعلاً با همین اطلاعات و با آگاهی از اسم Alert برنامه قبلی رو یه کم گسترش بدیم:



توجه کنید که تو کده بالا وقتی از getDisplay استفاده کردیم تو پارامتر ورودیش نوشتم this ، خب تابلوئه دیگه چون کلاسی که داریم توش کد می زنیم خودش MIDlet هست.
خب حالا برنامه رو اجرا کنید ، باید یه Alert  نمایش داده بشه:

اگه برنامه اجرا نشد ، یعنی موبایل پوبایلی ، چیزی ظاهر نشد تو قسمت Project روی پروژه کلیک راست کنید و گزینه clean رو انتخاب کنید و بعد برنامه رو اجرا کنید (معمولاً تو NetBeans زیاد باید این کار رو انجام بدین!)







اگه باز هم برنامه اجرا نشد (که برای من زیاد پیش اومده) حتماً گیرش بر می گرده به آنتی ویروس ،برید آنتی ویروسه مسخره رو غیر فعال کنید و یه کم صبر کنید و بعد دوباره برنامه رو اجرا کنید.
(هر چی می کشیم از همین آنتی ویروس هاست :دی ، هیچ فایده ای هم ندارن ها! الکی عادت کردیم چرت و پرت نصب کنیم رو سیستممون :دی)

اگه برنامه اجرا شد بعد اون یه سری پیام چرند و پرند میاد که فعلاً به دردمون نمی خورن. مهم این بود که تونستیم یه Alert نشون بدیم.فعلاً با همینش هم باید کلی حال کرد.

نکته خیلی خیلی مهم: از همین جلسه های اول عادت کنید هر برنامه ای رو که می نویسید زارت ببرید رو یه گوشی اجرا کنید. چون تو گوشی های مختلف نتیجه ها فرق داره. برای اینکار هم اونجایی که پروژه اتون ذخیر میشه یه پوشه به نام dist ساخته میشه که توش برنامه اتون با پسوند های jar و jad وجود داره ، بسته به نوعه گوشی ای که استفاده می کنید باید یکی یا هر دوی این فایل ها رو با بلوتوثی چیزی بفرستید تو گوشیتون و برنامه رو اونجا نصب و اجرا کنید.

خب باز هم بریم سر کد نویسی!
تا اینجا یه سری اسامی مسامی به گوشمون خورد ، Alert و Displayable و ...
همه اینا ابزار هایی هستن که بتونیم باهاشون با کاربر ارتباط برقرار کنیم.
API های ارتباط با کاربر تو j2me  به دو دسته تقسیم می شن:
1)API های سطح بالا
این API ها ابزار هایی رو در اختیار ما قرار می دن که کار کردن باهاشون ساده است ، تو طیف گسترده ای از از گوشی ها و وسایل همراه اجرا میشن ، کاره کد نویسی رو ساده می کنن ولی در عوض ظاهر ماهر آنچنانی ندارن.

2) API های سطح پایین
API های سطح پایین نقطه مقابل API های سطح بالا هستن ، در صورت استفاده از این امکانات بیشتر کاره کد نویسی به عهده خودمون هست (به قولی خر کاری داره) ولی در عوض کنترل بیشتری بر روی ظاهر و ... خواهیم داشت ،طوری که می تونیم ابزار های اختصاصی خودمون رو ایجاد کنیم.
توجه کنید که وقتی یه MIDlet طراحی می کنید می تونید هم از API های سطح بالا استفاده کنید و هم از API های سطح پایین ولی وقتی فقط دارید یه صفحه (Screen) از یه MIDlet رو برنامه اش رو می نویسید نمی تونید همزمان هم از API های سطح بالا استفاده کنید و هم از API های سطح پایین . یه برنامه با دو صفحه متفاوت رو در نظر بگیرید که یه صفحه اش رو با API سطح بالا طراحی کردید و یه صفحه اش رو هم با API سطح پایین ! (اینجوری میشه ولی تو یه صفحه دو جور API نه!) - حالا جلوتر کد می زنیم می فهمیم الآن داریم چی چرت می گیم :دی :دی  :دی

API های سطح بالا:

Alert:
از Alert شروع می کنیم ، چون به نظر من از همه ساده تره :دی.
Alert ها ابزار های خیلی ساده ای هستن برای نمایش پیغام به کاربر.این پیغام می تونه پیغام خطا ، نمایش اطلاعات خاص یا هر چیزه دیگه ای باشه.
Alert ها معمولاً دارای محدودیت زمانی هستن یعنی برای یه مدت خاص نمایش داده میشن و بعد هم میرن :دی ، البته این ویژگیشون رو میشه تغییر داد یعنی کاری که کرد که یه Alert به صورت دائمی نمایش داده شده ( در این صورت خوده کاربر پس از مشاهده Alert اون رو می بنده).
یه Alert می تونه همراه با متن و عنوان، شامل عکس هم باشه.
اگه تصاویر و متن Alert زیاد باشن اونوقت به حالت Scroll در میاد و محدودیت زمانی اون از بین میره و مجدداً خوده کاربر باید اون رو ببنده.

علاوه بر مواردی که بالا اشاره کردم نوعه Alert رو هم میشه تعیین کرد. (کاره خوبیه:دی)
برای تعیین نوع Alert از AlertType استفاده می کنیم.AlertType می تونه یکی از موارد زیر باشه:
AlertType.ALARM
AlertType.CONFIRMATION
AlertType.ERROR
AlertType.WARNING
AlertType.INFO

برای ایجاد یه Alert از دو روش می شه استفاده کرد:
Alert alert1=new Alert(String message)d
Alert alert2=new Alert(String title,String message,Image img,AlertType type)d

وقتی یه Alert ایجاد می کنیم و داریم باهاش کار می کنیم می تونیم رو موارد زیر کنترل داشته باشیم:
1) String
متن اصلی Alert هست . همون message تو پارامتر های ورودی!

2) Title
همون عنوان Alert می باشد.

3) Image
عکس Alert

4) Type
نوع Alert

5) Timeout
محدودیت زمانی Alert

برای کار (دسترسی یا تغییر) تمامیه موارد فوق متد هست:





public String getString()Dدسترسی به متن پیغام
public void setString(String message)dتغییر متن
public Image getImage()dدسترسی به تصویر
public void setImage(Image img)dتغییر تصویر
public String getTitle()dدسترسی به عنوان
public void setTitle(String title)dتغییر عنوان
public int getTimeout()dدستری به اندازه محدودیت زمانی
public void setTimeout(int time)dتغییر محدودیت زمانی
public AlertType getType()dبه دست آوردن نوع پیغام
public void setType(AlertType at)dتغییر نوع پیغام

 نکته : اگه می خواهید محدودیت زمانی یه Alert  رو از بین ببرید و اون رو به صورت دائمی نشون بدین باید به صورت زیر عمل کنید:

setTimeout(Alert.FOREVER)d

نکته اضافی: Alert زیر کلاس Screen هست .(بعداً توضیح میدم-شاید البته! :دی).

یه نکته دیگه : به Alert میشه Ticker اضافه کرد.این که Ticker چیه فعلاً مهم نیست تو کد متوجه میشین.

خب با این حرفا یه کدی بزنیم فعلاً :


حالا برنامه رو اجرا کنید و حالش رو ببرید:


چون نوع Alert از نوعه Alert.FOREVER هست به صورته دائمی نمایش داده میشه و تا روی Done کلیک نکنید نمی ره!

جلسه سوم:

خب تو دو تا جلسه قبل که عملاً کاری نکردیم :دی (کلاً جدیداً وقتی دارم یه چی می نویسم وسطاش خوابم میاد :دی اینه که جلسات کوتاه برگزار میشن:دی) ببینیم این جلسه می تونیم یه کم بیشتر کار کنیم یا نه؟

بریم رو ادامه بحثمون در باره API های سطح بالا!

List:

List که دیگه از اسمش پیداست برای چی ساخته شده :دی ، لیست ها برای این استفاده می شن که یه سری اقلام و موارد رو به کاربر نشون بدیم و کاربر بسته به نوعه لیست بتونه یک یا چند مورد از گزینه های لیست رو انتخاب کنه ، گاهی هم از لیست فقط به عنوان نمایش دهنده یه سری اسامی استفاده می کنیم. در کل کاربردش به خود شما ربط پیدا می کنه!!

List زیر کلاسه Screen هست (یا است یا هستش) و تمامه صفحه رو می پوشونه.یعنی وقتی تو یه صفحه از List استفاده می کنیم فقط می تونیم از List استفاده کنیم و بس.(حالا خیلی غصه نخورید بعداً یه کاریش می کنیم :دی)

برای ایجاد List یکی از این دو تا سازنده ها رو می تونیم استفاده کنیم:


با سازنده اولی فقط عنوان لیست  و نوعش رو مشخص می کنیم .بعداً با استفاده از متد هایی که جلوتر توضیح میدم اعضاش رو بهش اضافه می کنیم.

با سازنده دومی همون اول لیست رو فول با تمام اعضاش ایجاد می کنیم. اسامی اعضای لیست و عکساشون رو از قبل می بایست تو آرایه نگه داری کنیم و اینجا به عنوان پارامتر ارسال کنیم.

البته توجه کنید که استفاده از سازنده دومی به این معنی نیست که دیگه نمی تونیم اعضای لییست رو تغییر بدیم یا بهش اضافه کنیم ، منتهی بعضی ها ممکنه اینجوری کارشون ساده تر بشه ، اینه که این سازنده رو هم گذاشتن ،مگرنه لیست لیسته دیگه با هر سازنده ای ساخته شه فرق نمی کنه!

خب ، اما نوع لیست:

دیدیم که تو پارامتر های سازنده لیست باید نوع لیست رو مشخص می کردیم (همون listType):

نوع لیست می تونه یکی از سه تا مورده زیر باشه:

1) EXCLUSIVE:

تو این حالت لیست به صورت مجموعه ای از چند RadioButton در میاد و کاربر فقط می تونه یکی از اعضای لیست رو انتخاب کنه.


2) IMPLICIT:

از این حالت وقتی استفاده می کنیم که بخواهیم یه منوی تمام صفحه در اختیار کاربر قرار بدیم.تو این حالت هم کاربر فقط می تونه یکی از گزینه ها رو انتخاب کنه ولی در نحوه انتخاب و شکل ظاهری با حالت EXCLUSIVE تفاوت هایی وجود داره که جلوتر می گم.

3) MULTIPLE:

اینم که دیگه از اسمش معلومه ، تو این حالت کاربر می تونه چند مورد از گزینه های لیست رو انتخاب کنه.یعنی تو این حالت گزینه ها به صورت CheckBox هستن.


تو قالبه مثال این سه مورد رو توضیح می دم کم کم همه چی میاد دستمون :

(فعلاً از سازنده دومیه استفاده می کنیم.عکس هم نمی زاریم :دی)

مثال یک :لیست به صورت EXCLUSIVE:



به پارامتر های سازنده لیست توجه کنید، اولیش که عنوانه هیچ! ، دومی نوعه لیست بود که گذاشتم List.EXCLUSIVE ، سومی یه آرایه از اسامی هست که به عنوان اسامی آیتم های لیست به کار میره ، چهارمی هم عکس بود که فعلاً سانسور شد (null گذاشتم).

اینم خروجیش:


یه کم با لیست سر و کله بزنید ببینید چه جوریه!

(جوونه من حتماً برنامه ها رو زارت و زورت بفرستید رو گوشیتون اونجا هم خروجی رو ببینید، حالا از ما گفتن!)


مثال دوم : لیست به صورت IMPLICIT:


اینم خروجیش:


و اما مثال سوم : لیست به صورت MULTIPLE:


و اینم خروجیش : (یه کم سر و کله بزنید با خروجی ها تا قشنگ دستتون بیاد تفاوت ها)


خب تا اینجا یه نموره در مورده تفاوت لیست های EXCLUSIVE و IMPLICIT صحبت کردیم ، تفاوت ظاهریشون رو هم دیدیم.ولی یه تفاوت عمده دیگه هم دارن.

تفاوت تو نحوه مدیریت رویداد هست.تو لیست های MULTIPLE و EXCLUSIVE هر گزینه به عنوان یه آیتم فقط نشون داده میشه و وقتی انتخاب می شن یا روشون کلیک میشه اتفاقی نمی افته ولی در حالت IMPLICIT هر آیتم به صورت یه دکمه هست و کلیک بر روی هر کدوم یه رویداد به وجود میاره ، اینم با مثال توضیح بدم بیشتر متوجه میشین.

تو مثاله زیر یه لیست از نوع IMPLICIT به وجود میاریم ، سپس یه مقداری کد برای مدیریت رویداد بهش اضافه می کنیم ، سر آخر برنامه رو اجرا می کنیم و گزینه های لیست کلیک می کنیم تا ببینیم اوضاع از چه قراره؟ :دی


نکاته مهم کد رو دورش خط کشیدم.

اولین نکته مهم نوع لیست هست که از نوعه IMPLICIT گذاشتم.

دومین نکته مهم اینه که برای مدیریت رویداد های لیست بهش یه CommandListener اضافه کردم .(با فراخوانی setCommandListener و ...). تو قسمته commandAction نوشتم که هر گاه رویدادی اتفاق افتاد یه Alert ایجاد بشه و نمایش داده بشه.

متد setCurrent رو هم خودم نوشتم برای جلو گیری از یه سری گند کاری ها . کد setCurrent هم به صورت زیره:


کلاً یه دونه متد برای نمایش کامپوننت ها ، مثله همین setCurrent که من نوشتم همون اول بنویسید خیلی کار راه اندازه ....:دی

خب حالا برنامه رو اجرا کنید ، یه کم تو لیست بالا پایین برید (با دکمه های بالا پایین مثلاً ) و بعد هم یکی از گزینه ها رو انتخاب کنید (با دکمه وسطی مثلاً) اونوقت باید Alert مورده نظر نشون داده شه.

خب حالا کده بالا رو تغییر بدید و نوعه لیست رو به EXCLUSIVE تغییر بدید (دیگه خودمون رو بکشیم نمی تونیم اون Alert رو نمایش بدیم:دی)

خب

خب پس تا اینجا فهمیدیم که اگه لیست از نوع IMPLICIT باشه انتخاب هر گزینه از لیست یه رویداد ایجاد می کنه و میشه به سادگی مدیریتش کرد ، ولی اگه مثله کده قبلیه لیستمون از نوع EXCLUSIVE باشه یا از نوع MULTIPLE باشه چی کار کنیم؟ (چه خاکی تو سرمون بریزیم؟؟؟؟ :دی)

خب اینم راه داره :دی ، تو این حالت خودمون باید به لیست Command اضافه کنیم.

بله! Command :دی

تو همین برنامه قبلیه که کار نمی کرد و Alert رو نشون نمی داد یه Command اضافه می کنم حالش رو ببرید ها! 


نحوه ایجاد Command رو دقت کنید که جلو تر ها خیلی ازش استفاده می کنیم.

اولین پارامتر وروی سازنده Command عنوانش هست. دومین پارامتر نوعش هست و سومی هم اولویتش. (شاید بعداً بیشتر توضیح دادم اینارو :دی)

توجه کنید که با استفاده از addCommand می تونیم به لیست Command اضافه کنیم.

خب حالا برنامه رو اجرا کنید باید به صورت زیر باشه :


یکی از گزینه ها (مثلاً hasan) رو انتخاب کنید و بعد هم GO  رو انتخاب کنید!باید اون Alert خوبه رو ببینید :)

نکته: اینکه Command ها چی جوری نمایش داده بشن شدیداً به مدل گوشیتون بستگی داره ، پس حتماً برنامه رو تو یه گوشی اجرا کنید.

اجازه بدید یه کم بیشتر با Command ها کار کنیم.

گفتم که اولین پارامتر عنوانش هست ، این که هیچ.

دومین پارامتر گفتم نوعش رو مشخص می کنه که می تونه یکی از موارد زیر باشه :

Command.BACK

Command.CANCEL

Command.EXIT

Command.HELP

Command.ITEM

Command.OK

Command.SCREEN

Command.STOP


بیایید با این حرفا یه Command دیگه به برنامه اضافه کنیم با عنوان D مثلاً :) (یا به قولی :"مثلاً فرضاً " :-O    )


حالا برنامه رو اجرا کنید باید خروجی مثله زیر باشه :

باز هم می گم تو گوشیتون ممکنه فرق کنه اونم از زمین تا آسمون


می بینید که دو تا Command داریم این دفعه و جالب اینجاست که فرقی نداره کدوم یکی از این دو تا Command ها رو انتخاب می کنیم ، هر کدوم رو که انتخاب کنیم همون Alert خوبه نشون داده می شه.ولی انصافاً اینجوری حال نمی ده ، پس بیایید یه کاری کنیم که فقط اگه Command ای که عنوانش GO هست عملیاتی باشه (یعنی Alert رو نشون بده).

پس کد رو به صورت زیر تغییر می دیم:


به اون if  که دورش کادر کشیدم حتماً توجه کنید ، اینجا داریم نحوه کار با اولین پارامتر commandAction رو هم یاد می گیریم. :)

حالا برنامه رو اجرا کنید و چند بار این Command ای که عنوانش D هست رو انتخاب کنید و خلاصه خودتون رو باهاش سر گرم کنید :) ، متوجه می شید که اتفاقی نمی افته ولی اگه رو GO کلیک کنید اونوقت مجدداً اون Alert خوبه نمایش داده میشه.

خب ما که تا اینجا اومدیم پس بگیریم رو پارامتر دوم commandAction هم کار کنیم.

این پارامتر همون Displayable ای هست که Command ها بهش اضافه شده بودن و هر رویدادی به اون بر می گرده ، چون تو این مثال Command ها رو به myList اضافه کرده بودیم پس این Displayable  باید به همون myList اشاره کنه. اجازه بدید مثال قبلی رو طوری تغییر بدیم که گزینه انتخابی توی لیست به عنوان Alert نمایش داده شه (به جای HELLO).

به کده زیر توجه کنید : فقط  به داخل commandAction توجه کنید ،چون فقط همین یه قسمت رو تغییر می دم و بقیه کد مثله قبل هستش!!!:


اولین کاری که کردم این بود که پارامتر d رو به لیست تبدیل کردم (cast کردم )

getSelectedIndex متدیه که اندیس عنصر انتخابی از لیست رو بر می گردونه .

getString هم متدیه که یه اندیس می گیره و  عنوان آیتم متناظر با اون رو بر می گردونه.

یعنی رشته name  عنوان گزینه انتخاب شده از لیست رو تو خودش نگه می داره.

Alert رو هم با استفاده از این رشته (یعنی name ) ایجاد کردم.

حالا برنامه رو اجرا کنید و یکی از گزینه ها مثلاً hasan رو انتخاب کنید و GO رو انتخاب کنید:


پس از اینکه یه گزینه رو انتخاب کردین و دکه GO رو هم فشار دادین باید یه Alert متناسب با گزینه انتخاب شده نشون داده بشه:



نزدیک بود یادم بره یه چیزی :) ، تا یادم نرفت این رو هم بگم.خالی از لطف نیست.

سومین پارامتر Command گفتیم که مربوط هست به اولویت.خب که چی؟

جواب : وقتی تعداد Command ها زیاد بشه اونوقت به صورت یه منو در میان و اینکه داخل منو چه جوری چیده شن به اولویت اونا بستگی داره.

بیایید کلاً کد رو عوض کنیم (به صورت زیر) :


می بینید که 5 تا Command ایجاد کردم ، همشون هم از نوع Command.OK و به هر کدوم یه اولویتی دادم. حالا ببینیم چی میشه وقتی برنامه اجرا میشه (این مورد دیگه شدیده شدیده شدید به گوشیتون بستگی داره و حتماً باید رو خوده موبایل اجرا شه )

اینم خروجی:


می بینید که GO با اولویت 1 رفته اون گوشه و بقیه همه به رفتن داخل Menu .حالا اگه منو رو انتخاب کنید به صورت زیر خواهد بود :


می بینید که Command ها داخل این منو بر اساس اون اولویتی که ما تو کد مشخص کردیم چیده شدن ،اول D با اولویت 2 بعد F با اولویت 3 بعد G با اولویت 4 و سر آخر هم E با اولویت 5!


یه سری متد دیگه از لیست اسم ببرم و پرونده این جلسه رو ببندیم !

public   int  append (String  txt,   Image  img)d

یه آیتم جدید به انتهای لیست اضافه می کنه و اندیس اون رو بر می گردونه.پارامتر اول متن این آیتم و پارامتر دوم تصویر این آیتم هست.

نکته: جلو تر ها سعی می کنیم یه برنامه کامل با این حرفایی که می زنیم بنویسیم پس فعلاً خیلی نگران اینکه چرا با Image  و .... کار نمی کنیم نباشید.

public    void   delete (int index)d

یه آیتم از لیست که اندیس اون با پارامتر  index مشخص میشه رو حذف می کنه.

public   void  deleteAll()d

همه عناصر لیست رو حذف می کنه.

public    Font   getFont(int  index)d

فونت یه آیتم از لیست رو که اندیس اون با index مشخص میشه بر می گردونه.

public   Image   getImage(int   index)d

تصویر مربوط به آیتم از لیست رو بر می گردونه.

public   int   getSelectedIndex()d

اندیس عنصری از لیست رو که انتخاب شده بر می گردونه. (یه بار با این متد کار کردیم دیگه!)

public   String   getString(int   index)d

متن یه آیتم رو که اندیس اون با index مشخص میشه بر می گردونه!

public    void  insert(int  index,String  txt,Image  img)d

یه آیتم جدید تو اندیس مشخص شده درج می کنه.

public   boolean  isSelected(int  index)d

چک می کنه که آیا آیتم متناظر با اندیسه index انتخاب شده هست یا نه؟؟؟

public   void  set(int  index,String   txt,Image   img)d

آیتم موجود در اندیسه index رو با مقادیر جدیده txt و img تغییر می ده.

public   void  setSelectedIndex(int   index,boolean    selected)d

آیتم موجود در اندیس index رو در حالت انتخاب یا عدم انتخاب قرار می ده . (بسته به مقدار selected ، اگه selected برابر با true باشه آیتم مورد نظر در حالت انتخاب قرار می گیره و اگه selected برابر با false باشه آیتم مورد نظر در حالت عدم انتخاب قرار می گیره)

public    int  size()d

تعداد اعضای لیست رو بر می گردونه.

و اما یه نکته دیگه : به لیست هم میشه Ticker اضافه کرد:

public  void  setTicker(Ticker   ticker)d

فعلاً برای این جلسه بسه دیگه :) ، می خواستم یه کده دیگه هم بزنم ولی حسش نیست :) همینقدر فعلاً کافیه :) :) :)


جلسه چهارم :

بریم ادامه کار.....

منتهی قبلش من یه نکته ای رو بگم ، من ویندوزم ترکیده ،فعلا حسش هم نیست برم درستش کنم

اینه که از این به بعد دارم از تو لینوکس بهتون آموزش می دم و تفاوت اینجاست که قبلا با J2ME SDK 3 شبیه سازی می کردیم ولی الآن با Sun Java(TM) Wireless Toolkit 2.5.2 شبیه سازی می کنیم :) ، چی گفتم؟؟؟ هیچی خیلی مهم نیست جلوتر عکس ها رو می بینید متوجه میشید :)) ، در کل اتفاق خاصی نیفتاده خودتونو نگران نکنید:)

TextBox :

وسیله ایه برای گرفتن متن از کاربر.زیر کلاسه Screen هست و تمام صفحه (یعنی کله صفحه رو می گیره).

برای ایجاد TextBox فقط یه سازنده وجود داره ، اونم به صورت زیره:

TextBox (String  title , String text,int maxSize ,int constraint)d

پارامتر اول عنوانشه ، پارامتر دوم متنه پیش فرضشه ، پارامتر سوم حداکثر تعداد کاراکتر هایی که کاربر می تونه تایپ کنه رو نشون می ده و پارامتر آخر محدودیته!!!

اون پارامتر آخریه می تونه موارد زیر باشه:

0

وقتی محدودیت صفر باشه هر چرتی می شه توی TextBox تایپ کرد.

1

وقتی محدودیت یک باشه تو TextBox  میشه هر چیزی که مثله آدرس ایمیل باشه تایپ کرد.

2

وقتی محدودیت ۲ باشه فقط عدد میشه تایپ کرد.

3

وقتی محدودیت رو رو ۳ تنظیم کنیم تو TextBox فقط شماره تلفن میشه وارد کرد.

4

۴ باشه یعنی URL

5

۵ باشه میشه عدد رو به صورت Decimal وارد کرد مثل 2.4- و ...

ولی خب این عدد ها رو که نمیشه حفظ کرد :)) ، در عوض میشه از مقادیر زیر استفاده کرد:

TextField.ANY

همون هرچیه

TextField.EMAILADDR

همون ای میل آدرسه که گفتم

TextField.NUMERIC

اینم که معلومه یعنی چی:)

TextField.PHONENUMBER

اینم بگم؟؟معلومه دیگه :)

TextField.URL

اینم توضیح نمی دم ، بالا اشاره شد بهش دیگه :)

TextField.DECIMAL

توضیحات این رو هم می پیچونم :)

ولی واقعاً خنده است ، حساب کنید یکی که تازه داره شروع می کنه به کار کردن از کجا باید بدونه که چیزی مثل TextBox.NUMERIC وجود نداره و برای محدودیت ها باید از محدودیت های TextField استفاده کنه؟؟؟


آها یکی دیگه هم هست که با حاله و میشه به عنوان محدودیت ازش استفاده کرد

TextField.PASSWORD

محدودیت رو اگه رو این تنظیم کنید متنی که دارید وارد می کنید نشون داده نمیشه

يه کد می زنیم بقیه مقادیر رو ولی خودتون آزمایش کنید که خوب دستتون بیاد


setCurrent رو که قبلاً نوشته بودیم همونه :)

یه TextBox ایجاد کردیم و به صورت Password محدودیتش رو تعیین کردیم.

اینم خروجیش :


دیگه یه ساعت چی رو نگاه می کنید؟؟؟ :)) پسورد ایه دیگه :))


خب یه چند تا از متد های TextBox رو هم اسم ببرم و سریع پرونده اش رو ببنیدم !

public void  delete (int  offset , int length)d

برای حذف قسمتی از متن موجود در TextBox  به کار میره به این صورت که از اندیسه offset به بعد به اندازه length یه متن از متن اصلی حذف میشه .(حالا جلوتر مثال می زنم بهتر جا می افته)

public  int getChars(char[] data)d

متن داخل TextBox رو به صورت آرایه ای از کاراکتر ها در آرایه data ذخیره می کنه. (نه که الزاماً اسمش data باشه ها :دی ، منظور همون پارامتر ورودی تابع است :دی ، دیگه همتون جاوا کارید می دونید چی می گم :دی :دی ) و طول متن رو بر می گردونه

public   int   getMaxSize()d

حد اکثر اندازه متن مجازی که برای TextBox  مشخص کرده بودیم رو بر می گردونه ، توجه کنید این با طول متنی که کاربر وارد می کنه فرق داره ، کاربر می تونه یه متن با اندازه کمتر از این وارد کنه.

public  String  getString()d

متن داخل TextBox  رو به صورت یه String بر می گردونه، کاربردش مثله getChars هست دیگه منتهی هر موقع از هر کدوم که راحت تر بودید می تونید استفاده کنید.


public  void  insert(String   src,int  position)d

متن src رو بعد از موقعیت position تو متن اصلی درج می کنه.

public  void  insert(char[]  data,int  offset,int  length , int  position)d

این متد هم مثله قبلیه است منتهی انعطاف پذیریش بیشتره ، به این صورت که به جای اینکه کل متن موجود در data  بعد از موقعیت position درج شه می تونیم کاری کنیم که فقط یه زیر آرایه از data کپی شه ، یعنی فقط یه قسمت خاصی از data که این قسمت خاص از اندیس offset شروع میشه به طول length  .

public  void  setString(String txt)d

متن TextBox رو تغییر میده.

public  int  size()d

طول متن TextBox  رو بر می گردونه.

متد پتد باز هم هست و من همشونو اسم نبردم ، فعلاً همینا بسه دیگه :)

بهتر اینه که با اینا کد بزنیم که بیاد دستمون.

مثال :

تو این مثال یه TextBox ایجاد می کنم. یه متن پیش فرض هم براش می زارم. یه Commnad هم بهش اضافه می کنم که از یه اندیس خاص با یه طوله خاص متن رو حذف کنه.(اوکی؟)


به کد خوب توجه کنید.

اول یه متن ایجاد کردم تو متغیر text ذخیره اش کردم.

بعد یه TextBox  ایجاد کردم ، سازنده اش رو قبلاً توضیح دادم پس مشکل خاصی نیست تا اینجا.

یه Command ایجاد کردم با عنوان DO که این کار رو هم خیلی وقته یاد گرفتیم :دی

Command رو به TextBox  امون که همون tb  هست اضافه کردم و بعد هم به tb یه CommandListener اضافه کردم.

حالا داخل commandAction یه کم مهمه.اول یه اشاره گر به TextBox به دست میاریم (این کار رو هم جلسه های قبل یاد گرفتیم ، یعنی قبلاْ یاید گرفته بودیم که چی جوری با پارامتر d کار کنیم، یادتونه که؟ )

و delete رو فراخوانی کردم باید متنمون از اندیس ۳ به بعد به طول ۵ حذف بشه. توجه کنید که اندیس از صفر شروع میشه پس به خروجی حتماً توجه کنید.

setCurrnet هم که توضیح نمی خواد.

این خروجی قبل از فشار دادن DO:



و این هم خروجی بعد از فشار دادن DO برای دفعه اول (خوب توجه کنید متن از کجا تا کجا حذف شده)



مثال :

این مثال رو هیچ توضیحی نمی دم خودتون فقط نگاه کنید !


مثال :

اول کد رو ببینیم بعد توضیح بدم :)


خب ببینید که اول یه TextBox ایجاد کردم با همون متن قبلیه ولی این بار حد اکثر طول رو به ۴۰ افزایش دادم

یه Command  اضافه کردم که اصلاً چیزه مهمی نیست.

تو commandAction خیلی مهمه.

اول یه آرایه ایجاد کردم که متنش ABCDEFGHIJKLM‌ هست.

زیر آرایه ای از این آرایه که از اندیس ۳ شروع می شه و به طول ۵ هست میشه چی؟ بله میشه DEFGH (توجه کنید اندیس از صفر شروع میشه ها) .حالا این زیر آرایه رو تو موقعیت ۷ از متن اصلی درج می کنیم. میشه کجا؟ خودتون ببینید (باز هم دقت کنید اندیس از صفره ها!)

این خروجی قبل از فشار دادن insert   :



و این هم خروجی بعد از فشار دادن insert : (البته بعد از اولین بار)



بقیه متد ها رو هم خودتون سر و کله بزنید، چیزی نداره که! :) راست می گم!

خب فعلاً بسه دیگه :)) روزه اول عیده بیشتر از این حسش نیست چیزی بنویسم :)

سال نوتون هم مبارک :دی









گزارش تخلف
بعدی