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



 

JPanel(پنل):

وقتی یک فرم ایجاد می کنیم درواقع این یک فریم است. یک فریم خالی ایجاد کردیم و فقط از کادر آبی رنگ آن می توان استفاده کردو از فضای داخل آن نمی توان استفاده کرد. مثلا نمی توان به پس زمینه ی آن رنگ نسبت داد. هر چند که در این حالت می توان از متد SetBackgrauond() استفاده کرد، علت آن این است که این متد به کتابخانه ی Java.AWT برمی گردد و همانطور که در قسمت Swing گفته شد تمامی کتابخانه های swing مبتنی بر AWT است(همان اپلت های جاوا) و چون کلاس JFrame از روی کلاس Form مشتق شده، در هر شرایطی این متد را دارد اما کاری انجام نمی دهد.
در تمامی زبانهای برنامه نویسی اشیا همدیگر را احاطه می کنند. Form ، Panel را احاطه می کند و panel ، تمام panel های داخلی و آنها تمام دکمه ها و.....
پس برای حل این مشکل از کلاس JPanle استفاده می کنیم. (کلاس JPanel ازکتابخانه ی Javax.swing است) .
پروژه ی بخش swing (بخش قبل) را دنبال می کنیم که کد های زیر را در کلاس Main دارد:
این کار را به دو صورت می توان انجام داد. یک راه استفاده از پنجره ی 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 کنیم.با کلیک کردن آن به صورت خودکار وارد می کند.
سپس اجرا می کنیم و خروجی به صورت زیر خواهد بود:
دیدیم که با متد add() پنل را به Frame نسبت دادیم. اما بهتر است که برای پنل از متد setContentPane() استفاده کنیم و برای کامپوننت های دیگر مثل Button از add استفاده کنیم. خط مربوط به متد add() را کامنت می کنیم :
و اگر اجرا بگیریم خروجی مثل بالا می شود.
با استفاده از متد setContentpane() می توانیم از متد setBackground() هم به گونه ای دیگر استفاده کنیم. خط مربوط به متد setBackground() را کامنت می کنیم و دستورات زیر را اضافه می کنیم:

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

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

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 را بسازیم)
بعد از ساختن نمونه، اگرپروژه را اجرا کنیم Button را نمایش نمی دهد. چون باید آن را به JPanel نسبت دهیم یا add کنیم:

jpanel1.add(jbtn1);

این قسمت از کد به صورت زیر می باشد:
که اگر پروژه را اجرا کنیم خروجی به شکل زیر است:
با کلیک کردن آن هیچ عملی صورت نمی گیرد.
اکنون Button دیگری به نام Cancel به پروژه اضافه می کنیم :
وقتی در اجرا اندازه ی فرم را تغییر دهیم این دو دکمه به طور اتواماتیک در وسط قرار می گیرد. یعنی چیدمان همیشه از وسط انجام می شود.
مانند ادیتور word تا زمانیکه سطر اول استفاده نشود به سطر های دیگر دسترسی ندارد مگر با Enter کردن به سطر های بعدی می رود. در اینجا هم همینطور است که اشیا تا وقتی که ردیف اول پر نشود به ردیف بعدی دسترسی ندارند.
اشیا مال JPanel هستند و برای JFrame نیستند. یعنی پدر(parent) آنها JPanel است.
در اینجا Layout مطرح می شود. Layout یعنی آرایش یا ترتیب وسایل یا طرح بندی. Layout ها مال پکیج Java.AWT است. ما ابتدا این پکیج را به پروژه import می کنیم تا همه ی کلاسهای Layout را نمایش دهد. وقتی که Layout مورد نظر را انتخاب کردیم خودش پکیج مربوط به آن را import می کندو بعد از آن پکیج کلی java.awt.LayoutManager را حذف می کنیم:
برای استفاده از این Layout ها باید از انها نمونه بسازیم چون کلاس هستند و برای استاده از کلاسها نمی توان از نام آنها استفاده کرد، باید از نمونه ی آنها استفاده کرد. و سپس آن را به اشیا نسبت می دهیم. مثلا می خواهیم در زیر BorderLayout را به JPanel1 نسبت دهیم. دستور زیر را تایپ می کنیم:

) jpanel1.setLayout(New

وقتی بعد از تایپ New ، CTRL+Space را می زنیم، می بینیم کلاسهای Layout زیادی وجود دارند مانند:
FlowLayout : Layout جاری ای است که در حال حاضر در حال استفاده است.
GridLayout : به صورت جدول تمام سطر ها را تقسیم می کند.
BorderLayout : تمام فرم را پوشش می دهد.
و....
اکنون به عنوان تمرین، از بین این لیست ارائه شده BorderLayout را انتخاب می کنیم. بعد از انتخاب آن پکیج مربوط به آن import می شود(java.awt.BorderLayout). همانطور که در بالا گفته شد اکنون پکیج java.awt.LayoutManager دیگر بلا استفاده است و ما آن را حذف می کنیم.
پس کد به صورت زیر می شود:
سپس اجرا می کنیم و خروجی زیر را می دهد:
این خروجی نشان می دهد که دکمه ی Cancel کل فرم را فرا گرفته است. این خصوصیت BorderLayout است.
اگر GridLayout را انتخاب کنیم، (پکیج آن اضافه شد) ، خروجی به صورت زیر می شود:
که به صورت جدول تمام سطر ها را تقسیم کرد. اگر تعداد دکمه ها بیشتر باشد، به تعداد آنها تقسیم می کند.
حال به قبل بر می گردیم و می خواهیم دو دکمه ی Ok و Cancel در مکان خاصی قرار گیرند. برای این کار ابتدا ، 1- پارامتر ورودی متد setLayout را null قرار دهیم و 2- سپس برای دکمه ها موقعیت مکانی تعریف می کنیم.
اگر ما پارامتر ورودی متد setLayout را null قرار دهیم ، هیچ Layout ای را نمی پذیرد. خروجی به صورت زیر می شود : (کد آن در کادر نارنجی)
وقتی Layout پنل دربرگیرنده را null کنیم، تمام اشیا درون آن هیچ ابعاد و موقعیت مکانی ندارند و دیده نمی شوند.
حال می خواهیم بگوییم که این دکمه ها چه ابعادی داشته باشند و در چه موقعییت ای قرار گیرند. برای این کار از متد setBound() استفاده می کنیم، همانگونه که برای شی frame1 این کار را انجام داده ایم. مانند تصویر زیر، اعداد را وارد کردیم و اجرا کردیم:
دیدیم که سایز هر دو دکمه ی Ok و Cancel متفاوت و در موقعیت مختلف قرار گرفتند. اگر سایز دکمه ی Cancel را کوچکتر از متن آن تعریف کنیم به صورت زیر نشان داده می شود:
بخش JButton و JPanel در اینجا به پایان می رسد.