تعلم كيفية إنشاء قوائم JMenuBar ديناميكية في تطبيقات Java Swing، بما في ذلك إضافة عناصر القائمة، فواصل الأقسام، وكيفية ربط معالجات الأحداث (Action Listeners) لتنفيذ وظائف محددة عند النقر على كل عنصر.
في هذا المقال، سنتعمق في كيفية بناء واجهات مستخدم تفاعلية باستخدام JMenuBar في Java Swing. سنستعرض خطوة بخطوة عملية إضافة عناصر القائمة (Menu Items) إلى كل قائمة فرعية، وكيفية تنظيمها باستخدام فواصل (Separators) لتحسين تجربة المستخدم. الأهم من ذلك، سنتعلم كيفية ربط معالجات الأحداث (Action Listeners) لتنفيذ وظائف محددة عند تفاعل المستخدم مع أي عنصر من عناصر القائمة.
مثال عملي: بناء JMenuBar متكامل
يوضح المثال التالي تطبيقاً كاملاً لإنشاء شريط قوائم (JMenuBar) مع قوائم فرعية (JMenu) وعناصر قائمة (JMenuItem)، بالإضافة إلى فواصل بين العناصر. كما يوضح كيفية التعامل مع أحداث النقر على هذه العناصر.
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
public class Main {
public static void main(String[] args) {
// إنشاء إطار النافذة الرئيسي (JFrame) وتعيين عنوان لها
JFrame frame = new JFrame("JMenuBar demo");
// تحديد أبعاد النافذة: العرض 500 بكسل والطول 250 بكسل
frame.setSize(500, 250);
// تعيين عملية الإغلاق الافتراضية لإنهاء التطبيق عند النقر على زر الإغلاق
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// إنشاء شريط القوائم الرئيسي (JMenuBar)
JMenuBar menuBar = new JMenuBar();
// إنشاء ثلاث قوائم فرعية (JMenu)
JMenu file = new JMenu("File");
JMenu edit = new JMenu("Edit");
JMenu help = new JMenu("Help");
// إنشاء عناصر القائمة (JMenuItem)
JMenuItem newFile = new JMenuItem("New");
JMenuItem open = new JMenuItem("Open");
JMenuItem save = new JMenuItem("Save");
JMenuItem exit = new JMenuItem("Exit");
JMenuItem undo = new JMenuItem("Undo");
JMenuItem cut = new JMenuItem("Cut");
JMenuItem copy = new JMenuItem("Copy");
JMenuItem paste = new JMenuItem("Paste");
JMenuItem select = new JMenuItem("Select All");
JMenuItem about = new JMenuItem("About");
JMenuItem report = new JMenuItem("Report Issue");
// إضافة القوائم الفرعية إلى شريط القوائم الرئيسي
menuBar.add(file);
menuBar.add(edit);
menuBar.add(help);
// إضافة عناصر القائمة إلى قائمة "File" مع فاصل
file.add(newFile);
file.add(open);
file.add(save);
file.addSeparator(); // إضافة فاصل بصري
file.add(exit);
// إضافة عناصر القائمة إلى قائمة "Edit" مع فواصل
edit.add(undo);
edit.addSeparator(); // إضافة فاصل بصري
edit.add(cut);
edit.add(copy);
edit.add(paste);
edit.addSeparator(); // إضافة فاصل بصري
edit.add(select);
// إضافة عناصر القائمة إلى قائمة "Help"
help.add(about);
help.add(report);
// تعيين شريط القوائم للإطار الرئيسي
frame.setJMenuBar(menuBar);
// جعل الإطار مرئياً
frame.setVisible(true);
// تعريف معالج الأحداث (ActionListener) للتعامل مع نقرات عناصر القائمة
ActionListener al = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// التحقق من مصدر الحدث (أي عنصر تم النقر عليه)
if (e.getSource() == newFile) {
// تنفيذ الإجراءات الخاصة بـ "New"
System.out.println("New file clicked!");
} else if (e.getSource() == open) {
// تنفيذ الإجراءات الخاصة بـ "Open"
System.out.println("Open file clicked!");
} else if (e.getSource() == save) {
// تنفيذ الإجراءات الخاصة بـ "Save"
System.out.println("Save file clicked!");
} else if (e.getSource() == exit) {
// تنفيذ الإجراءات الخاصة بـ "Exit"
System.out.println("Exit clicked! Exiting application.");
System.exit(0); // إنهاء التطبيق
} else if (e.getSource() == undo) {
// تنفيذ الإجراءات الخاصة بـ "Undo"
System.out.println("Undo clicked!");
} else if (e.getSource() == copy) {
// تنفيذ الإجراءات الخاصة بـ "Copy"
System.out.println("Copy clicked!");
} else if (e.getSource() == cut) {
// تنفيذ الإجراءات الخاصة بـ "Cut"
System.out.println("Cut clicked!");
} else if (e.getSource() == paste) {
// تنفيذ الإجراءات الخاصة بـ "Paste"
System.out.println("Paste clicked!");
} else if (e.getSource() == select) {
// تنفيذ الإجراءات الخاصة بـ "Select All"
System.out.println("Select All clicked!");
} else if (e.getSource() == about) {
// تنفيذ الإجراءات الخاصة بـ "About"
System.out.println("About clicked!");
} else if (e.getSource() == report) {
// تنفيذ الإجراءات الخاصة بـ "Report Issue"
System.out.println("Report Issue clicked!");
}
}
};
// ربط معالج الأحداث (ActionListener) بجميع عناصر القائمة
newFile.addActionListener(al);
open.addActionListener(al);
save.addActionListener(al);
exit.addActionListener(al);
undo.addActionListener(al);
cut.addActionListener(al);
copy.addActionListener(al);
paste.addActionListener(al);
select.addActionListener(al);
about.addActionListener(al);
report.addActionListener(al);
}
}
عند تشغيل هذا الكود، ستظهر لك نافذة تحتوي على شريط قوائم متكامل. كل قائمة فرعية (File, Edit, Help) ستعرض عناصرها عند النقر عليها، مع وجود فواصل بصرية لترتيب المحتوى. عند النقر على أي عنصر، سيتم تنفيذ الإجراء المخصص له كما هو محدد في دالة actionPerformed.
النتيجة المتوقعة
الصورة التالية توضح شكل النافذة بعد تشغيل الكود، مع عرض القوائم وعناصرها: