» נושאי לימוד
» נושאי לימוד
יום שני 29 באפריל 2024
קטעי קוד מעניינים
דף ראשי  מתקדמים  Event Handling in JDK 1.1, Handling Events in Lightweight Components  תוכנית לדוגמא  קטעי קוד מעניינים גרסה להדפסה

קטעי קוד מעניינים

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

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

LWButton aLWButton = new LWButton("LW Button A");
    Button myStdButton = new Button("Std Button");    
    LWButton bLWButton = new LWButton("");

    bLWButton.setLabel("LW Button B");

 

לאחר שאובייקטי ה LWButton נוצרים, אובייקטי ActionListener נוצרים ונרשמים עליהם ע"י הפעלת מתודת ה AddActionListener() המוגדרת במחלקה LWButton.

aLWButton.addActionListener(new MyActionListener());
    bLWButton.addActionListener(new MyActionListener());
    myStdButton.addActionListener(new MyActionListener());

 

אז מוסיפים את אובייקטי LWBut החדשים לאובייקט מסגרת תוך שימוש בקוד סטנדרטי.

 myFrame.add(aLWButton);
    myFrame.add(myStdButton);
    myFrame.add(bLWButton);

 

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

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

 String label; // The label on the button
  boolean pressed = false; // Becomes true if the button is pressed.
  //Refers to a list of ActionListener objects
  ActionListener actionListener;

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

משתנה הדוגמא המכונה pressed (לחוץ) בא לידי שימוש בלוגיקה עבור אובייקט   LWButton על מנת להחליט מתי לגרום לזה לשנות צבע וגם להחליט מתי לחולל ActionEvent.

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

 enableEvents(AWTEvent.MOUSE_EVENT_MASK);

 

להלן התיאור של המתודה ()enableEvents הלקוחה ישירות מתיעוד המחלקה java.awt.Component.

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

כעת הבה נסתכל במתודה ()enableEvents מנקודת מבט אחרת. הדבר הבא נובע מתיאור המתודה ()processMouseEvent של המחלקה Component. הסיבה לכך שזה חשוב היא שאנו נאכוף את המתודה       ()processMouseEvent   אחר כך.

 "עיבוד  אירועי עכבר המתרחשים על רכיב זה ע"י שיגורם לכל אובייקטי MouseListener הרשומים. שים לב: אין לקרוא למתודה זו אלא אם כן אירועי עכבר מותרים עבור רכיב זה; זה קורה כאשר אחד מהדברים הבאים מתרחש:

אובייקט MouseListner נרשם דרך addMouseListener()

 אירועי עכבר מותרים דרך enableEvents()

 

מחלקות המפעילות מתודה זו  צריכות לקרוא ל  super.processMouseEvent() כדי לוודא שעיבוד אירוע של ברירת מחדל ממשיך נורמלית."

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

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

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

 הדרך השנייה היא לצרף קריאה למתודת enable…() עם הפעלה של מתודה  process…Event().

שתי הגישות באות לידי שימוש בתכנית הזו.

מקטע הקוד המעניין הבא היא השיטה הבאה שיוצרת רשימה של  אובייקטי ActionListener רשומים אשר צריכים להיות מיודעים בכל פעם שאובייקט ה LWButton מחולל  ActionEvent. זה בהכרח אותו הקוד אשר ראינו בשיעור מוקדם יותר אשר דן באירועים המחוללים על ידי תכנית. השימוש במתודה () AWTEventMulticaster.add

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

 public void addActionListener(ActionListener listener) {
    actionListener = AWTEventMulticaster.add(actionListener, listener);
  }//end addActionListener()

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

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

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

 לשנות את ההופעה של אובייקט LWButton על מנת שיספק משוב ויזואלי למשתמש.

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

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

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

 switch(e.getID()) {
      case MouseEvent.MOUSE_PRESSED:
        pressed = true;
        repaint(); 
        break;

 

 מקטע קוד זה  מבחין באירוע MOUSE PRESSED (עכבר לחוץ) ומכוון את משתנה הדוגמא pressed של האובייקט לtrue  (אמת). אז נקראת מתודת הrepaint() (צביעה מחדש). זה גורם לשיטת הpaint להיקרא. הלוגיקה במתודה paint() המופעלת משתמשת בערך של משתנה הדוגמא pressed להחליט מה לעשות לגבי צבע אובייקט ה LWButton.

מקטע הקוד הבא מבחין במאורע MOUSE RELEASED (עכבר משוחרר) ועושה שני דברים.

 case MouseEvent.MOUSE_RELEASED:
        if(actionListener != null) {//if an ActionListener is registered
           actionListener.actionPerformed(new ActionEvent(
               this, ActionEvent.ACTION_PERFORMED, label));
        }//end if on actionListener
        if(pressed == true) {
          pressed = false;
          repaint();
        }//end if on pressed
    
    break;

תחילה, מאשר כי הרשימה של אירועים של ActionListener אינה ריקה, ואם הרשימה אינה ריקה, הוא מפעיל את המתודה actionPerformed על ההתייחסות לרשימה. זה אותו דבר כקוד אשר ראינו בשיעור מוקדם יותר על אירועים המחוללים ע"י תכנית.

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

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

 case MouseEvent.MOUSE_ENTERED:
        System.out.println("Mouse entered for illustration only");
        break;
      case MouseEvent.MOUSE_EXITED:
        System.out.println("Mouse exited for illustration only");
        break
;

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

super.processMouseEvent(e);

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

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

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

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

אולם מ 23/3/97 יש פגם גלוי בתכנת 1.1 JDK (לפחות ביישום של חלונות 95) אשר גורם לקואורדינטת y של מצביע העכבר להיות מדווחת עם קיזוז שגוי. לכן, מתודה זו מחזירה שקר אם המצביע הוא בפנים אך ליד החלק העליון של אובייקט ה LWButton ומחזירה  אמת אם מצביע העכבר הוא בחוץ אך ליד החלק התחתון של אובייקט LWButton. אחרת נראה כי היא עובדת באופן תקין (נראה כי בעיה זו נפתרה ב1.1.3 JDKׂ)

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