JAVA

yair24

Member
JAVA

שלום, רציתי לשאול שאלה בקשר לACTION LISTENER , אם יש לי אפלט שיש בו כמה כפתורים, מה השיטה הנכונה מבחינה מונחית עצמים לACTIONPERFORMED? לכתוב משפטי IF לגבי איזה כפתור נלחץ? או שיש משהו אחר יותר טוב...? אני מקווה שהשאלה ברורה. אני יכול לתת דוגמא: אני לא זוכר עם איזה פקודה בדיוק בודקים איזה כפתור נלחץ, נדמה לי שזה היה משהו GETSOURCE?? אז מה בתוך הACTIONPERFORMED אני שם פשוט הרבה IF-ים? למשל:
if e.getsource==firstbutton dosomething if e.getsource==secondbutton do something else if ...​
אני מקווה שהבנתם את הרעיון. הצורה הזאת פשוט לא כל כך נראית לי מונחית עצמים... אני הייתי מצפה שכל כפתור ידע לטפל בעצמו בלחיצה עליו. מישהו יודע? יאיר
 

dannykalfon24

New member
מדוע שלא תנסה כמו הרעיון של SWITCH?

למה דווקא IF? זה משעמם אני זוכר שכאשר היה לי כפתורים בפרוייקט שלי השתמשתי ברעיון של "SWITCH" (SWITCH לא מופיע בJAVA אלא משהו אחר אם אני זוכר בכלל) ואמרתי לך אם זה עובד עם או בלי תכנות מונח עצמים זה עובד!!!
 

dannykalfon24

New member
אגב מדוע שלא תעזר בספר JAVA

אין לך? תשאיל אותו מחברים או שתקנה הספר הזה יענה לך על כל הבעיות במקום שתבזבז אינטרנט אני רק ממליץ
 

dannykalfon24

New member
מצאתי פתרון לבעיה של הIF מי שכתב

