» נושאי לימוד
» נושאי לימוד
יום שני 29 באפריל 2024
מקטעי קוד מעניינים
דף ראשי  מתקדמים  Container Events and More on Inner Classes  תכנית לדוגמה ראשונה  מקטעי קוד מעניינים גרסה להדפסה

 

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

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

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

class Event32 extends Frame
  implements ContainerListener,ActionListener{
    
    Label displayLabel;//reference to a Label for display

 

 

 

 

 

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

 

  void addButtons(String labels){
    for(int cnt = 0; cnt < labels.length();cnt++){
      this.add(new Button(labels.substring(cnt,cnt+1)));
    }//end for loop
  }//end addButtons()  

 

 

 

 

 

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

  this.setLayout(new GridLayout(0,4,3,3));

 

 

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

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

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

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

 

    this.addContainerListener(this);

 

 

 

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

    this.addButtons("789+456-123=0.X/C");

 

 

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

 

    displayLabel = new Label("00000");
    this.add(displayLabel);
    displayLabel.setBackground(Color.yellow);

 

 

 

 

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

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

 

     this.addWindowListener(
      new WindowAdapter(){//anonymous class definition
        public void windowClosing(WindowEvent e){
          System.exit(0);//terminate the program
        }//end windowClosing()
      }//end WindowAdapter
    );//end addWindowListener
  }//end constructor

 

 

 

 

 

 

 

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

 

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

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

שוב שים לב כי אובייקט this הוא אובייקט מאזין לפעולה הנרשם משום שהמחלקה השולטת מיישמת את ממשק ActionListener ומתודת actionPerformed()  מוגדרת במחלקה השולטת.

מתודת הgetChild() של אובייקט הContainerEvent מחזירה התייחסות לרכיב אשר הוסף למיכל אשר יצר את האירוע מלכתחילה. ההתייחסות מוחזרת כטיפוס Component (רכיב) , ומבצעים לו המרה (cast) לטיפוס כפתור ומבצעים השמה  למשתנה ההתייחסות המכונה כפתור. האובייקט המכונה כפתור אז הופך למקור אשר עליו אובייקט ה ActionListener נרשם.

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

 

  public void componentAdded(ContainerEvent e){
    if(e.getID() == ContainerEvent.COMPONENT_ADDED){
      if(e.getChild() instanceof Button){
        Button button = (Button)e.getChild();
        //Register an ActionListener object on the button
        button.addActionListener(this);
      }//end if statement
    }//end if statement  
  }//end componentAdded()


  public void componentRemoved(ContainerEvent e){}

 

 

 

 

 

 

 

 

 

 

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

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

  public void actionPerformed(ActionEvent e){
    displayLabel.setText(e.getActionCommand());
  }//end actionPerformed

 

 

 

 

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

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