מקטעי קוד מעניינים
חלק ניכר מהקוד בתכנית זו חוזר על קוד שכבר ראית בתכניות קודמות. בנוסף, רוב הקוד מורכב מהצהרות System.out.println() אשר נמצאות שם כדי להסביר מה קורה כאשר אתה מסתכל בפלט. בעקרו של דבר, נדלג על קוד שראית בעבר ונתרכז רק בקוד הרלוונטי למטרה של התכנית הזאת – המחשה של אירועים המחוללים ע"י תכנית עם דגש מיוחד על המחלקה AWTEventMulticaster .
מקטע הקוד המעניין הראשון מבזיק שני אובייקטים של המחלקה הלא-ויזואלית עם תוויות ומקצה שמות לאובייקטים. כאשר אתה מקצה שמות באופן שכזה, עלייך לוודא כי אתה מקצה שם ייחודי לכל אובייקט.
NonVisual aNonVisual = new NonVisual("NonVisualObj A"); aNonVisual.setName("NonVisualObjA"); NonVisual bNonVisual = new NonVisual("NonVisualObj B"); bNonVisual.setName("NonVisualObjB"); |
מקטע הקוד המעניין הבא רושם אובייקטי ActionListener (מאזין לפעולה) על שני האובייקטים הלא-ויזואליים כפי שתואר קודם לכן. שים לב שלא כמו תכנית העצמות-החשופות, תכנית זו משתמשת בשם הקונבנציונלי של AddActionListener() עבור המתודה היוצרת את הרשימה של אובייקטים ActionListener הרשומים.
aNonVisual.addActionListener(new FirstActionListener()); bNonVisual.addActionListener(new FirstActionListener()); bNonVisual.addActionListener(new SecondActionListener()); |
מקטע הקוד הבא המעניין גורם לכל אחד מהאובייקטים הלא-ויזואליים לחולל אירוע פעולה. שים לב כי איזה-שהוא קוד לא מעניין נמחק בין שתי הצהרות אלה הנראות להלן .
aNonVisual.generateActionEvent(); ... bNonVisual.generateActionEvent(); |
לאחר מכן ישנן שתי הגדרות מחלקה של ActionListener סטנדרטיות יחסית, אשר לא נחזור עליהן שוב כאן.
מקטע הקוד המעניין הבא הוא ההתחלה של המחלקה הלא-ויזואלית אשר מותחת את מחלקת הרכיב (Component) ואת ההצהרה של שני משתני מופע של המחלקה. (שים לב כי כמה הערות הוסרו ממקטע הקוד) .
class NonVisual extends Component { ... String ID; // The ID of the object ActionListener actionListener; |
משתנה המופע הראשון במקטע הקוד שלמעלה הוא התייחסות לזיהוי של האובייקט אשר מועבר כפרמטר כאשר האובייקט מובזק. בתכניתנו, זהו אובייקט מחרוזת המועבר כפרמטר לבנאי כאשר האובייקט הלא ויזואלי מובזק. הבנאי מורכב מפסוק השמה יחיד אשר מבצע השמה של הפרמטר שהתקבל למשתנה המופע הזה, כך שלא נראה אותו כאן. משתנה המופע הבא עם המגדיר של actionListener הוא חיוני לתכנית זו. ברגע שנרשמים אובייקטי actionListener על אובייקט לא-ויזואלי זה, משתנה מופע זה או יכלול התייחסות לאובייקט actionListener יחיד (אם יש רק אובייקט actionListener אחד), או יכלול התייחסות לאובייקט מסוג AWTEventMulticaster (אם יש יותר מאובייקט אחד של actionListener). במקרה השני, כאשר אנו מאוחר יותר קוראים לעזרה של מתודת actionPerformed () על משתנה המופע המכונה actionListener, אנו מפעילים למעשה מתודה זו על אובייקט מסוג AWTEventMulticaster אשר, בתורו, יפעיל את המתודה על כל האובייקטים מסוג actionListener הכלולים ברשימה של אובייקטי actionListener הרשומים על האובייקט הלא-ויזואלי. כפי שתואר קודם לכן, זה המאפיין המרכזי של המחלקה AWTEventMulticaster .
מקטע הקוד המעניין הבא הוא הקוד הבונה את הרשימה של אובייקטים הרשומים כאובייקטי מאזין על אובייקט לא ויזואלי ספציפי. אובייקטים חדשים מוספים לרשימה ע"י קריאה למתודה add() הסטטית של המחלקה java.awt. AWTEventMulticaster והעברה אליה את משתנה המופע אשר מתייחס לרשימה יחד עם אובייקט המאזין החדש אשר יש להוסיף לרשימה. כאשר האובייקט הראשון מוסף לרשימה, מוחזרת התייחסות לאובייקט המאזין עצמו. לפיכך, במקרה של רשימה המכילה אובייקט מאזין יחיד, ההתייחסות לרשימה היא בפשטות התייחסות לאובייקט המאזין. כאשר מוספים אובייקטי מאזין נוספים לרשימה, התייחסות לאובייקט מטיפוס java.awt AWTEventMulticaster מוחזר ע"י מתודת הadd() של המחלקה .AWTEventMulticaster לפי התיעוד של 1.1 JDK על המחלקה :AWTEventMulticaster "מחלקה זו תטפל במבנה של שרשרת אירועי מאזין ((listeners ותשגר אירועים למאזינים הללו". כאשר המתודה actionPerformed() מופעלת מאוחר יותר על ההתייחסות לרשימה, המתודה תופעל או על אובייקט יחיד מסוג ActionListener או שתופעל על אובייקט מסוג AWTEventMulticaster. במקרה השני, המתודהctionPerformed() של המחלקה WTEventMulticaster תופסת אחריות להפעלת המתודה actionPerformed() על כל האובייקטים ברשימה.
עם הקדמה ארוכה זו, מקטע הקוד המעניין אינו כה סבוך.
"This class will manage the structure of a chain of event listeners and dispatch events to those listeners." |
עניין מיוחד יש לנו בפלט המיוצר ע"י התכנית כאשר שני אובייקטי ActionListener שונים רשומים על אובייקט לא ויזואלי יחיד. במקרה זה, הפנה תשומת לב מיוחדת לזיהוי (מודגש באותיות שחורות בולטות) של אובייקט המאזין המועבר כפרמטר למתודה AddActionListener() והזיהוי של האובייקט אשר בסופו של דבר מיוחס ע"י משתנה המופע אשר מתייחס לרשימה.
כאשר אובייקט המאזין הראשון הוסף לרשימה, ההתייחסות היתה לאובייקט עצמו. כאשר אובייקט המאזין השני הוסף לרשימה, ההתייחסות היתה ל java.awt AWTEventMulticaster@1cc799 . חלק מהפלט מהתכנית הממחיש התנהגות זו מובא להלן (יחד עם כמה החזרות ערך קשות אשר הוחדרו ידנית) .
actionListener = AWTEventMulticaster.add(actionListener, listener); |
מקטע הקוד המעניין הבא מתרחש במתודה generateActionEvent() . המטרה של מתודה זו היא להבזיק אובייקט ActionEvent (אירוע פעולה) ולהפעיל את המתודהactionPerformed() על משתנה ההתייחסות לרשימה של אובייקטים ActionListener המעבירה את אובייקט הActionEvent כפרמטר.
addActionListener() method invoked NonVisualObj B: Listener to add is: FirstActionListener@1cc761 Invoke AWTEventMulticaster.add() to get reference to ActionListener NonVisualObj B: Ref to ActionListener is: FirstActionListener@1cc761 addActionListener() method invoked NonVisualObj B: Listener to add is: SecondActionListener@1cc783 Invoke AWTEventMulticaster.add() to get reference to ActionListener NonVisualObj B: Ref to ActionListener is: java.awt.AWTEventMulticaster@1cc799 |
כפי שהוזכר קודם לכן, פסוקי פלט רבים הוכללו בתכנית זו כך שהפלט יכיל הסבר של מה שקורה בזמן שהתכנית מבוצעת. יחידה זו הדגישה רק את הקוד הנחוץ ליישם אירועים המחוללים ע"י תכנית עם ריבוי משימות. פירוט שלם של התכנית יחד עם הפלט המיוצר ע"י התכנית כלול ביחידה הבאה.