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

 

טיפול אירועים ב- JDK 1.1,
שיתוף אובייקט מאזין בין רכיבים ויזואליים

מבוא

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

 

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

 

פונקצית הטיפול באירועים עבור אובייקט מאזין:

·   מגיב לכל אירוע,

·   קובע איזה רכיב ויזואלי יצר את האירוע

·  ונוקט בפעולה המתאימה.

העניין הראשוני בסוג זה של פעולה הוא קביעת איזה רכיב יצר את האירוע.

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

 

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

תוכנית דוגמא

 

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

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

תוכנית זו נבדקה תוך שימוש ב- JDK 1.1.3 תחת Win95.

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

חלקי קוד מעניינים

 

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

הפונקציה main() מאתחלת אובייקט מסוג GUI (בשם gui) אשר מטרתו לספק ממשק ויזואלי.

חלקת מסגרת מורחבת לתוך מחלקה חדשה בשם MyFrame על מנת לאפשר את ביטול פונקצית paint() של המחלקה. הדבר נחוץ להצגת הקואורדינטות של לחיצות עכבר על פנים המסגרת תוך שימוש בפונקציה גרפית drawString().

אובייקטים של מוצא אירוע

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

 

    MyFrame myFrame1 = new MyFrame("Frame1");
    myFrame1.setVisible(true);

 

משתני הפוינטרים לשני האובייקטים מכונים myFrame1 ו- myFrame2.

כאשר הם מאותחלים, שמות ייחודיים (Frame1 ו- Frame2) ניתנים לאובייקטים המשתמשים בקוד שלהלן בבנאי עבור האובייקטים של מחלקת מסגרת המורחבת (מחלקת MyFrame מרחיבה את מחלקת מסגרת על מנת להעמיס את פונקצית   paint()).

 

  MyFrame(String name){//constructor
    setTitle("Copyright 1997, R.G.Baldwin");
    setSize(300,200);
    //name used to distinguish between the two objects
    setName(name);
  }//end constructor


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

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

 

MouseProc mouseProcCmd = new MouseProc(myFrame1,myFrame2);
myFrame1.addMouseListener(mouseProcCmd);
myFrame2.addMouseListener(mouseProcCmd); 


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

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

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

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

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

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

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

  

    WProc1 winProcCmd1 = new WProc1();
    myFrame1.addWindowListener(winProcCmd1);
    myFrame2.addWindowListener(winProcCmd1); 


 

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

רוב התכנות המורכב נמצא באובייקט מאזין עכבר, והעניין אינו מסובך מאוד.

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

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

מחלקת מאזין MouseProc בתוכנית זו

· מרחיבה את מחלקת MouseAdapter  

·  מעמיסה את פונקצית ()mousePressed המוכרזת בממשק מאזין עכבר.

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

 

כאשר פונקציה mousePressed() נקראת, אובייקט מסוג אירוע עכבר (ידוע כ- e) מועבר כפרמטר.

 

נעשה שימוש בהצהרה הבאה באובייקט מאזין עכבר על מנת לקבוע אם שם האובייקט אשר יצר את האירוע הוא Frame1.

  

if( e.getComponent().getName().compareTo("Frame1") == 0 ){

 

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

 

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

 

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

 

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

 

פונקצית getComponent() היא פונקציה ממחלקת java.awt.event.ComponentEvent אשר על פי תיעוד JDK 1.1 , "מחזירה את הרכיב במקום בו האירוע נוצר". הוא מוחזר כאובייקט מסוג רכיב אשר עליו פועלת פונקציה getName().

 

פונקצית ה- getName()  נוספה למחלקת java.awt.Component על יד JDK 1.1. פונקציה זו "משיגה את שם הרכיב" ומחזירה אותו כאובייקט מחרוזת. על אובייקט המחרוזת פועלת פונקצית compareTo().

 

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

 

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

 

דרך אגב, במקרה ולא שמת לב, חבילת ה- java.awt.event היא שונה מחבילת java.awt. חבילת java.awt.event נוספה ל JDK 1.1. ייתכן בלבול אם תכנס לחבילת java.awt של התיעוד כאשר אתה זקוק ל- java.awt.event.

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

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

 

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

 

רישום תוכנית

 

תוכנית דוגמא נוספת

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

 

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

 

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

 

שם האובייקט אשר יצר את האירוע יכול להיקבע תוך שימוש בהצהרה שלהלן בה

·                       e זהו השם המקומי של האובייקט המועבר לפונקצית טיפול אירועים ברמה נמוכה,

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

 

if( e.getComponent().getName().compareTo("Frame") == 0 ){}


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

הדבר מודגם בתוכנית הבאה אשר משנה את התוכנית הקודמת בכדי להשתמש ב

·  אובייקט מסגרת ויזואלי,

·  אובייקט חלון ויזואלי

 

במקום שני אובייקטים של מסגרת ויזואליים.

 

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

 

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

 

רישום תוכנית דוגמא נוספת

 

 06-12-03 / 19:16  עודכן ,  13-10-03 / 20:28  נוצר ע"י רונית רייכמן  בתאריך 
 רישום תוכנה SwingEvent09 - הקודםהבא - סקירה 
תגובות הקוראים    תגובות  -  0
דרכונט
מהי מערכת הדרכונט?
אינך מחובר, להתחברות:
דוא"ל
ססמא
נושאי לימוד
חיפוש  |  לא פועל
משלנו  |  לא פועל
גולשים מקוונים: 1