پلتفرم Java SE با محیط توسعه IDE) NetBeans) ؛ (11)

وقتی یک فرم ایجاد می کنیم درواقع این یک فریم است. یک فریم خالی ایجاد کردیم و فقط از کادر آبی رنگ آن می توان استفاده کردو از فضای داخل آن نمی توان استفاده کرد. مثلا نمی توان به پس زمینه ی آن رنگ نسبت داد. هر چند که
چهارشنبه، 11 دی 1392
تخمین زمان مطالعه:
موارد بیشتر برای شما
پلتفرم Java SE با محیط توسعه IDE) NetBeans) ؛ (11)

پلتفرم  Java SE  با محیط توسعه ی(IDE) NetBeans(11)

 

مترجم : حبیب الله علیخانی
منبع:راسخون



 

JPanel(پنل):

وقتی یک فرم ایجاد می کنیم درواقع این یک فریم است. یک فریم خالی ایجاد کردیم و فقط از کادر آبی رنگ آن می توان استفاده کردو از فضای داخل آن نمی توان استفاده کرد. مثلا نمی توان به پس زمینه ی آن رنگ نسبت داد. هر چند که در این حالت می توان از متد SetBackgrauond() استفاده کرد، علت آن این است که این متد به کتابخانه ی Java.AWT برمی گردد و همانطور که در قسمت Swing گفته شد تمامی کتابخانه های swing مبتنی بر AWT است(همان اپلت های جاوا) و چون کلاس JFrame از روی کلاس Form مشتق شده، در هر شرایطی این متد را دارد اما کاری انجام نمی دهد.
در تمامی زبانهای برنامه نویسی اشیا همدیگر را احاطه می کنند. Form ، Panel را احاطه می کند و panel ، تمام panel های داخلی و آنها تمام دکمه ها و.....
پس برای حل این مشکل از کلاس JPanle استفاده می کنیم. (کلاس JPanel ازکتابخانه ی Javax.swing است) .
پروژه ی بخش swing (بخش قبل) را دنبال می کنیم که کد های زیر را در کلاس Main دارد:

پلتفرم  Java SE  با محیط توسعه ی(IDE) NetBeans(11)
این کار را به دو صورت می توان انجام داد. یک راه استفاده از پنجره ی Palette در صفحه ی Design است و با درگ و دراپ می توان به هر تعداد که می خواهیم Panel قرار دهیم. (البته اگر کلاس ما از JFrame ارث بری می کند یعنی JFram ساخته باشیم). اگرنخواهیم از Panel آماده استفاده کنیم و بخواهیم با کدنویسی انجام دهیم به صورت زیر عمل می کنیم:
ابتدا از کلاس JPanel نمونه می گیریم و سپس به آن رنگ زمینه(زرد) نسبت می دهیم(با استفاده از متد setBackground ) و در آخر برای استفاده آن در JFrame باید آن را به JFrame نسبت دهیم (با استفاده از متد add):

JPanel jpanel1 = new JPanel();
jpanel1.setBackground(Color.YELLOW);
frame1.add(jpanel1);

کدهای بالا را به پروژه ی قبلی وارد می کنیم و اجرا می کنیم :
وقتی از کلاس JPanel نمونه می گیریم، علامت hint در سمت چپ ظاهر شده که می بینیم می گوید JPanel را نمی شناسد و باید javax.swing.JPanel را Import کنیم. با کلیک کردن آن به صورت خودکار وارد می کند.
و قتی از Color استفاده می کنیم ، علامت hint در سمت چپ ظاهر شده که می بینیم می گوید Color را نمی شناسد و باید Java.AWT.Color را Import کنیم.با کلیک کردن آن به صورت خودکار وارد می کند.

پلتفرم  Java SE  با محیط توسعه ی(IDE) NetBeans(11)
سپس اجرا می کنیم و خروجی به صورت زیر خواهد بود:

پلتفرم  Java SE  با محیط توسعه ی(IDE) NetBeans(11)
دیدیم که با متد add() پنل را به Frame نسبت دادیم. اما بهتر است که برای پنل از متد setContentPane() استفاده کنیم و برای کامپوننت های دیگر مثل Button از add استفاده کنیم. خط مربوط به متد add() را کامنت می کنیم :

پلتفرم  Java SE  با محیط توسعه ی(IDE) NetBeans(11)
و اگر اجرا بگیریم خروجی مثل بالا می شود.
با استفاده از متد setContentpane() می توانیم از متد setBackground() هم به گونه ای دیگر استفاده کنیم. خط مربوط به متد setBackground() را کامنت می کنیم و دستورات زیر را اضافه می کنیم:

frame1.getContentPane().setBackground(Color.red);


پلتفرم  Java SE  با محیط توسعه ی(IDE) NetBeans(11)
اکنون دوباره اجرا می کنیم، می بینیم همان کار قبلی را انجام داد و خروجی به صورت زیر می شود:

پلتفرم  Java SE  با محیط توسعه ی(IDE) NetBeans(11)

button(دکمه):

این کار را به دو صورت می توان انجام داد. یک راه استفاده از پنجره ی Palette در صفحه ی Design است و با درگ و دراپ می توان به هر تعداد که می خواهیم Button قرار دهیم. (البته اگر کلاس ما از JFrame ارث بری می کند یعنی JFram ساخته باشیم). اگرنخواهیم از Button آماده استفاده کنیم و بخواهیم با کدنویسی انجام دهیم به صورت زیر عمل می کنیم:
پروژه ی قبلی را دنبال می کنیم و ابتدا از کلاس JButton نمونه می گیریم به نام jbtn1 :

JButton jbtn1=new JButton();

JButton یک کامپوننت از پکیج Javax.swing می باشد.
وقتی از کلاس JButton نمونه می گیریم، علامت hint در سمت چپ ظاهر شده که می بینیم می گوید JButton را نمی شناسد و باید javax.swing.JButton را Import کنیم. با کلیک کردن آن به صورت خودکار وارد می کند.
Button در متد سازنده ی خود 4 تا overload دارد. در بخش سازنده ها این مطلب را کاملا توضیح دادیم که سازنده مقادیر پیش فرض را برای Field های کلاس ایجاد کند. هر کدام ازاین 4 ، overload برای منظور های مختلفی به کار می روند. در اینجا ما از JButton(String text) استفاده می کنیم و متنی که می خواهیم روی button نمایش دهد را در قسمت String text تایپ می کنیم. (در این مثال می خواهیم دکمه ی OK را بسازیم)

پلتفرم  Java SE  با محیط توسعه ی(IDE) NetBeans(11)
بعد از ساختن نمونه، اگرپروژه را اجرا کنیم Button را نمایش نمی دهد. چون باید آن را به JPanel نسبت دهیم یا add کنیم:

jpanel1.add(jbtn1);

این قسمت از کد به صورت زیر می باشد:

پلتفرم  Java SE  با محیط توسعه ی(IDE) NetBeans(11)
که اگر پروژه را اجرا کنیم خروجی به شکل زیر است:

پلتفرم  Java SE  با محیط توسعه ی(IDE) NetBeans(11)
با کلیک کردن آن هیچ عملی صورت نمی گیرد.
اکنون Button دیگری به نام Cancel به پروژه اضافه می کنیم :

پلتفرم  Java SE  با محیط توسعه ی(IDE) NetBeans(11)
وقتی در اجرا اندازه ی فرم را تغییر دهیم این دو دکمه به طور اتواماتیک در وسط قرار می گیرد. یعنی چیدمان همیشه از وسط انجام می شود.
مانند ادیتور word تا زمانیکه سطر اول استفاده نشود به سطر های دیگر دسترسی ندارد مگر با Enter کردن به سطر های بعدی می رود. در اینجا هم همینطور است که اشیا تا وقتی که ردیف اول پر نشود به ردیف بعدی دسترسی ندارند.
اشیا مال JPanel هستند و برای JFrame نیستند. یعنی پدر(parent) آنها JPanel است.
در اینجا Layout مطرح می شود. Layout یعنی آرایش یا ترتیب وسایل یا طرح بندی. Layout ها مال پکیج Java.AWT است. ما ابتدا این پکیج را به پروژه import می کنیم تا همه ی کلاسهای Layout را نمایش دهد. وقتی که Layout مورد نظر را انتخاب کردیم خودش پکیج مربوط به آن را import می کندو بعد از آن پکیج کلی java.awt.LayoutManager را حذف می کنیم:

پلتفرم  Java SE  با محیط توسعه ی(IDE) NetBeans(11)
برای استفاده از این Layout ها باید از انها نمونه بسازیم چون کلاس هستند و برای استاده از کلاسها نمی توان از نام آنها استفاده کرد، باید از نمونه ی آنها استفاده کرد. و سپس آن را به اشیا نسبت می دهیم. مثلا می خواهیم در زیر BorderLayout را به JPanel1 نسبت دهیم. دستور زیر را تایپ می کنیم:

) jpanel1.setLayout(New

وقتی بعد از تایپ New ، CTRL+Space را می زنیم، می بینیم کلاسهای Layout زیادی وجود دارند مانند:

پلتفرم  Java SE  با محیط توسعه ی(IDE) NetBeans(11)
FlowLayout : Layout جاری ای است که در حال حاضر در حال استفاده است.
GridLayout : به صورت جدول تمام سطر ها را تقسیم می کند.
BorderLayout : تمام فرم را پوشش می دهد.
و....
اکنون به عنوان تمرین، از بین این لیست ارائه شده BorderLayout را انتخاب می کنیم. بعد از انتخاب آن پکیج مربوط به آن import می شود(java.awt.BorderLayout). همانطور که در بالا گفته شد اکنون پکیج java.awt.LayoutManager دیگر بلا استفاده است و ما آن را حذف می کنیم.
پس کد به صورت زیر می شود:

پلتفرم  Java SE  با محیط توسعه ی(IDE) NetBeans(11)
سپس اجرا می کنیم و خروجی زیر را می دهد:

پلتفرم  Java SE  با محیط توسعه ی(IDE) NetBeans(11)
این خروجی نشان می دهد که دکمه ی Cancel کل فرم را فرا گرفته است. این خصوصیت BorderLayout است.
اگر GridLayout را انتخاب کنیم، (پکیج آن اضافه شد) ، خروجی به صورت زیر می شود:

پلتفرم  Java SE  با محیط توسعه ی(IDE) NetBeans(11)
که به صورت جدول تمام سطر ها را تقسیم کرد. اگر تعداد دکمه ها بیشتر باشد، به تعداد آنها تقسیم می کند.
حال به قبل بر می گردیم و می خواهیم دو دکمه ی Ok و Cancel در مکان خاصی قرار گیرند. برای این کار ابتدا ، 1- پارامتر ورودی متد setLayout را null قرار دهیم و 2- سپس برای دکمه ها موقعیت مکانی تعریف می کنیم.
اگر ما پارامتر ورودی متد setLayout را null قرار دهیم ، هیچ Layout ای را نمی پذیرد. خروجی به صورت زیر می شود : (کد آن در کادر نارنجی)

پلتفرم  Java SE  با محیط توسعه ی(IDE) NetBeans(11)
وقتی Layout پنل دربرگیرنده را null کنیم، تمام اشیا درون آن هیچ ابعاد و موقعیت مکانی ندارند و دیده نمی شوند.
حال می خواهیم بگوییم که این دکمه ها چه ابعادی داشته باشند و در چه موقعییت ای قرار گیرند. برای این کار از متد setBound() استفاده می کنیم، همانگونه که برای شی frame1 این کار را انجام داده ایم. مانند تصویر زیر، اعداد را وارد کردیم و اجرا کردیم:

پلتفرم  Java SE  با محیط توسعه ی(IDE) NetBeans(11)
دیدیم که سایز هر دو دکمه ی Ok و Cancel متفاوت و در موقعیت مختلف قرار گرفتند. اگر سایز دکمه ی Cancel را کوچکتر از متن آن تعریف کنیم به صورت زیر نشان داده می شود:

پلتفرم  Java SE  با محیط توسعه ی(IDE) NetBeans(11)
بخش JButton و JPanel در اینجا به پایان می رسد.
استفاده از مطالب این مقاله با ذکر منبع راسخون بلامانع می باشد.



 

 



مقالات مرتبط
نظرات کاربران
ارسال نظر
با تشکر، نظر شما پس از بررسی و تایید در سایت قرار خواهد گرفت.
متاسفانه در برقراری ارتباط خطایی رخ داده. لطفاً دوباره تلاش کنید.
موارد بیشتر برای شما
نتانیاهو در سازمان ملل باز هم تابلو و نقشه از ایران به نمایش گذاشت!
play_arrow
نتانیاهو در سازمان ملل باز هم تابلو و نقشه از ایران به نمایش گذاشت!
پیام صوتی کودک ایرانی خطاب به امام حسین (ع)
play_arrow
پیام صوتی کودک ایرانی خطاب به امام حسین (ع)
ماجرای عصبانیت رهبر انقلاب از بنی‌صدر از زبان محسن رضایی
play_arrow
ماجرای عصبانیت رهبر انقلاب از بنی‌صدر از زبان محسن رضایی
شنیده شدن صدای تیراندازی در هنگ مرزی منطقه تهلاپ میرجاوه
play_arrow
شنیده شدن صدای تیراندازی در هنگ مرزی منطقه تهلاپ میرجاوه
گزارش یک جنگ
play_arrow
گزارش یک جنگ
مسئول رسانه‌ای حزب‌الله: سیدحسن نصرالله در محل حمله نبوده و در سلامت است
play_arrow
مسئول رسانه‌ای حزب‌الله: سیدحسن نصرالله در محل حمله نبوده و در سلامت است
وحیدی، فرمانده پیشین نیروی قدس سپاه در شبکه خبر: هر فرمانده‌ای شهید می‌شود فرمانده‌ای دیگر به میدان می‌آید
play_arrow
وحیدی، فرمانده پیشین نیروی قدس سپاه در شبکه خبر: هر فرمانده‌ای شهید می‌شود فرمانده‌ای دیگر به میدان می‌آید
جمله مهم رئیس کمیسیون امنیت ملی مجلس روی آنتن شبکه خبر: اسرائیل با اقدام امروز، دروازه جهنم را به روی خود باز کرد
play_arrow
جمله مهم رئیس کمیسیون امنیت ملی مجلس روی آنتن شبکه خبر: اسرائیل با اقدام امروز، دروازه جهنم را به روی خود باز کرد
نظامیان صهیونیست به کدام مناطق در لبنان حمله کردند؟
play_arrow
نظامیان صهیونیست به کدام مناطق در لبنان حمله کردند؟
ترک مجمع سازمان ملل هنگام سخنرانی نتانیاهو
play_arrow
ترک مجمع سازمان ملل هنگام سخنرانی نتانیاهو
صندلی‌های خالی هنگام شروع سخنرانی نتانیاهو
play_arrow
صندلی‌های خالی هنگام شروع سخنرانی نتانیاهو
تشییع پیکر شهید شم‌آقایی پس از ۴۲ سال فراق
play_arrow
تشییع پیکر شهید شم‌آقایی پس از ۴۲ سال فراق
روحیه انقلابی پدر شهید ابوصالح
play_arrow
روحیه انقلابی پدر شهید ابوصالح
تصاویر آخرالزمانی از حملات اسرائیل به ضاحیه
play_arrow
تصاویر آخرالزمانی از حملات اسرائیل به ضاحیه
آیا برای تحویل جسد جانباختگان معدنچیان طبس، مبلغی از خانواده‌ها دریافت شده است؟
play_arrow
آیا برای تحویل جسد جانباختگان معدنچیان طبس، مبلغی از خانواده‌ها دریافت شده است؟