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

 

מקטעי קוד מעניינים עבור צביעה על נייר עם AWT

 

חלק גדול של הקוד בתוכנית זו הוא זהה או מאוד דומה לקוד בתוכנית המכונה Print04 שבה דנו מקודם. לא נחזור על דיון זה, אלא ננסה בסעיף זה להציג ולדון רק בקוד שכולל תפיסות תיכנות חדשות. פירוט מלא של התוכנית מובא בסעיף אחר. במקרים מסוימים אני אוסיף מסגרת שתכיל snip// כדי לציין השמטה של קוד לשם קיצור. התבונן במחלקה GUI כפי שהיא מוצגת במקטע הבא. מקטע זה מראה הפניות לשני פנלים מותאמים אישית הניתנים לבחירה שניתן להתקינם באובייקט ה- Frame. הבדל משמעותי בין התוכנית הקודמת לזו הוא העובדה שפנלים אלה הם מטיפוס הפנל המותאם אישית MyPanelTypeX. הם לא יכולים להיות מטיפוס Panel , כמו בתוכנית הקודמת, מכיוון שבשלב מאוחר יותר יהיה צורך לספק מתודת paint() דרוסה. לכן, הם חייבים להיות מטיפוס שיורש מ- Panel. כמו כן, הם חייבים להיות מטיפוסים שונים מכיוון שהמראה שלהם שונה וגם האופן שבו הם מדפיסים את עצמם שונה.

 

class GUI {
  //snip
  MyPanelType0 panel0;
  MyPanelType1 panel1;

 

 

 

 

 

 

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

 

    
  public GUI(){//constructor
    //snip

    panel0 = new MyPanelType0();
    panel1 = new MyPanelType1();

    //snip
  }//end constructor
  //=====================================================//

 

 

 

 

 

 

 

 

 

 

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

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

 

המקטע כולל  את המתודה ActionPerformed() של המחלקה PrintActionListener שבה אנו מפעילים את המתודה המותאמת אישית paint() של האובייקט שאליו הפנה המשתנה areaToPrint ומעבירים את אובייקט ה- printGraphics  כפרמטר. זה יגרום לאובייקט להדפיס את עצמו.

 

    public void actionPerformed(ActionEvent e){
      //snip
      if(myPrintJob != null){
        //Get graphics object for printing
        Graphics printGraphics = myPrintJob.getGraphics();
        if(printGraphics != null){
          //Invoke custom paint() method of the 
          // object referred to by areaToPrint passing
          // PrintGraphics object as parameter. This
          // will cause object to print itself.
          areaToPrint.paint(printGraphics);
          //Cause form feed on printer and free
          // resources tied up by graphics object.
          printGraphics.dispose();
        }//end if statement

      //snip
    }//end actionPerformed()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

זה מביא אותנו למחלקה שממנה יוצרים מופעים לפנלים המותאמים אישית. אובייקטים של מחלקה זו יודעים כיצד להדפיס את עצמם כאשר המתודה הדרוסה שלהם paint() מופעלת ומעבירה אובייקט Print Graphics כפרמטר. התבנית בה מודפס החומר מוגדרת במתודה הדרוסה paint(). חלק מהקוד במחלקה זו הוא חומר די סטנדרטי לכן אשמיט אותו כדי לקצר. נקודה שחשוב לציין היא שמחלקה זו יורשת מהמחלקה Panel. זה מאפשר לדרוס את המתודה paint() של המחלקה Panel. אני יציג את המתודה הדרוסה paint()  כיוון שהיא מכילה מידע שעליך לדעת. במתודה הדרוסה paint(), יש להפריד בין הדפסה/הצגה על המסך לבין הדפסה במדפסת, אחרת, החומר הזה, שמיועד להדפסה יופיע גם על המסך בזמן שהאובייקט נצבע על המסך. מתבצעת בדיקה על-מנת להפעיל  את הקוד העיקרי במתודת ה- paint() הדרוסה רק במקרה שאובייקט ה- Graphics  הוא מטיפוס PrintGraphics. אם לא, מופעלת מתודת ה- paint() המשמשת כברירת מחדל של המחלקה המורישה כדי לשמר את היכולת לצבוע על המסך.

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

 

  class MyPanelType0 extends Panel{
    //Components containing data to be printed.
    Label panel0Label;
    TextField panel0TextField;
    Button panel0Button0;

    //snip the constructor

    public void paint(Graphics g){
      if(g instanceof PrintGraphics){
        int leftMargin = 10;//X-position of each line
        int topMargin = 20;//Y-position of first line
        int lineIncrement = 13;//height of each line
        g.setFont(new Font("Serif", Font.BOLD, 18));
        
        g.drawString("Hello from Panel 0",leftMargin,
                               topMargin += lineIncrement);
        g.setFont(new Font("Serif", Font.PLAIN, 10));
        g.drawString(
            "Contents of Label: " + panel0Label.getText(),
                    leftMargin,topMargin += lineIncrement);
        g.drawString(
            "Contents of TextField: " + 
                panel0TextField.getText(),
                    leftMargin,topMargin += lineIncrement);
        g.drawString(
            "Caption on Button: " + 
                panel0Button0.getLabel(),leftMargin,
                               topMargin += lineIncrement);
      }//end if
      else//g is not a PrintGraphics object
        //Invoke the paint method of the Panel class.
        super.paint(g);
    }//end overridden paint()
  }//end class MyPanelType0
  //=====================================================//

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

זכור שלקונטקסטים של הדפסה (printing contexts) אין גופן המשמש כברירת מחדל. עליך להגדיר אותו או שהמערכת תקרוס תחת Win95  (כמו ב- JDK 1.1.6). כפי שתוכל לראות, ההדפסה מורכבת פשוט מהפעלת המתודה drawString() על אובייקט ה- PrintGraphics באופן די דומה לאופן בו תכנתנו את התוכנית הקטנה “Hello World", באחד השלבים הראשונים בתחילתו של "המדריך המקדים ל- Java" (Introductory Java Tutorial). אתה יכול לדמות את זה פשוט לצביעת נייר. פירוש הדבר, שלמעשה באפשרותך למקם על הנייר  כל סימן גרפי שהיה באפשרותך למקם על המסך (עיגולים, שורות, תיבות, וכו'). משום כך, אתה לא חייב להסתפק בפלט של טקסט פשוט. במובן זה, אתה מוגבל רק על-ידי היצירתיות האישית שלך. בסופה של המתודה הדרוסה paint() הזו (בצד של else במשפט if-else)  מופיע משפט שמפעיל את המתודה paint() של המחלקה המורישה (במקרה זה Panel) כאשר מופעלת המתודה הדרוסה paint() אולם היא אינה מופעלת עם פרמטר מטיפוס PrintGraphics. יש צורך בכך על-מנת לשמר את היכולת לצבוע את הפנל המותאם אישית על המסך. למחלקה זו נלווית מחלקה דומה מאוד עבור הפנל השני המותאם אישית. אני אשמיט את המחלקה הזו כדי לקצר, אבל באפשרותך לראות אותה בפירוט המלא של התוכנית המופיע מאוחר יותר. כמו-כן מופיעות שתי הגדרות מחלקה עבור מאזיני פעולה (action listeners) המשמשים לבחירת הפנל המותאם אישית שיותקן ב- Frame להצגה והדפסה. הגדרת מחלקה אלה זהות בעיקרן לאלה שמופיעות בתוכנית המכונה Print04. לכן, גם אותן נשמיט לשם קיצור.  כאן מגיע לסיומו הדיון במקטעי קוד מעניינים בתוכנית ההדגמה הזו.

 05-11-03 / 19:32  נוצר ע"י רונית רייכמן  בתאריך 
 תוכנית הדגמה לשם צביעה על הנייר עם AWT - הקודםהבא - פירוט התוכנית לצביעה על הנייר עם AWT 
תגובות הקוראים    תגובות  -  0
דרכונט
מהי מערכת הדרכונט?
אינך מחובר, להתחברות:
דוא"ל
ססמא
נושאי לימוד
חיפוש  |  לא פועל
משלנו  |  לא פועל
גולשים מקוונים: 5