» נושאי לימוד
» נושאי לימוד
יום שני 29 באפריל 2024
אירועים ברמה נמוכה ואירועים סמנטיים
דף ראשי  מתקדמים  אירועים ברמה נמוכה ואירועים סמנטיים גרסה להדפסה

 טיפול באירועים ב- JDK 1.1 ,
 אירועים ברמה נמוכה ואירועים סמנטיים

- מבוא

- סקירה כללית

- תוכנית דוגמא עבור אירועים ברמה נמוכה

- תוכנית דוגמא של אירועים ברמה נמוכה ואירועים סמנטיים

           - ארועי מיקוד

           - ארועי פעולה

           - אובייקט מאזין פעולה

           - אובייקט מאזין מיקוד

           - אובייקט מאזין עכבר

           - אובייקט מאזין חלון

           -  הערות כלליות נוספות אודות התוכנית

           - לבסוף, התוכנית

- סקירה

 


מבוא

שיעור קודם דן בקצרה בהבדלים בין אירועים ברמה נמוכה לאירועים סמנטיים כפי שמתוארים בתיעוד של JDK 1.1.

 

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

סקירה כללית

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

 

ההבדל העיקרי נראה בטבעו של אובייקט האירוע אשר מועבר למטפל באירועים כאשר אירוע מתרחש.

 

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

 

במקרה של אירוע ברמה נמוכה, פונקצית ה- getComponent() של מחלקת java.awt.event.ComponentEvent תחזיר פוינטר לאובייקט הממשי אשר יצר את האירוע.

 

ברגע שהפוינטר זמין, ישנם עשרות פונקציות של מחלקת רכיב אותן ניתן לעורר על האובייקט, כדוגמת getLocation(), getLocationOnScreen(), getMaximumSize(), getMinimumSize(), getName() וכ"ו.

 

תוכנית דוגמא בשיעור קודם עוררה את פונקצית ה- getName() על אובייקט כזה על מנת לקבוע איזה אובייקט מבין מספר אובייקטים יצר אירוע עכבר ברמה נמוכה.

 

תוכנית דוגמא אותה נראה מאוחר יותר בשיעור קוראת לחלק מהפונקציות האחרות הזמינות על אובייקט רכיב.

 

כל מחלקות אירוע ברמה נמוכה הן תת-מחלקות של מחלקת java.awt.event.ComponentEvent, כך שמטפלי אירועים עבור כל האירועים ברמה נמוכה הם בעלי גישה לאובייקט אשר יצר את האירוע.

 

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

 

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

 

חשיבות עניין זה תלויה בצרכים שלך.

 

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

 

ללא קשר ליכולת לגשת לאובייקט אשר יצר את האירוע, שם האובייקט הוא נגיש למטפלי אירועים של אירועים ברמה נמוכה וכן לאירועים סמנטיים.

 

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

תוכנית דוגמא עבור אירועים ברמה נמוכה

התוכנית הבאה מציגה חלק מיכולותיהם של אירועים ברמה נמוכה.

 

אובייקט כפתור ואובייקט שדה טקסט ממוקמים בחלקו העליון והתחתון של אובייקט מסגרת.

 

אובייקט מאזין עכבר מאותחל ונרשם לעקוב אחר  אירועי mousePressed() ברמה נמוכה על כל שלושת האובייקטים.

 

בכל פעם שאירוע mousePressed() מתרחש, האובייקט המאזין משיג ומציג מספר חלקי מידע אודות האובייקט שיצר את האירוע.

 

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

 

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

 

תוכנית דוגמא

 

מידע נוסף אודות התוכנית נמצא בהערות.

 

תוכנית דוגמא של אירועים ברמה נמוכה
ואירועים סמנטיים

תוכנית הדוגמא הבאה מספקת טיפול באירועי רמה נמוכה וכן אירועים סמנטיים עבור אותם שלושת הרכיבים שהופיעו בתוכנית הקודמת.

 

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

 

טיפול באירועים סמנטיים מסופקת על ידי אירועי פעולה (action). טיפול באירועים ברמה נמוכה מסופקת על ידי אותם רכיבים עבור אירוע mousePressed() ואירוע מיקוד (focus). (שים לב שלפני ה- 3/2/97, חלק זה התייחס בטעות לאירועי מיקוד כאל אירועים סמנטיים).

אירועי מיקוד(focus)

ב-Java, רכיב הוא בעל המיקוד כאשר הוא יכול לקבל קלט של מקלדת. ישנם מספר דרכים שעל ידן המיקוד יכול לעבור מרכיב אחד לאחר. בכל פעם שעובר המיקוד, רכיב אחד מייצר אירוע focusLost() ורכיב אחר מייצר אירוע focusGained().

 

ישנם גם עניינים המעורבים בשינויים זמניים וקבועים במיקוד אשר אינם נידונים כאן, אך ניתן למצוא אותם בתיעוד של JDK 1.1.

 

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

 

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

אירועי פעולה

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

 

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

 

