به نام خدا
سلام دوست من، در جلسات گذشته در مورد درک و استخراج مفاهیم جاوا یک مسئله و با محیط و امکانات برنامه Netbeans برای طراحی ظاهر گرافیکی یک برنامه ویندوزی آشنا شدیم و توانستیم ظاهر گرافیکی پروژه برنامه نمایش عکس در جاوا را طراحی کنیم. تصویر(1)
خب ممکنه براتون سوال پیش بیاد که چرا ظاهر گرافیکی برنامه چندان زیبا نیست؟بله حق با شما است با وجود این که با اضاف کردن image ها به دکمه ها، فریم و پنل برنامه باز ظاهر برنامه اون ظاهر زیبا و مدرنی که برنامه های امروزی دارند را ندارد! دلیلشم اینه که ما داریم از کتابخانه گرافیکی Swing در جاوا استفاده میکنیم و این کتابخانه تقریبا قدیمی شده است! و در حال حاضر JAVAFX جایگزین Swing در جاوا شده است که برنامه هایی با ظاهر گرافیکی شیک و مدرنی را میتوانید از طریق آن طراحی کنید. خب چرا Swing رو دارید آموزش میدید؟! چون در دانشگاه هنوز هم دانشجویان برای تحویل پروژه گرافیکی جاوای خود از Swing استفاده میکنند و برای این که دانشجوها مجبور نباشند چند صد هزار تومن! پول بدهند براشون بیرون پروژه شون رو بنویسند تصمیم به آموزش Swing به صورت پروژه محور گرفتیم. اما این را بدانید که مهم یادگیری الگوریتم پیاده سازی یک پروژه برنامه نویسی هست و بعدش با هر کتابخانه ای مثل javafx میتونید با گرافیک بهتری ظاهر برنامه را طراحی کنید وگرنه عملیاتی که برنامه برامون انجام میده هیچ فرقی نمیکند که از Swing یا Javafx استفاده کنیم.
خب بگذریم.... ظاهر گرافیکی برنامه رو طراحی کردیم حالا میریم سراغ کدنویسی کارایی که صورت مسئله ازمون خواسته است.
ما در جلسه دوم صورت مسئله را بررسی کردیم و مفاهیم مورد نیاز برای ساخت برنامه نمایش عکس در جاوا را استخراج کردیم.
صورت مسئله به صورت زیر است: تصویر(2)
نکته :جلسه دوم آموزش پروژه محور نمایش عکس در جاوا را قبلش یک مروری کنید که یادتون بیاد چه مفاهیمی را استخراج کردیم.
طبق برداشتی که از مسئله داشتیم این بود که ما یک کلاس با نام عکس داریم که ویژگی ها و رفتارهای خاص خودش را داشت.
پس در برنامه netbeans و در بخش پروژمون که اسمش view photo بود و در پکیج photo.view قصد داریم یک کلاس با نام picture ایجاد کنیم. برای این کار روی پکیج photo.view کلیک سمت راست میکنیم و از بخش New گزینه Java Class… را انتخاب میکنیم: تصویر(3)
و بعد مطابق با تصویر(4) اسم کلاس خود را "Picture" انتخاب میکنیم :
بعد کارایی که در تصاویر(3) و (4) برای ایجاد یک کلاس ایجاد کردیم نتیجه به صورت تصویر(5) خواهد بود:
✔ همان طور که در تصویر(5) مشاهده میکنید یک کلاس با نام Picture ایجاد کردیم که درون پکیج view.photo قرار گرفته است.
✔ دوستان من دیگه تصویر کدها رو براتون قرار میدم و برای دسرسی به سورس کدهایی که در هر جلسه آموزشی بررسی میکنیم به صورت جداگانه در کنار پی دی اف آموزشی براتون به اشتراک میگذارم. یعنی فایل آموزشی هر جلسه شامل یک پی دی اف + یک فلودر سورس کدی است که در ان جلسه اموزش داده ام...اگر داری این پی دی اف آموزشی را میخوانی و دسرسی به فولدر سورس کد آن نداری کافی که از سایت javapro.ir از بخش جاوا و آموزش پروژه محور آن را دانلود کنید.
حالا برای کلاس Picture قصد داریم سه ویژگی زیر را فعلا تعریف کنیم:
• عرض (width)
• ارتفاع(height)
• تصویر(image)
خب تا اینجا کلاس Picture ما به صورت زیر خواهد بود: تصویر(6)
✔ خب ما قراره از کامپیوتر تعدادی عکس بگیریم و در برنامه مون نمایش بدهیم. پس نیاز به یک کلاس داریم که با شی ساختن از آن بتوانیم عکس های خوانده شده از کامپیوتر را درون شی آن بریزیم. نگران نباشید جلوتر متوجه میشید چه اتفاقی قراره بیفته 😃
توضیحات تصویر(6)
✔ خط 9 تا 10 پکیج های مورد نیاز برای استفاده از Arraylist و BufferedImage در کلاسمون را import کرده ایم.
✔ BufferedImage چیست؟ BufferedImage کلاسی است که برای خواندن فایل تصویری از آن استفاده میکنیم.
✔ خط 17 عرض عکس و خط 18 ارتفاع عکس و خط 19 لیست فایل های تصویری که از کامپیوتر میخوانیم یا همون عکسامون را در خود ذخیره میکند.
✔ خب ما میخوایم اندازه همه عکس هامون یک مقدار ثابت غیر قابل تغییر باشد به همین خاطر در خط 17 و 18 متغیرهای width و height را مقداردهی اولیه کرده و از نوع final تعریف کرده ایم.
✔ امکان داره جلوتر نیاز داشته باشیم ویژگی یا متدی را به کلاس Picture اضاف یا کم کنیم فعلا تا اینجا دست نگه میداریم و سراغ کلاس MainClass برنامه مون میریم. روی MainClass.java دابل کلیک میکنیم تا باز شود و بعد از بخش Source وارد سورس کد آن میشویم. تصویر(7)
✔ تصویر(7) بخشی از کدهای موجود در کلاس MainClass را نمایش میدهد،باز تاکید میکنم تمام سورس کدهای هر جلسه آموزشی را در فولدری جداگانه در کنار پی دی اف اموزش برای شما قرار دادم تا بتوانید به راحتی آنها را Run کنید.
✔ خب به صورت مسئله بازگردیم،در صورت مسئله گفته شده از طریق منو open عکس های خود را از محلی ازکامپیوتر بخوانید و درون برنامه نمایش دهید. برای این کار در بدنه کلاس MainClass دستوراتی را تعریف میکنیم که عکس هامون را از کامپیوتر بخواند.
✔ ابتدا باید دستوراتی وجود داشته باشد که با زدن آیتم منو open یک FileChooser باز شود و از طریق آن بتوان عکس هامون را در کامپیوتر پیدا کنیم و آنها را بخوانیم. برای این کار یک متد با نام getPathImageFile در بدنه کلاس MainClass تعریف میکنیم و دستوراتی را برای آن مینویسیم: تصویر(8)
توضیحات تصویر(8):
کار متد getPathImageFile چیست؟ این متد یک FileChooser ایجاد میکند که از طریق آن میتوان فایل های خود را از کامپیوتر پیدا کرده و بخوانیم. چیزی شبیه تصویر(9)
💠 کاربرد دستور موجود در خط 37 تصویر(8) چیست؟
fc.setMulti select ionEnabled(true); |
✔ اگر در جاوا قصد گرفتن بیش از یک فایل از کامپیوتر را داشته باشید مقدار این دستور را باید true بگذارید.
💠 کاربرد دستور موجود در خط 38 تصویر(8) چیست؟
int i = fc.showOpenDialog(this); |
✔ برای استفاده از عملیات open در FileChooser از این دستور استفاده میکنیم.
💠 کاربرد دستور موجود در خط 40 تصویر(8) چیست؟
File[] f = fc.get select edFiles(); |
✔ با دستور فوق فایل هایی که از کامپیوتر را انتخاب کردیم درون آرایه ای از نوع File میریزیم. لازم به ذکر است فایل از هر نوعی میتواند باشد. که در این برنامه قراره فایل های تصویری را دریافت کنیم.
💠 کاربرد دستور موجود در خط 42 تصویر(8) چیست؟
✔ خب متد به گونه ای تعریف شده است که یک مقداری را برمی گرداند و این مقدار از نوع آرایه ای از نوع File است.
💡 تا اینجا در کلاس MainClass متدی را تعریف کردیم که کار گرفتن و خواندن فایل هامون رو از کامپیوتر انجام میده حالا سراغ دستوراتی میرویم که فایل های تصویری خونده شده از کامپیوتر رو در یک لیستی از تصاویر موجود در کلاس Picture ذخیره کند. تصویر(10)
بررسی تصویر(10) و متد readImage:
💡 توضیح کلی در مورد کاربرد متد readImage : کار این متد ایجاد لیستی از فایل های تصویری برای ذخیره فایل های تصویری خوانده شده از کامپیوتر است. به عبارت دیگر فایل هایی تصویری یا همون عکس هامون رو که از طریق متد getPathImageFile از کامپیوتر میخوانیم را دونه به دونه در خانه های لیست مون ذخیره میکنیم.
💠 در خط 49 دستور زیر را داریم:
pic.image=new ArrayList<BufferedImage>(); |
✔ شی pic چیه و از کجا اومده؟ شی pic از نوع کلاس Picture است. ما در بدنه کلاس MainClass از کلاس Picture یک شی با نام pic ایجاد کرده ایم. تصویر(11)
✔ در تصویر(11) در خط 24 در بدنه کلاس MainClass از کلاس Picture یک شی با نام pic ایجاد کرده ایم، چرا؟ ما قصد داریم فایل های تصویری که از کامپیوتر میخوانیم در لیست تصویری موجود در کلاس Picture ذخیره کنیم.به همین دلیل نیاز به ساخت یک شی از نوع کلاس Picture داریم که از طریق اون به لیست تصویری موجود در کلاس Picture دسرسی داشته باشیم.
💠 برگردیم به خط 49 موجود در تصویر(10):
pic.image=new ArrayList<BufferedImage>(); |
✔ خب با شی pic که حالا میدونیم از کجا اومده شی image که از ArrayListاز نوع BufferedImage است و در کلاس Picture واقع شده را صدا میزنیم و سمت راست مساوی با صدا زدن کلمه کلیدی new و سازنده ArrayList از نوع BufferedImage یک لیست image میسازیم که توانایی ذخیره هر تعداد فایل تصویری را خواهد داشت. چرا از ArrayList استفاده کردیم و از آرایه استفاده نکردیم؟ زیرا ما نمیدونیم کاربر چه تعداد فایل تصویری قراره از کامپیوتر بخواند به همین دلیل بهترین ساختمان داده برای ذخیره فایل های تصویری خوانده شده از کامپیوتر که تعدادشون را نمیدانیم کلاس ArrayList است.
بررسی خط 52 موجود در تصویر(2):
BufferedImage im = null; |
✔ یک شی از کلاس BufferedImage تعریف کرده و مقداردهی اولیه null کردیم. این شی قراره فایل های تصویری مون رو تک به تک داخلش بریزیم.
💠 بررسی خط 53 موجود در تصویر(10):
File[] files=getPathImageFile(); |
✔ همان طور که میدانید متد getPathImageFile فایل هامون رو از کامپیوتر میخواند و در نهایت همه فایل های خوانده شده را در قالب آرایه ای از نوع File بهمون برمیگرداند و ما این فایل هایی که بهمون پس میده را در یک ارایه ای از نوع File ذخیره میکنیم.
💠 بررسی خط 55 تا 64 موجود در تصویر(10):
for(int j=0;j<files.length;j++){ pic.image.add(im); |
✔ همان طور که میدانید ما فایل هایی که از کامپیوتر خواندیم را درون آرایه ای با نام files که از نوع کلاس Fileهست ذخیره کردیم.
✔ دستور ImageIO.read کارش به صورت تخصصی خوندن فایل های تصویری از محلی از کامپیوتر است.
✔ ما فایل هامون رو از کامپیوتر خواندیم اما این فایل های خوانده شده با وجودی که تصویری است برای نمایش در برنامه بکارمون نمیاد! چرا؟! چون ما فایل هایی که از نوع BufferedImage هستند را میتونیم روشون کار کنیم و مثلا در برنامه نمایش بدیم و نمیتونیم فایل هایی که از نوع کلاس File هستند با وجود تصویری بودنشان در برنامه نمایش بدهیم. چرا؟ چون اشیا از نوع File را نمیتوان به اشیا از نوع BufferedImage تبدیل کرد. ما از طریق متد getPathImageFile تنها میتوانیم فایل های موجود در کامپیوترمون را در قالب نوع کلاس File یعنی با هر نوع فرمتی که باشه بخوانیم.
✔ حالا در متد readImage قصد داریم تک به تک به ادرس فایل هایی که از کامپیوتر خواندیم دسرسی پیدا کنیم و با دستور ImageIO.read تک به تک فایل های تصویری مون رو دوباره بخوانیم و توی شی از نوع کلاس BufferedImage بریزیم.
✔ با یک حلقه for خانه های آرایه files را پیمایش میکنیم و به تک به تک فایل هایی که از کامپیوتر خواندیم دسرسی پیدا میکنیم.
im = ImageIO.read(new File(files[j].getPath())); |
✔ متد getPath آدرس محل کامپیوتری هر فایل ذخیره شده در آرایه files را به ما برمی گرداند. و مقدار داده شده را ما در شی جدیدی که از نوع کلاس File که new شده است میریزیم. و حالا از طریق دستور ImageIO.read فایل تصویری مون رو از کامپیوتر میخوانیم و درون شی im که از نوع کلاس BufferedImage است میریزیم.
pic.image.add(im); |
✔ حالا تک به تک فایل های تصویری که از نوع BufferedImage است را در ArrayList مون که نامش image است ذخیره میکنیم.
✔ از دستور try-catch برای کنترل استثناهای احتمالی مربوط به خواندن فایل هامون استفاده کردیم.
نتیجه گیری کلی در مورد متد های getPathImageFile و readImage :
شاید توضیحات من گیج کننده باشه در بالا اما در کل هدف از این دو متد این است که
1. از طریق اون فایل هامون رو به صورت دستی از کامپیوتر انتخاب کنیم کاربرد منو open
2. بعد حالا فایل هایی که از کامپیوتر خواندیم را آدرس هاشون رو به دست بیاریم که کجای کامپیوتر قرار دارند.
3. بعد حالا از طریق آدرس های به دست آمده از فایل ها دوباره با دستوری که کارش خوندن فایل های تصویری است فایل های تصویری خود را بخوانیم
4. در نهایت فایل های تصویری خوانده شده خود را به لیست تصاویر خود اضاف کنیم.
این جلسه آموزشی تا اینجا کافیه، سورس کدهای این جلسه آموزشی رو در کنار پی دی اف براتون به اشتراک گذاشته ام.اگه الان داری این کتابو میخونی و نمیدونی سورس کدش کجاست اینجا کلیک کن و به جلسه شش آموزش پروژه محور برنامه نمایش عکس در جاوا سر بزن.
دوست من آرزوی سعادت و کامیابی رو برات دارم،خدانگهدار
این جلسه آموزشی را میتوانید بصورت کتاب الکترونیکی (PDF شده) در لینک زیر دریافت کنید.
این جلسه آموزشی را بصورت کامل و مرتب شده در لینک زیر دانلود کنید:(در صورت خرابی لینک گزارش دهید)
لینک دانلود کتاب + سورس کد این جلسه آموزشی
نشر این مطلب با ذکر منبع (لینک سایت) بلامانع است.
برای با خبر شدن از جدیدترین مطالب آموزشی جاوا عضو کانال تلگرام ما شوید.
بستن *نام و نام خانوادگی * پست الکترونیک * متن پیام |
دوره های آموزشی برنامه نویسی
انجام پروژه های برنامه نویسی
تدریس خصوصی برنامه نویسی
بیش از 7 سال از فعالیت جاواپرو میگذرد
جاواپرو دارای مجوز نشر دیجیتال از وزارت فرهنگ و ارشاد اسلامی است
جهت ارتباط مستقیم با جاواپرو در واتساپ و تلگرام :
09301904690
بستن دیگر باز نشو! |