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

תוכנית דוגמא 1

תוכנית זו מציגה את השימוש ב getContentPane() להוספת Jbutton ל- Jframe.

 

היא מדגימה בנוסף את השימוש במאזין אבות על Jbutton.

 

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

 

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

  

Make JFrame visible
ancestorAdded method invoked
Event source: com.sun.java.swing.JButton[,0,0,0x0,
            invalid,layout=com.sun.java.swing.OverlayLayout]
Ancestor: com.sun.java.swing.JButton[,0,0,0x0,
            invalid,layout=com.sun.java.swing.OverlayLayout]
Parent: com.sun.java.swing.JPanel[null.contentPane,0,0,0x0,
              invalid,layout=com.sun.java.swing.JRootPane$1]
Component: com.sun.java.swing.JButton[,0,0,0x0,
            invalid,layout=com.sun.java.swing.OverlayLayout]
ID value: 1
ancestorMoved method
ancestorMoved method

 

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

 

 

חלקי קוד מעניינים עבור תוכנית דוגמא 1

 

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

 

import java.awt.*;
import java.awt.event.*;
import com.sun.java.swing.*;
import com.sun.java.swing.event.*;

 

הפונקציה main() במחלקת הבקרה היא פשוטה מאד, אך נכלול אותה כאן למען הרצף.

 

public class SwingEvent10 {
  public static void main(String[] args){
    GUI gui = new GUI();//instantiate a GUI
  }//end main
}//end class SwingEvent10

 

 

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

 

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

 

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

 

לאחר מכן, נוסיף את אובייקט ה- Jbutton לאובייקט Jframe בשם displayWindow על ידי קריאה לפונקצית getContentPane() ופונקצית add() תצוגת התוכן. נדון בנושא עוד לאחר רישום חלק הקוד.

 

לבסוף, נציג את ההודעה ונהפוך את אובייקט ה- Jframe לנראה ובזאת סיימנו עם הבנאי.

  

class GUI {
  public GUI(){//constructor
    JFrame displayWindow = new JFrame();
    displayWindow.setSize(300,300);
    displayWindow.setTitle("Copyright 1998, R.G.Baldwin");
    displayWindow.addWindowListener(new WProc1());
    JButton theButton = new JButton("Button");        
    theButton.addAncestorListener(new MyAncestorListener());
    displayWindow.getContentPane().add(theButton);
    System.out.println("Make JFrame visible");
    displayWindow.setVisible(true);
  }//end constructor


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

מה לגבי פונקצית getPaneContent()? זהו דבר שאינו קיים ב-AWT.

 

בקצרה, ב-AWT אנו מוסיפים רכיבים, ומטפלים בסביבת התצוגה של אובייקט המסגרת באופן ישיר.

 

אולם, ב- Swing חלק מה"שמשות" ממוקמות באופן אוטומטי באזור התצוגה של אובייקט ה- Jframe, ואנו מוסיפים רכיבים אלו ו/או מתמרנים אותם בצורה אחרת בשמשות אלו במקום לתמרן את אזור התצוגה של אובייקט ה- jframe באופן ישיר.

 

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

 

public class JFrame 
extends Frame 
implements WindowConstants, Accessible, RootPaneContainer 

An extended version of java.awt.Frame that adds support for interposing input and painting behavior in front of the frames children (see glassPane), support for special children that are managed by a LayeredPane (see rootPane) and for Swing MenuBars

The JFrame class is slightly incompatible with java.awt.Frame. JFrame contains a JRootPane as it's only child. The contentPane should be the parent of any children of the JFrame. This is different than java.awt.Frame, e.g. to add a child to an AWT Frame you'd write: 

       frame.add(child); 
 

However using JFrame you need to add the child to the JFramescontentPane instead: 

