بسم الله الرحمن الرحيم
السلام عليكم ورحمه الله وبركاته
ان شاء الله سأقوم بشرح موضوع يتعلق بTrayIcon
ماذا تعنى فهى تعنى لنا كمبرمجين شىء جميل فى تجميل برامجنا
من اضافه ايقونه كالتى تراها فى بعض البرامج
تجد مثلا ايقونه الـYahoo او الانتى فيرس بجوار الساعه
هل تريد ان يكون لبرامجك مثل هذه الايقونات
مع الجافا فالامر سهل وليس بالشىء الصعب
بالنسبه لاى مبرمج لا يعلم شىء عنها فستكون بالنسبه له هناك فئتين وهما TrayIcon class , SystemTray class
هما بالنسبه له سيكونوا اول مره يتعامل معهم
نبدا بعرض الكود والشرح عليه
اولا انت لن تقوم باضافه هذه الايقونه فنظام التشغيل هو الذى يقوم باضافتها
فيما معناه انك لن تقوم بوضعها بيدك فقط ان تعطيها للنظام وهو يضعها لك فى المكان المناسب
ولكن قبل كل هذا لا بد من التاكد ان النظام يدعم وضع هذه الايقونات
سيتم ذلك عبر هذا الكود
SystemTray.isSupported();
تعود لك بـtrue اذا كان يدعم
بعدها تقوم انت بالعمل على تجهيز هذه الايقونه واضافه لها القائمه التى تريدها
سنبدا الان فى شرح الفئه TrayIcon
تحتوى على 3 بناء
public TrayIcon(Image image)
هذا يقوم باضافه الصوره على الايقونه
public TrayIcon(Image image, String tooltip)
هذا يقوم باضافه الصوره والكلمه التى سوف تظهر اذا مر المستخدم بالموس علي الايقونه
public TrayIcon(Image image, String tooltip, PopupMenu popup)
وهذا هو اكبر بناء وهو الذى يشمل الصوره والكلمه التى ستظهر عليها والقائمه التى سيتم وضعها قائمه الاوامر
لكن لاحظ انها من نوع PopupMenu وليس من نوع JPopupMenu
لذلك سنتعامل مع الـAWT package وليس الـ Swing packge
ما معنى هذا الكلام
هو انك عندما تريد ان تضيف عنصر او قائمه فرعيه لهذه القائمه ستكون من نوع
MenuItem وليس JMenuItem
Menu وليس JMenu
طبعا فى حالتنا هذه او فى شرحى سأستخدم البناء الاكبر
ساقوم بتعريف متغير واقوم باضافه له الصوره والكلمه والقائمه
Image image = new ImageIcon(getClass().getResource("/trayicon/icon.gif")).getImage();
trayIcon = new TrayIcon(image, "My Tray Icon Test", getMyPopupMenu());لاحظ ان الصوره يتم اخذها بهذه الطريقه
getClass().getResource("/trayicon/icon.gif")لكى تتمكن من ايجادها من داخل ملف الـ jar
ولاحظ فى الكود السابق ان القائمه عباره عن داله تدعى getMyPopupMenu
سوف نقوم بتناولها الان
private PopupMenu getMyPopupMenu() {
PopupMenu popupMenu = new PopupMenu();
Menu subMenu = new Menu("Tray Messages");
infoItem = new MenuItem("Info");
infoItem.addActionListener(trayIconListener);
subMenu.add(infoItem);
////////////////////////////////
errorItem = new MenuItem("Error");
errorItem.addActionListener(trayIconListener);
subMenu.add(errorItem);قومنا بتعريف كائن من نوع PopupMenu
وتعريف قائمه فرعيه subMenu
و تعريف بعض العناصر مثل infoItem و errorItem
وقومنا باضافه هذه العناصر الى القائمه الفرعيه
وقومنا ايضا باضافه مستمع لهذه العناصر وهو عباره عن كائن من نوع فئه تحوى ActionListener
وبعدها نقوم باضافه القائمه الفرعيه الى القائمه الرئيسيه
popupMenu.add(subMenu);
وممكن اضافه عناصر مباشره الى القائمه الرئيسيه هكذا
exitItem = new MenuItem("Exit");
exitItem.addActionListener(trayIconListener);
popupMenu.add(exitItem);وممكن ان نضيف فاصله بين العناصر وبعضها هكذا
popupMenu.addSeparator();
وهذا هو الشكل النهائى
بعدها نقوم بعمل الاحداث الخاصه بهذه العناصر
قومنا بعمل فئه TrayIconListener
بهذا الشكل
class TrayIconListener implements ActionListener {
public void actionPerformed(ActionEvent evt) {
MenuItem item = (MenuItem) evt.getSource();
if (item.getLabel().equals(infoItem.getLabel())) {
trayIcon.displayMessage("MessageType.INFO",
"Information Tray icon test", TrayIcon.MessageType.INFO);
} else if (item.getLabel().equals(errorItem.getLabel())) {
trayIcon.displayMessage("MessageType.ERROR",
"Error Tray icon test", TrayIcon.MessageType.ERROR);
}
}
}وبداخل الداله actionPerformed
قومنا بعمل casting للكائن evt فى MenuItem object
MenuItem item = (MenuItem) evt.getSource();
وبدئنا فحص اذا كان الlabel لهذا الحدث مساوى لاى label من الموجودين
نقوم بنتفيذ الاكواد التى بداخلهم
فهذا شىء مفروغ منه ولا يحتاج لشرح كثيرا
لكن هناك جزئيه تحتاج الى شرح
وهى ان تقوم باظاهر رساله من الايقونه نفسها
مثل ما هو موضح بالصوره
public void displayMessage(String caption, String text, MessageType messageType)
اول متغير وهو عباره عن عنوان للحدث الذى تم
ثان متغير وهو عباره عن الرساله التى تريدها ان تظهر
ثالث متغير نوع الرساله نفسها ومنها 4 انواع
TrayIcon.MessageType.INFO TrayIcon.MessageType.ERROR TrayIcon.MessageType.WARNING TrayIcon.MessageType.NONE
بهذا قومنا بعمل الايقونه واضافه لها الصوره والكلمه والقائمه بجميع احداثها
لكن يتقبى شىء مهم جدا
فائده الـSystemTray class قد ظهر فى معرفه هل يدعم اضافه ايقونه ام لا
وها هو يأتى مره اخرى فى اضافتها وازالتها
طبعا بعد ان تقوم بعمل TrayIcon
تقوم باضافتها
نقوم الاول بتعريف كائن من الـSystemTray لكن هذه الفئة البناء الخاص بها private اى لايمكن اخذ كائن منها
لكن لها حل وحيد وهى ان تحصل على الـSystemTray وهى تعود لك بكائن منه
بهذه الطريقه
systemTray = SystemTray.getSystemTray();
وبعدها تقوم باستخدام هذا الكائن فى الاضافه فى بدايه التشغيل
systemTray.add(trayIcon);
والازاله عن الانتهاء من البرنامج
systemTray.remove(trayIcon);
لتحميل البرنامج كاملا
هناك دوال اخرى داخل الـTrayIcon class يمكن لاى احد ان يحاول معاها وان واجهته مشكله فليعرضها
تم بحمدالله :)