אובייקט מאזין פעולה (ActionListener)

 

בתוכנית זו אובייקט מאזין פעולה מאותחל ונרשם על מנת לפקח על אירועים מסוג semanticactionPerformed() על הכפתור ושדה הטקסט.

 

כאשר אירוע  actionPerformed() מיוצר, נתונים מסוימים אודות האירוע מאוכסנים בתוך אובייקט אשר מועבר לפונקצית actionPerformed() של האובייקט המאזין. מידע זה כולל את מה שתיעוד JDK 1.1  מכנה שם הוראה (command name). הגישה למידע היא על ידי קריאה לפונקציה getActionCommand() שעל גבי האובייקט. בתוכנית זו, נגשים לשם ההוראה ומציגים אותו על גבי המסך.

 

מסתבר, ששם ההוראה הקשור לכפתור הוא בפשטות הטקסט, הכותרת, או התווית על הכפתור. (בכל שם שתבחר לקרוא לזה). שם ההוראה הקשור לשדה טקסט הוא תוכן הטקסט הנוכחי של אובייקט שדה הטקסט.

 

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

 

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

 

בתוכנית זו, בכל פעם שפונקצית actionPerformed() נקראת , הפונקציה משתמשת בפונקצית indexOf() על מנת לזהות את הרכיב אשר יצר את האירוע ומציג הודעה המזהה רכיב זה.

 

אובייקט מאזין מיקוד (focus listener)

 

אובייקט מאזין מיקוד מאותחל ונרשם על מנת לפקח על אירועי focusGained() ו- focusLost() ברמה נמוכה על כפתור ושדה טקסט. (שים לב שלפני ה- 3/2/97 חלק זה כונו שני אירועי המיקוד בטעות אירועים סמנטיים).

 

בכל פעם שמתרחש אירוע focusGained(), הודעה מוצגת אשר מזהה את האובייקט שקיבל מיקוד.

 

כך גם בכל פעם שאירוע focusLost()  מתרחש, הודעה מוצגת מזהה את האובייקט אשר איבד מיקוד.

 

האובייקט אשר קיבל או איבד מיקוד מזוהה על ידי ביצוע מבחן תנאי על אובייקט ה- FocusEvent המועבר כפרמטר באותו אופן בו משתמשים באובייקט אירוע פעולה עבור אירועי פעולה.

אובייקט מאזין עכבר

אובייקט מאזין עכבר מאותחל ונרשם כדי לעקוב אחר אירועי mousePressed() ברמה נמוכה על כל שלושת האובייקטים. (שים לב שישנם מספר אירועי עכבר אחרים אשר ניתן לעקוב אחריהם אך הם הושמטו למען הפשטות).

 

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

 

בנקודה זו, כדאי לציין ש- JDK 1.1 Beta 3 אינו דורש מהמתכנת לתת שמות ייחודיים לרכיבים כאשר הם מאותחלים. שמות רכיבים נתונים ניתנים להעתקה בין רכיבים. (אני תוהה אם זהו באג? מוצרים אחרים של Visual Basic ו- Delphi אוסרים על המתכנת לתת שמות משוכפלים לרכיבים).

 

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

 

גישה זו להשגת שם רכיב בתוכנית זו משתמשת בפונקצית indexOf() של מחלקת מחרוזת על גבי אובייקט המאזין לעכבר. ( זוהי גישה קצת פחות מורכבת מהגישה להשגת שם הרכיב עבור אירוע mousePressed() בשיעור קודם, בה חזרנו את כל הדרך לאובייקט רכיב וקראנו לפונקציה getName()).

 

כאשר מתרחש אירוע mousePressed() על אחד משלושת האובייקטים הויזואליים, אובייקט מאזין עכבר מציג הודעה המזהה את האובייקט שיצר את האירוע.

 

אובייקט מאזין חלון (windowListener)

 

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

הערות כלליות נוספות אודות התוכנית

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

 

על מנת לשמור על פשטות, התגובה לאירועים בתוכנית מוגבלת להצגת הנתונים. מן הסתם, ברגע שהשליטה נמצאת בתוך מטפל באירועים, ניתן לתכנת התנהגות משמעותית כתגובה לאירוע.

 

תוכנית זו מדגימה בנוסף את העובדה שפעולת משתמש יחידה יכולה לגרום להרבה סוגים שונים של אירועים להיווצר.

 

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

לבסוף, התוכנית

 

 07-12-03 / 18:27  עודכן ,  13-10-03 / 20:41  נוצר ע"י רונית רייכמן  בתאריך 
 רישום תוכנית לדוגמא נוספת - הקודםהבא - תוכנית דוגמא עבור אירועים ברמה נמוכה 
תגובות הקוראים    תגובות  -  0
דרכונט
מהי מערכת הדרכונט?
אינך מחובר, להתחברות:
דוא"ל
ססמא
נושאי לימוד
חיפוש  |  לא פועל
משלנו  |  לא פועל
גולשים מקוונים: 7