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

טיפול בארועים ב JDK 1.1, טיפול בארועים במחלקות מורחבות ללא אובייקטי מאזין

 

            הקדמה

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

 

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

 

מרכיבים מהותיים בהרחבת רכיבים קיימים

 

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

 

הגדר את המכיל הראשי לתצוגה. בשיעור זה המכיל הראשי יהיה הפריים (Frame).

הגדר מחלקה לרכיב החדש תוך כדי הורשה מרכיב קיים. בתוכנית זו המחלקה לרכיב החדש תהיה ירושה מ TextField.

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

עוד ארועים זמינים הם processMouseEvent(),processActionEvent() וכו'.

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

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

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

הוסף רכיב חדש זה למכיל הראשי שלו.

 

 ההסבר המאוד ארוך והבא של הכלל לגבי super.processKeyEvent(e) ביחד עם תוכנית של דוגמה נלקחה מהתעוד של javasoft של  JDK 1.1.3 מהמקום הבא.

 

/java/dics/guide/awt/designspec/events.html

 

שים לב במיוחד לקריאה ללא תנאי ל super.processKeyEvent(e)בסוף האירוע הנקרא processFocousEvent(FocousEvent e). לא כל ספרים מראים את זה כקריאה ללא התנייה.

 

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

 

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

 

 

בחירה של סוגי ארועים

 

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

 

  protected final void enableEvents(long eventsToEnable)
 

הפרמטר לארוע זה מייצג את הפרשי הביטים של סוגי הארועים שאתה רוצה לאפשר. המייצגים של הארועים מוגדרים ב JAVA.AWT.AWTEVENT. שים לב ששינוי המייצג לא ישפיע על משלוח של ארועים למאזינים - זה רק שולט במשלוח לשיטות העיבוד של הרכיבים. השורה התחתונה היא שסידרת ארועים שנמסרים ל PROCESSEVENT() מוגדרים על ידי איחוד של סוגי ארועים שהם בעלי מאזינים שנרשמו וארועים שבמפורש הודלקו דרךENABLEEVENTS() .

 

דוגמה לשימוש במנגנון ההרחבה

 

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

 

  
    public class TextCanvas extends Canvas {
          boolean haveFocus = false;

          public TextCanvas() {
              enableEvents(AWTEvent.FOCUS_EVENT_MASK); 
              ...
          }
          protected void processFocusEvent(FocusEvent e) {
              switch(e.getID()) {
                case FocusEvent.FOCUS_GAINED:
                  haveFocus = true;
                  break;
                case FocusEvent.FOCUS_LOST:
                  haveFocus = false;
              }
              repaint(); 

             
// let superclass dispatch to listeners
              super.processFocusEvent(e); 
          }
          public void paint(Graphics g) {
              if (haveFocus) {
                  // render focus feedback...
              }
          }
          ...rest of TextCanvas class...
   
}

 

 

שים לב שזו לא הדרך היחידה לטפל בארועים ברכיבים מורחבים. הטיפול באירועים ב JDK 1.1 מאוד גמיש. זו פשוט הדרך שנבחרה לשעור הספציפי הזה.

 

 31-10-03 / 14:33  נוצר ע"י רונית רייכמן  בתאריך 
 Paint Events - הקודםהבא - תוכנית לדוגמא 
תגובות הקוראים    תגובות  -  0
דרכונט
מהי מערכת הדרכונט?
אינך מחובר, להתחברות:
דוא"ל
ססמא
נושאי לימוד
חיפוש  |  לא פועל
משלנו  |  לא פועל
גולשים מקוונים: 5