الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تعلم كيفيه اضافه ايقــTrayIconــــونه لبرنامجك بشريط المهام

بدأه Mahmoud Kelany في 26 فبراير 2011 · 8 رد · 1,947 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

السلام عليكم ورحمه الله وبركاته

ان شاء الله سأقوم بشرح موضوع يتعلق بTrayIcon

ماذا تعنى فهى تعنى لنا كمبرمجين شىء جميل فى تجميل برامجنا

من اضافه ايقونه كالتى تراها فى بعض البرامج

تجد مثلا ايقونه الـYahoo او الانتى فيرس بجوار الساعه

post-217802-052751000 1298673171_thumb.p

هل تريد ان يكون لبرامجك مثل هذه الايقونات

مع الجافا فالامر سهل وليس بالشىء الصعب

بالنسبه لاى مبرمج لا يعلم شىء عنها فستكون بالنسبه له هناك فئتين وهما 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();

وهذا هو الشكل النهائى

post-217802-078989700 1298673173_thumb.p

بعدها نقوم بعمل الاحداث الخاصه بهذه العناصر

قومنا بعمل فئه 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 من الموجودين

نقوم بنتفيذ الاكواد التى بداخلهم

فهذا شىء مفروغ منه ولا يحتاج لشرح كثيرا

لكن هناك جزئيه تحتاج الى شرح

وهى ان تقوم باظاهر رساله من الايقونه نفسها

مثل ما هو موضح بالصوره

post-217802-074517100 1298673175_thumb.p

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);

لتحميل البرنامج كاملا

TrayIconExample.zip

هناك دوال اخرى داخل الـTrayIcon class يمكن لاى احد ان يحاول معاها وان واجهته مشكله فليعرضها

تم بحمدالله :)

المرفقات
trayIcon.pngtrayIcon2.pngtrayIcon3.png

تم تعديل هذه المشاركة بواسطة Mahmoud Kelany في 26 فبراير 2011 في 01:42

8

Software Developer
Mahmoudkelany.com


 

#2

تسلم يا أخ محمود ! شرح أكثر من رائع.. :)

جاري التطبيق

عفواً أحبتي انقطاعي بسبب الدراسة دعواتكم بالتوفيق..

{ لا ينال العلم مستحٍ ولا مستكبر }

#3

+1

شــرح وافـــــــى ومتميـــــــــــــــز ...

وتمت التجربه وكله تمام

ورده فله و شمعه منوره

wewewe3e3cb54f91.gif

تم تعديل هذه المشاركة بواسطة The expendable في 26 فبراير 2011 في 10:22

no-pain-no-gain.jpg

اذا كنت لا تعلم الى اين تذهب... فكــل الطرق تؤدى الى هناك

#4

+1

شرح رائع بارك الله فيكhappy.gif


HeartOutputStream myHeart;
OutputStream myHeartOutStream;

myHeartOutStream = MAllaw.getHeart().getOutputStream();
myHeart = new HeartOutputStream(myHeartOutStream);

while(myHeart.isStillBeating())
myHeart.write("I ♥ Java");

#5

الف شكر يا محمود :)

#6

جيد يامحمود

أفضل الدروس عن المشاريع

تحياتى


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#7

منورين جميعا :)

الحمدلله ان الموضوع نال اعجابكم :)

Software Developer
Mahmoudkelany.com


 

#8

تجديدا للموضوع

انه يمكن استخدام مكونات الـ Swing بدلا من استخدام AWT

ولكن باستخدام مكتبه خارجيه

هذه هى الـClass الجديده نفس الاسم بس فى مكتبه جديده

http://download.java...y/TrayIcon.html

ودا مثال عليها

http://kickjava.com/src/Tray.java.htm

وحملها من هنا

http://download.java...s-0.8.0-bin.zip

طبعا المكتبه دى مش فيها TrayIcon بس لا دا فيها كل مكونات الـ Swing مع تعديلات عليها

طبعا دا مش هدفنا دلوقتى لكن للتنبيه يعنى اللى عاوز يستخدمها ويكتشفها

وفى دى كمان

http://www.jpackages.com/jtray/

بس دى حاجات DLL وحاجات رخمه كدا يعنى ويندوز وخلاص

انما الاولى دى بتاعت الجافا بقا :)

بالتوفيق جميعا

تم تعديل هذه المشاركة بواسطة Mahmoud Kelany في 12 يونيو 2011 في 23:50

1

Software Developer
Mahmoudkelany.com


 

#9

يا أخي دائم مبدع ما شاء الله عليك

والله دروسك كلها اباداع وكلها فائدة وشكرا جزيلا اخي الكريم

إذا نظــرتَ نيـوب اللـّيـثِ بـارزةً         فـلا تظــنَنَ أَنَّ اللـّيـــثَ يبْتسـِـــمُ


 


 


رسم المخططات البيانية بواسطة الجافا


 


كتاب تحليل وتصميم نظم المعلومات


مواضيع مشابهة