کنترل JFrame

Frame پنجره‌ای است که شما در برنامه‌هایتان، کنترل‌های دیگر را بر روی آن قرار می‌دهید. شما می‌توانید در یک برنامه بیش از یک Frame داشته باشید. هر Frame از خواص و متدهای کلاس Window ارث می‌برد. Frame از لحاظ ویژوالی یا بصری، در بالاترین سطح کلاس‌های Swing قرار دارند.

ظاهر Frame

در شکل زیر شما نام قسمت‌های مختلف Frame را مشاهده می‌کنید.
swing-form-01
در قسمت بالا، نوار عنوان (Title Bar) قرار دارد. نوار عنوان از یک آیکن (Icon)، یک عنوان (Title)، و یک جعبه‌ی کنترل (Control Box) تشکیل شده است. جعبه‌ی کنترل ( Control Box) دکمه‌های کوچکنمایی (Minimizing)، بزرگنمایی (Maxmizing)، و بستن (Closing) را در بر دارد. قسمت داخلی یا همان Content Area مکانی است که ما کنترل‌ها را در آن قرار می‌دهیم. قسمت حاشیه یا Border که شامل قسمت Title Bar نیز می‌شود، به شما اجازه می‌دهد که سایز فرم را تغییر دهید. Frame، نمونه‌ای از کلاس JFrame می‌باشد و دارای دو سازنده اصلی می‌باشد. که یکی از آنها برای ایجاد یک Frame بدون عنوان و دیگری برای ایجاد Frame همراه با عنوان به کار می‌رود :

JFrame frame = new JFrame();

JFrame frame = new JFrame("Title Bar");

حال اجازه دهید که یک Frame مانند شکل بالا و با استفاده از کدنویسی ایجاد کنیم. به کدهای زیر توجه کنید :

  1: import javax.swing.*;
  2: 
  3: public class FrameDemo 
  4: {
  5:     public static void main(String[] args) 
  6:     {
  7:         JFrame frame1 = new JFrame("ّ FrameDemo");        
  8:         frame1.setSize(430 ,315);
  9:         frame1.setVisible(true);
 10:     }   
 11: }

در خط 1 کد بالا چون قرار است که یک Frame ایجاد کنیم در نتیجه کلاس‌های Swing را وارد برنامه کرده‌ایم. در خط 3 یک کلاس به نام FrameDemo ایجاد کرده‌ایم. در خط 7 یک نمونه از کلاس JFrame ایجاد کرده و در داخل سازنده آن یک عنوان برای Frame می‌نویسیم. در خط 8 با استفاده از متد setSize یک اندازه برای فریم تعیین می‌کنیم و در خط 9 با استفاده از متد setVisible هم آن را نمایش می‌دهیم. به این نکته توجه کنید که ما در کد بالا فقط اندازه و عنوان را تعیین کردیم و با اجرای کد قسمت ControlBox به صورت پیشفرض در Frame وجود دارد. در حالت پیشفرض وقتی که یک Frame را می‌بندید در اصل مخفی می‌شود. کلاس JFrame دارای ثابت‌هایی برای بستن یا مخفی کردن Frame می‌باشد که در زیر لیست انها آمده است :

ثابت توضیح
EXIT_ON_CLOSE System.exit(0) فراخوانی می‌شود.
DISPOSE_ON_CLOSE dispose() فراخوانی می‌شود.
DO_NOTHING_ON_CLOSE پنجره بسته نمی‌شود.
HIDE_ON_CLOSE در حکم مخفی شدن (setVisible(false)) پنجره می‌باشد. این ثابت پیشفرض است.

برای استفاده از این ثابت‌ها بعد از ایجاد یک نمونه از کلاس JFrame متد ()setDefaultCloseOperation را فراخوانی کرده و یکی از ثابت‌های بالا را به آن ارسال می‌کنیم. مثلاً بعد از خط 7 کد بالا می‌توانیم خط زیر را بنویسیم :

frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

با اجرای کد بالا فریمی به صورت زیر ایجاد می‌شود :
create-JFrame-swing-01

لایه بندی Frame

ظاهر ساده Frame دارای چهار لایه اصلی، قاب یا pan می‌باشد :

  • Root Pane
  • Layered Pane
  • Content Pane
  • Glass Pane

لایه‌های تشکیل دهنده یک Frame به صورت زیر می‌باشند :
Pane-in-java-01
يك JFrame داراي يك نمونه از كامپوننت JRootPane می‌باشند. خود JRootPane شامل دو كامپوننت JPanel glassPane و JLayeredPane می‌باشد. JLayeredPane نیز به نوبه خود از دو كامپوننت JMenuBar و JPanel contentPane تشكيل شده است :
layer-pane-in-frame-java
معمولاً كامپوننت های swing به Content Pane اضافه می‌شوند و بطور مستقیم به خود JFrame اضافه نمی‌شوند و بهتر است که در هنگام اضافه کردن کنترل‌ها به Frame مشخص کنیم که این کنترل در کدام قاب قرار بگیرد. مثلاً برای اضافه کردن یک کنترل به فریمی که در مثال بالا ایجاد کردیم از دو متد ()add و ()getContentPane به صورت زیر عمل می‌کنیم:

frame1.getContentPane().add(...);

فرض کنید که می‌خواهیم یک کنترل Label به فریم اضافه کنیم در این صورت بعد از خط 7 کد ابتدای درس کدهای زیر را بنویسید :

JLabel label = new JLabel("Add A JLable To contentPane", JLabel.CENTER);
frame1.getContentPane().add(label);

در کد بالا ما یک کنترل Label را به لایه ContentPane اضافه کرده‌ایم. همانطور که مشاهده می‌کنید ابتدا یک کنترل Label ایجاد کرده و سپس در سازنده کلاس آن یک متن برای آن انتخاب کرده و آن را در وسط فریم قرار داده‌ایم. برای اضافه کردن این کنترل به لایه ContentPane هم از متد ()getContentPane استفاده نموده‌ایم. خروجی کد بالا به صورت زیر است :
layer-pane-in-frame-java-02