את הפיתרון זה voguemaster כל הכבוד לו!! אני אגיד לך מה הבעיה.. מוזר שלא שמתי לב לזה קודם. אז ככה, אתה בודק מתי היה קליק על כפתור העכבר, אבל אתה שוכח ש-MOUSEEVENT שקורה בתוך COMPONENT מסוים מועבר אוטומטית למחלקת ה-COMPONENT הזה. מה שאני אומר זה שבעצם אותו MouseEvent לא מתקבל בכלל ב-Applet שלך אלא מתקבל בתוך מחלקת הכפתור, ושם יש מתודה שמטפלת במקרה הקליק באופן קבוע (מרימה דגל לשינוי הצורה של הכפתור, ומייצרת ActionEvent מתאים לשליחה ל-Applet, אלו הדברים העיקריים). לא בכדי ג´אווה מספקת ActionEvent לדברים האלו, תשתמש בהם! ActionEvent הוא EVENT שאומר: הפקד "הופעל". לכל סוג פקד יש פעולה משל עצמו ופרמטרים שונים שמועברים. הנה דוגמא לאיך כן צריך לכתוב טיפול בכפתורים: public class blahblah extends Applet implements ActionListener { . . . . public void actionPerformed(ActionEvent e) { // handle event Object src = e.getSource(); if ( src instanceof Button) ProcessButton( (Button)src); } private void ProcessButton( Button b) { // process button action if ( b == <your preferred button>) // handle button } } זו אופציה אחת, והיא פועלת. הבעיה עם אופציה הזו היא שלמרות שאתה משתמש בפונקציה לטיפול בכל סוג של פקד, עדיין בתוך אותה פונקציה יש לך משפטי IF שבודקים על איזה פקד ה-EVENT קרה. תאר לך שיש לך 20 כפתורים. לא תרצה לכתוב 20 משפטי IF נכון ?? לכן אפשר לעשות משהו אחר. לא צריך שה-Applet יהיה ActionListener בכלל, אלא עבור כל כפתור שאתה יוצר, להוסיף ActionListener חדש ולקשר את המתודה שלו עם מתודה אחרת, כך: public class blahblah extends Applet { // buttons Button bOk = new Button("Ok"); Button bCancel = new Button("Cancel"); . . . void Init() throws Exception { // initialize listeners bOk.addActionListener( new ActionListener() { // override the listener´s actionperformed method public void actionPerformed(ActionEvent e) { bOK_actionPerformed(e); } }); // initialize listeners bCancel.addActionListener( new ActionListener() { // override the listener´s actionperformed method public void actionPerformed(ActionEvent e) { bCancel_actionPerformed(e); } }); } // init ends void bOK_actionPerformed(ActionEvent e) { // handle ok System.out.println("OK clicked"); } void bCancel_actionPerformed(ActionEvent e) { // handle cancel System.out.println("Cancel clicked"); } } // applet ends זה בערך העניין, כזה מהראש. מקווה שלא טעיתי בדרך.. אלי I´m one hell of a guy... or was it one guy of hel
 

dannykalfon24

New member
חפש את המשפט הנ"ל שיככון אותך

לפתרון שאלתך זה נכתב בפתרון שנתתי לך והמשפט שלו הוא: תאר לך שיש לך 20 כפתורים. לא תרצה לכתוב 20 משפטי IF נכון ??
 

רחבעם

New member
הוא גם מהנדס שעובד בחברה ../images/Emo151.gif

אלוהים נתן אגוזים למי שאין שיניים במקרה שלו גם למי שאין שכל .
 

FireGod

New member
ובמקרה של רחבעם אין לו בכלל

אגוזים או שכל לצערי הרב
 
זה בסדר....זו הייתה הלצה....

זה מה שכולנו עושים כאן מנסים לעזור! ואגב לעניין "צחצוח החרבות" שיש כאן בינך ובין עוד מישו....אנא מכם תהיו עניניים וחדל עם השטויות וההתנצחויות!
 

appTrap

New member
דני, אתה ממש ממש בסדר

אל תשים לב לכל חסרי התרבות שמבישים את עצמם
 

shed

New member
חס וחלילה....

נראה לך הגיוני שאותו ליסנר יקשיב לכל הארועים המתבצעים באפליקציה??? למה??? בשביל מה??? ואם יכולים להיות 100 ארועים שונים, אז הוא כל פעם יבדוק סדרתית איזה ארוע קרה??? אני אחלק את התשובה לשניים: חלק תיאורטי וחלק מעשי - שיענה על השאלה של יאיר באופן מפורט. ג´אווה עובדת עם מודל שנקרא mvc - Model View Controller. (אם מישהו אף פעם לא הבין מה זה ה-treemodel או tablemodel הגיע הזמן ללמוד :) מה הרעיון מאחורי כל זה? פשוט מאוד. נניח שיש לי אפליקציה עם 10 דוגי אובייקטים. לכל אחד אחד יש נתונים ושיטות משלו. במקום שהאפליקציה תצטרך להכיר כל אחד לעומק (לדעת איזה פרופרטיז יש לו למשל) ולהציג כל אחד מהאובייקטים, הרי שאני יכול ללמד כל אובייקט להציג את עצמו על המסך (ובשפה יותר נורמלית renderre) - זה המודל. לכל אובייקט יש את המודל שלו. view- החלון מרוכב מ-views. לדוגמא : בצד ימין יש treeview (כמו באקספלורר) בצד שמאל יש propertiesview (כדי להציג את נתונים של כל אובייקט). controller - הקונטרולר מבצע את הקישור בין הרנדרר ל-view. עכשיו - האפליקציה צריכה רק לקרוא לקונטרולל ולהגיד לו לעדכן את החלק השמאלי (נניח שבחרנו אובייקט כל שהוא ואנחנו רוצים להראות את הפרופרטיז ששלו), הקונטרולר קורא לרנדרר המתאים הוא כבר יודע איך להציג את עצמו על המסך כמו שצריך, איזה פרופרטיז יש לו, כמה כפתורים וכו´. נכון, המודל הזה מורכב ולא שגרתי, כל מי שעדיין תקוע עם תפיסת העולם של vb - כדאי שיעשה סוויטץ´ גדול בראש. אבל מבחינת הנדסת תוכנה אין ספק שזה פתרון הרבה יותר חכם ומובן. (אם אני זוכר נכון זה נקרא מודל ה"אורח"- כאשר אורך מגיע לחדר מלא אנשים - כולם מכירים אותו אבל הוא לא מכיר אף אחד - אותו כנ"ל כאן. כולם מכירים את האפליקציה אבל אין צורך שהאפליקציה תכיר את כולם) עד כאן רקע תיאורטי ועכשיו לשאלה של יאיר: אם יש לי 20 כפתורים מה לעשות? הפתרון פשוט: לכל כפתור יהיה ליסנר משלו שיידע לטפל בארוע הזה. הייתרון הגדול של ג´אווה שאפשר ליצור מחלקות ואובייקטים on the fly. הקוד ייראה משהו כמו (אני לא מול סביבת פיתוח ולכן אין לי אפשרות לבדוק סינטקס)
my_button.addactionlistener(new actoinlistener) { public void actionperformed (actioneven e) { // bla bla bla } });​
 

philips

New member
יפה יפה...

תמיד שאני מסביר את זה לתלמידים , יש קושי להבין לאנשים שעבדו ב VB...ובטוחים שהמודל של VB הוא עילאי .. נראה לי שאגנוב לך כמה דברים קטנים בהסבר
תודה
 

yair24

Member
רגע רגע...

הבנתי את התשובה שלך: אתה מוסיף ליסנר לכל כפתור בנפרד נכון? ואז כותב בתוך כל ליסנר את הACTIONPERFORMED שלו? לדעתי צורת התכנות הזו היא לא כל כך נוחה כי נוצר ככה קוד מבולגן עם יותר מדי סוגריים ויותר מדי מוזח (וכשקוד מוזח יותר מדי הוא יוצא מהמסך ימינה). זה קצת מזכיר לי עוד משהו בג´אווה: את הדרך של מימוש ACTIONLISTENER עם אדפטרים, (בשביל לא לממש פונקציות ריקות...) וגם שם יש מלא סוגריים אולי זה יותר יעיל כי לא צריך לממש את הפונקציות הריקות אבל עדיין הקוד יותר מדי מוזח. רק בשביל הפרוטוקול אני בא מC/C++ לא מVB, למרות שאני יודע לעבוד בVB. אמרת משהו על תפיסת העולם ה"שגויה" של VB, לא כל כך הבנתי אותך... הרי בVB כשאתה מוסיף כפתורים, אז כשאתה עושה דבל קליק על כפתור נפתחת פונקציה חדשה שנקראת: BUTTONNAME_CLICK, ובה אתה יכול לשים את הקוד שמטפל בארוע לחיצה על הכפתור, לדעתי זה אפילו יותר יפה ויותר מונחה עצמים מאשר השיטה שאתה הדגמת בג´אווה לא? יאיר
 

voguemaster

New member
אותו דבר

ואם מפריע לך כמות הסוגרים שיש, פשוט תחלק את העניין. אתה יכול ליצור מערך של אובייקטי LISTENER ולאתחל אותם, ואז להוסיף אחד אחד לכפתורים שלך ..
 

shed

New member
תגובה:

ל-voguemaster - נכון זה מה שכתבת. אני את התשובה שלי כתבתי לפני שקראתי את כל הדיון המפורט, ובנוסף הוספתי את הפן התיאורטי של המודל. אין ספק ששנינו מדברים על אותו פתרון. ליאיר: 1. "צורת התכנות הזו לא נוחה כי נוצר קוד מבולגן עם יותר מדי סוגריים" -אני ממש ממש לא מסכים איתך. הרעיון הבסיסי בתכנות מונחה עצמים זה שכל אובייקט דואג לעצמו. תאר לך שאתה עובד על פרוייקט של 80000 שורות קוד. ועכשיו אתה צריך לשנות את הצורה שבה מציגים אובייקט כל שהוא על המסך, או לחילופין להוסיף לו שדות, לפי המודל שאני הצגתי, אתה מטפל רק באובייקט שאתה צריך לשנות כל האחרים לא צריכים לדעת בכלל שמשהו השתנה. לפי המודל שלך אתה צריך לשנות ערימת אובייקטים, החל מהאפליקציה וכלה בליסנר הכללי. בקשר לכמות הסוגריים: כמה סוגריים ומשפטי if או switch - case יהיו לך באפליקציה שיכולים להיות בה 1000 אירועים??? (ויש מספיק אפליקציות כאלה). יכולים להיות אירועים של לחיצות, תזוזות, drag & drop מכל מיני מקומות, zoom in / out לתמונה ועוד ועוד ועוד. לפי המודל שלך ליסנר אחד יצטרך לתת מענה לכל האירועים הנ"ל, זה יהיה ליסנר מסורבל, איטי, ולא מובן. אם בעוד חצי שנה תרצה לשנות ארוע מסויים לא תמצא את הידיים ואת הרגליים בקוד של הליסנר. שלא לדבר על העובדה שאם אתה משנה אובייקט מסויים אתה צריך לשנות את הליסנר של אובייקט אחר! (אז איפה המונחה עצמים כאן???) 2. לגבי הוספת הכפתור והפונקציה buttonname_click : אני מאוד מקווה שאתה מבין שכאשר סביבת העבודה יוצרת את הפונק´ הנ"ל היא גם מוסיפה ליסנר לכפתור עצמו שמצביע על הפונקציה הנ"ל... כך שמבחינת קוד אין כאן שינוי, חוץ מהעובדה שהסתירו מהמתכנת את תפיסת העולם, ועל ידי כך כבלו אותו למעשה (אתה לא יכול ליצור מודלים משלך לטיפול בgui או כל דבר אחר). בג´אווה, לעומת זאת, אני יכול לכתוב מודל משלי לכל אובייקט. 3. לגבי בעיית הקוד המוזח שיוצא מהמסך (איזה חרוז!) תסלח לי אבל אני אתן לך תשובה מטופשת לשאלה לא יותר מדי חכמה : תקנה מסך ´19 ותעבוד ברזולוציה יותר גבוהה. או לחילופין, חלק את הפרוייקט שלך, בצורה נכונה, למספר קבצים, כל קובץ / אובייקט מטפל בדומיין שלו, לגבי כל האחרים הוא "קופסא שחורה", הם רואים רק איזה "חוטים" נכנסים או יוצאים ממנה, ולא מעניין אותם מה קורה בפנים. לא תיתקע עם שורות שזזות ימינה, וגם אם כאן תמיד אפשר ללחוץ enter...
 
למעלה