بسم الله الرحمن الرحيم
والصلاة والسلام على سيد البشر اشرف خلق الله اجمعين سيدنا محمد ابن عبدالله الصادق الأمين.
اما بعد:
اتحدث في موضوعي هذا عن إطار العمل الخاص بتطوير الواجهات بإستخدام عناصر Swing
Swing Application Framework
هذا الإطار او الهيكل يندرج تحت الحزمة org.jdesktop وبالإمكان تضمين الحزمة للبرنامج في NetBeans من خلال خصائص البرنامج properties ومن ثم النافذة الفرعية libraries واضافة الحزمة من القائمة بعد النقر على add library .
الفئة الرئيسية في هذة الحزمة هي org.jdesktop.Application وهي القاعدة الاساسية لبرامج Swing في الهيكل
تقوم هذة الفئة بتعريف دورة حياة البرنامج Swing application life-cycle من خلال الدوال التالية:
1. initialize() وتستخدم لتهيئة خصائص البرنامج قبل الشروع في انشاء واجهة المستخدم GUI
2. الدالة startup() وتستخدم لإنشاء وإظهار واجهة المستخدم الرئيسية
3. Ready() وتستخدم لأي مهام اضافية بسيطة بعد ان تصبح الواجهة جاهزة للإستخدام.
4. Shutdown() لإخفاء الواجهة واي مهام اخيرة cleanup قبل اغلاق البرنامج.
يتم استدعاء هذة الدوال بالترتيب اعلاة . عند تشغيل البرنامج بإستدعاء الدالة lunch وحتى استدعاء دالة الخروج من البرنامج exit .
جميع دوال هذة الفئة يتم (ويجب)استدعائها من خلال event dispatch thread أو EDT فقط وهي الthread المسؤولة عن التعامل مع عناصر Swing .
(بالنسبة لي مصطلح "خيط" غير دقيق ابدا وسأستخدم الكلمة كما هي في اللغة الانجليزية).
هذا مثال على استخدام الفئة Application :
public class MyApplication extends Application {
JFrame mainFrame = null;
@Override
protected void initialize(String[] args) {
//
}
@Override
protected void startup() {
mainFrame = new JFrame("Hello World");
mainFrame.add(new JLabel("Hello World"));
mainFrame.addWindowListener(new MainFrameListener());
mainFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
mainFrame.pack();
mainFrame.setVisible(true);
}
@Override
protected void ready() {
//
}
@Override
protected void shutdown() {
mainFrame.setVisible(false);
}
private class MainFrameListener extends WindowAdapter {
@Override
public void windowClosing(WindowEvent e) {
exit();
}
}
public static void main(String[] args) {
launch(MyApplication.class, args);
}
}لاحظ اننا قمنا بوضع القيمة DO_NOTHING_ON_CLOSE للخاصية defaultCloseOperation التابعة للواجهة MainFrame وذلك لأننا نستخدم الدالة exit() للخروج من البرنامج.
بالإمكان استخدام ميزة "الحقن" لتهيئة خصائص البرنامج properties injection بإستخدام الفئة ApplicationContext .
لإستخدام اسلوب حقن الخصائص يجب علينا:
اولا تعريف ملف خصائص properties .
هذا الملف يجب ان يحمل نفس إسم الفئة ويوضع في حزمة فرعية بإسم resources وإلا لن يتعرف عليها البرنامج.
resources/ApplicationName.properties
وهذا هو المثال السابق مع إستخدام اسلوب الحقن لكل من خصائص الفئة وخصائص مكونات Swing .
public class MyApplication2 extends MyApplication {
\\حقل قابل للحقن private @Resource Image icon;
@Override
protected void initialize(String[] args) {
//
}
@Override
protected void startup() {
mainFrame = new JFrame();
mainFrame.setName("mainFrame");
JLabel label=new JLabel();
label.setName("label");
mainFrame.add(label);
mainFrame.addWindowListener(new MainFrameListener());
mainFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
//حقن لخصائص الواجهة وخصائص محتوياتها
getContext().getResourceMap( MyApplication2.class).injectComponents(mainFrame);
//حقن لحقول الفئة
getContext().getResourceMap( MyApplication2.class).injectFields(this);
mainFrame.setIconImage(icon);
mainFrame.pack();
mainFrame.setVisible(true);
}
@Override
protected void shutdown() {
mainFrame.setVisible(false);
}
private class MainFrameListener extends WindowAdapter {
@Override
public void windowClosing(WindowEvent e) {
exit();
}
}
public static void main(String[] args) {
launch(MyApplication2.class, args);
}
}ملف الخصائص MyApplication2.properties
mainFrame.title=Hello World label.text=Hello World MyApplication2.icon = busy-icon9.png
لاحظ ان كل عنصر Swing نود حقن خصائصة يجب اولا تحديد خاصية الاسم لة
component.setName("someName")ومن ثم استخدام هذا الاسم في ملف الخصائص متبوعا بإسم الخاصية لتحديد قيمتها:
someName.propertyName=value
المثال السابق يمكن اعادة كتابتة بإستخدام الفئة SingleFrameApplication وهي حالة خاصة من الفئة Application
تستخدم للبرامج التي تحتوي على واجهة رئيسية واحدة فقط.
هذة الفئة تهتم بأغلب الامور التي قمنا بكتابتها في الامثلة السابقة , فهي تقوم بإنشاء واجهة رئيسية للبرنامج بإسم mainFrame وتهتم بمسألة حقن خصائص العناصر المراد وضعها على تلك الواجهة .
public class MyApplication3 extends SingleFrameApplication {
@Override
protected void startup() {
JLabel label = new JLabel();
label.setName("label");
show(label);
}
public static void main(String[] args) {
launch(MyApplication3.class, args);
}
}ملف الخصائص MyApplication3.properties
Application.id = MyApplication
Application.title = My Hello World Application
Application.version = 1.0
Application.vendor = Sun Microsystems, Inc.
Application.vendorId = Sun
Application.homepage = http://www.javadesktop.org
Application.description = An example of SingleFrameApplication
Application.lookAndFeel = system
mainFrame.title = ${Application.title} ${Application.version}
mainFrame.iconImage=busy-icon9.png
label.text = Hello Worldالدالة show الموضحة في المثال هي –عادة- ما يتم استدعائها من خلال الدالة startup بعد انشاء وتجهيزاللوحة الرئيسية لبرنامجك main panel ومن ثم فإن استدعاء الدالة show مع اللوحة سينشيء واجهة البرنامج الرئيسية main frame, ويحقن خصائص اللوحة الرئيسية وخصائص عناصرها ثم يضعها على الواجهة الرئيسية ويعرضها.
في المثال استخدمتها لعرض label على الواجهة الرئيسية فقط لتوضيح استخدامها .
نهاية الجزء الاول من الموضوع.
