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

Swing  ומודל נציג אירועים
(Event Delegation Model)

 

תכנות Java, שיעור 81#, מתוקנן 05/09/98.

סטודנטים בשיעורי תכנות Java  ביניים ב- ACC אחראים להכרת והבנת כל החומר בשיעור זה.

 

- הקדמה

- מבוא

-   תכנות דוגמא

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

     - רישום התוכנה

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

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

     - רישום תוכנית  SwingEvent09

- סיכום

 


 

מבוא

לשם התחלה, מהו Swing?

 

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

 

לרכיבי  Swing יש מספר יתרונות על רכיבי AWT, וכן גם מספר חסרונות.

 

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

 

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

 

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

 

רכיבי ה- Swing תומכים במודל JDK 1.1. הם לא תומכים במודל אירוע JDK 1.0 כך שאם תרצה להשתמש ברכיבי Swing, עליך לתכנת תוך שימוש במודל נציג האירועים.

 

במקרים מסוימים, המרה של האפליקציה או ה- applet מרכיבי AWT  לרכיבי Swing כוללת רק החלפת רכיבי ה-  AWT ברכיבי ה- Swing  התואמים. לדוגמא, רכיב ה- Swing התואם לרכיב Button של AWT הוא רכיב Swing JButton.

 

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

שיעור זה תוכנן אחרי השיעור הקודם בשם "טיפול באירועים ב- JDK 1.1, מבט ראשון, מודל נציג האירועים" (Event Handling in JDK 1.1, A First Look, Delegation Event Model). לא תהיה חזרה על דברים שהוצגו בשיעור זה.

 

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

 

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

 

בנוסף, לרכיבי Swing רבים אין מקבילים ב- AWT. מספר רכיבים חדשים ומלהיבים כלולים בתוך ספריית Swing אשר אינם קיימים ב-AWT. (tooltips, רצועות תהליך (bar tips), עצים, וכו' ).

 

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

 

תוכנית דוגמא

 

תוכנית הדוגמא בחלק זה, ששמה SwingEvent08, נוצרה על ידי החלפת כל אובייקט של Frame בתוכנה בשם Event08 באובייקט של Jframe. בנוסף, הצהרת יבוא נוספה על מנת לגרום למחלקות Swing להיות נגישים למהדיר ולמתרגם.

 

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

 

התוכנה מדגימה את השימוש במקורות אירוע (Event Sources), מאזיני אירוע (Event Listeners)  ומתאמים(Adapters) במודל נציג אירועים עבור רכיבי Swing.

 

בקצרה, אפליקציה זו מאתחלת אובייקט אשר יוצר ממשק משתמש המורכב מאובייקט JFrame פשוט.

אובייקט זה הוא מקור אירוע אשר מיידע שני אובייקטים של מאזיני אירוע שונים מאירועי Window.

 

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

 

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

 

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

 

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

 

התוכנה נבדקה תוך שימוש ב- JDK 1.1.6   ו- Swing 1.0.1 תחת Win95.

 

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

 

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

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

 

class GUI{
  public GUI(){//constructor
    //Create a new JFrame object
    JFrame displayWindow = new JFrame();
    displayWindow.setSize(300,200);
    displayWindow.setTitle("Copyright 1998, R.G.Baldwin");

 

 

 

 

 

 

 

 

 

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

 

רישום התוכנה

 

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

 

זוהי גרסת Swing  של התוכנה בשם Event09.

 

מטרת תוכנה זו היא להדגים שבמקרים רבים, המרת תוכנית AWT לתוכנית Swing אינה פשוטה וכוללת רק יבוא חבילת ה-Swing  והחלפת רכיבי ה-AWT במקבילים שלהם ב-Swing.

 

דבר זה נעשה בתוכנה זו. תוכנה זו היא זהה לתוכנית AWT בשם Event09 מלבד לכך שכל האובייקטים של Frame הוחלפו ב- JFrame וחבילת  Swing יובאה.

 

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

 

בהתחלה, נראה שהתוכנה עובדת נכון. אבל, כשכל לחיצה חדשה מתרחשת באזור הלקוח של ה- JFrame, זוג חדש של ערכי קואורדינטות מוצג, אך הזוג הקודם של ערכי קואורדינטות לא נעלם, כפי שקורה במקרה של התוכנה בשם Event09. כך, שההתנהגות  היא שונה בתכלית תחת  JDK 1.1.6 ו- Swing 1.0.1 תחת Win95.

 

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

 

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

 

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

 

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

 

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

חלק הקוד היחיד שיודגש יהיה חלק המדגים כיצד תוכנה זו מרחיבה את ה- JFrame למחלקה חדשה בשם MyFrame על מנת לאפשר ביטול פונקצית ה- paint() של מחלקת JFrame. זכור כי בתוכנה בשם Event09, מחלקת ה- Frame הורחבה בצורה דומה.

 

class MyFrame extends JFrame{
  int clickX;
  int clickY;
    public void paint(Graphics g){
    g.drawString( 
       "" + clickX + ", " + clickY, clickX, clickY);
  }//end paint()}//end class MyFrame

 

 

 

רישום תוכנה של SwingEvent09

 

סיכום

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

 

רכיבי ה- Swing  אינם ניתנים לתכנות תוך שימוש במודל האירוע ב- JDK 1.0.

 

במקרים מסוימים, כל מה שנחוץ על מנת להמיר תוכנה הבנויה סביב רכיבי AWT לתוכנה הבנויה סביב רכיבי Swing  הוא לייבא את מחלקות ה- Swing  ולהחליף את כל האובייקטים של רכיביAWT  עם המקבילים להם ב- Swing.

 

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

 

לרבים מרכיבי ה-  Swing החדשים  אין מקביל ב-AWT. מחלקות ה- Swing  מכילות מספר רכיבים חדשים אשר לא נוספו לספריית רכיבי AWT.

 

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

 

 06-12-03 / 18:29  עודכן ,  13-10-03 / 20:11  נוצר ע"י רונית רייכמן  בתאריך 
 חלקי קוד מעניינים + סיכום - הקודםהבא - SwingEvent08 רישום תוכנית 
תגובות הקוראים    תגובות  -  0
דרכונט
מהי מערכת הדרכונט?
אינך מחובר, להתחברות:
דוא"ל
ססמא
נושאי לימוד
חיפוש  |  לא פועל
משלנו  |  לא פועל
גולשים מקוונים: 4