       frame.getContentPane().add(child); 
 

The same is true for setting LayoutManagers, removing components, listing children, etc. All these methods should normally be sent to the contentPane() instead of the JFrame itself. The contentPane() will always be non-null. Attempting to set it to null will cause the JFrame to throw an exception. The default contentPane() will have a BorderLayout manager set on it. 

Please see the JRootPane documentation for a complete description of the contentPane, glassPane, and layeredPane properties. 

Warning: serialized objects of this class will not be compatible with future swing releases. The current serialization support is appropriate for short term storage or RMI between Swing1.0 applications. It will not be possible to load serialized Swing1.0 objects with future releases of Swing. The JDK1.2 release of Swing will be the compatibility baseline for the serialized form of Swing objects. 

 

לעת עתה, ועבור דוגמא פשוטה זו,

כל זה מסתכם בדרישה להכנסה קריאה לפונקציה   getPaneContent();

 

בין הפוינטר לאובייקט JFrame

 

וקריאות ל- add(), setLayout(), וכו'.

עבור תוכניות מורכבות יותר, ההשלכות יהיו רציניות יותר.

 

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

 

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

 

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

 

להלן תיאור קצר של שלושת הפונקציות :

·      AncestorAdded(ancestorEvent) - נקראת כאשר המקור או אחד האבות שלו הופכים
     לנראים על ידי קריאה ל-
setVisible(true) או על ידי הוספתה להיררכית הרכיב.

·      AncestorMoved(ancestorEvent) - נקראת כאשר המקור או אחד האבות שלו מוזזים.

·      AncestorRemoved(ancestorEvent)- נקראת כאשר המקור או אחד האבות שלו הופכים 
     לבלתי נראים על ידי קריאה ל-
setVisible(false) או על ידי הסרתו מהיררכית הרכיב.

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

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

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

כפי שצוין קודם, נראה כי הפלט אינו מספק תיאום טוב בין התיאורים ושמות הפונקציות getAncestor() ו- getAncestorParent() בתיעוד JavaSoft. נראה כי הפלט מתייחס לאובייקט Jbutton כאל האב ו- JrootPane כאל הורה האב. מבדיקה שטחית נדמה כי אובייקט Jbutton היא הילד, לא האב, אך הדבר תלוי בפענוח של ספרית המחלקה בצורה מסוימת.

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

 

  class MyAncestorListener implements AncestorListener{
        public void ancestorAdded(AncestorEvent e){
      System.out.println("ancestorAdded method invoked");
      System.out.println("Event source: " + e.getSource());
      System.out.println("Ancestor: " + e.getAncestor());
      System.out.println("Parent: " + e.getAncestorParent());
      System.out.println("Component: " + e.getComponent());
      System.out.println("ID value: " + e.getID());
    }//end ancestorAdded()


 
חלק הקוד האחרון מדגים את ההגדרות לשתי הפונקציות האחרות של ממשק AncestorListener.

אם תהדר ותריץ תוכנית זו ותבחין בפלט בזמן הרצת התוכנית, תראה שפונקצית ancestorAdded() ופונקצית ancestorMoved() שתיהן נקראות כאשר אובייקט Jframe  הופך לנראה לעין.

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

אייקוניזציה(מזעור) ודה-אייקוניזציה גם כן גרמו לקריאת פונקצית ancestorMoved().

בכל ניסיוני לא היתה פעם אחת בה פונקצית ancestorRemoved() נקראה.

 

          public void ancestorRemoved(AncestorEvent e){
      System.out.println("ancestorRemoved method");
    }//end ancestorRemoved()
          public void ancestorMoved(AncestorEvent e){
      System.out.println("ancestorMoved method");
    }//end ancestorMoved
  }//end class MyAncestorListener
  //.....................................................//
}//end class GUI definition
//=======================================================//

 

 08-12-03 / 18:25  עודכן ,  16-10-03 / 17:13  נוצר ע"י רונית רייכמן  בתאריך 
 סוגי אירועים חדשים ב- Swing - הקודםהבא - רישום תוכנית עבור תוכנית דוגמא 1 
תגובות הקוראים    תגובות  -  0
דרכונט
מהי מערכת הדרכונט?
אינך מחובר, להתחברות:
דוא"ל
ססמא
נושאי לימוד
חיפוש  |  לא פועל
משלנו  |  לא פועל
גולשים מקוונים: 4