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

 

מקטעי קוד מעניינים עבור המתודה printAll

 

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

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

 

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

 

 

 

 

 

 

המקטע הבא מראה את ההתחלה של המחלקה GUI, כולל ההצהרה של מספר משתני התייחסות. המיכל המכונה myFrame וכל הרכיבים שהוא מכיל יודפס או ישלח לקובץ  הדפסה כאשר לוחצים על ה- Button  שתווית הכיתוב שלו היא “Print the Frame”. (ב- JDK 1.1.6 , מודפסים רק הרכיבים שהוא מכיל. אינני יודע אם זה באג או שאלה של פרשנות בנוגע למפרט של המתודה המכונה printAll).

המיכל המכונה panelToPrint וכל הרכיבים שהוא מכיל יודפס או ישלח לקובץ  הדפסה כאשר לוחצים על ה- Button  שתווית הכיתוב שלו היא “Print the Panel”. (ב- JDK 1.1.6  ייתכן שרק הרכיבים שהוא מכיל יודפסו אך זה לא ברור לחלוטין כיוון של- Panel אין כל תכונה מיוחדת שתאפשר למתבונן לקבוע האם ה- Panel מוצג או לא).

ההפניות לשני האובייקטים של ה- Panel  הן הפניות לשני הפנלים הניתנים לבחירה.

 

class GUI{
  Frame myFrame = new Frame("Copyright 1997, R.G.Baldwin");
  Panel panelToPrint = null;
  
  //References to two selectable panels
  Panel panel0;
  Panel panel1;

 

 

 

 

 

 

 

 

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

 

    
  public GUI(){//constructor
    //The following buttons cause the Panel and Frame
    // containers to be printed.
    Button printPanelButton = new Button("Print the Panel");
    printPanelButton.addActionListener(
                                new PrintActionListener());
    myFrame.add(printPanelButton,"North");
    
    Button printFrameButton = new Button("Print the Frame");
    printFrameButton.addActionListener(
                                new PrintActionListener());
    myFrame.add(printFrameButton,"South");
    
    //The following buttons are used to select between two
    // different panels for display
    Button selectPanel0Button = 
                              new Button("Select Panel 0");
    selectPanel0Button.addActionListener(
                               new SelectPanel0Listener());
    myFrame.add(selectPanel0Button,"West");
    
    Button selectPanel1Button = 
                              new Button("Select Panel 1");
    selectPanel1Button.addActionListener(
                               new SelectPanel1Listener());
    myFrame.add(selectPanel1Button,"East");

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

 

    panel0 = new Panel();
    Label panel0Label = new Label("Panel 0");
    panel0.add(panel0Label);
    TextField panel0TextField = new TextField("TextField");
    panel0.add(panel0TextField);
    panel0.add(new Button("Dummy Button"));
    panel0.setBackground(Color.yellow);
    
    panel1 = new Panel();
    Label panel1Label = new Label("Panel 1");
    panel1.add(panel1Label);
    TextField panel1TextField = new TextField("TextField");
    panel1.add(panel1TextField);
    panel1.add(new Button("One Dummy Button"));
    panel1.add(new Button("Another Dummy Button"));
    panel1.setBackground(Color.pink);

    // code omitted here
  }//end constructor

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

הקוד שמתחיל במקטע הבא, הוא עיקר העניין של שיעור זה. קוד זה מתחיל את ההגדרה של מחלקה פנימית של המחלקה GUI הגורמת להצגת ה- Panel אליו הפנתה PanelToPrint או ה- Frame אליו הפנתה myFrame.

מחלקה זו היא מחלקת מאזין לפעולה (action listener class) והקוד שבמתודה actionPerformed() הוא זה שלמעשה גורם להדפסה/תצוגה להתרחש.

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

 

  class PrintActionListener implements ActionListener{

    public void actionPerformed(ActionEvent e){
      PrintJob myPrintJob = myFrame.getToolkit().
            getPrintJob(
              myFrame, "Copyright 1998 R.G.Baldwin", null);

 

 

 

 

 

 

 

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

הדרישה הבאה בתוכנית היא לקבוע מי מהרכיבים יודפס:

·         המיכל החיצוני שהוא אובייקט Frame .

·       מיכל פנימי שהוא אובייקט Panel .

ניתן לבצע זאת על-ידי הפעלת המתודה getActionCommand() על אובייקט ה- ActionEvent הנכנס כדי לזהות את המקור של האירוע. לאחר מכן, בהתאם למקור, מופעלת המתודה printAll() על ה- Panel  או על ה- Frame, ואובייקט ה- Graphics מועבר כפרמטר. כפי שהוזכר בדיון קודם, תיעוד JavaSoft עבור JDK 1.1.6   מציין כי זה יגרום להדפסה של המיכל החיצוני שעליו מופעלת המתודה וכל הרכיבים שהוא מכיל. כמוכן, כפי שהוזכר קודם, ב- JDK 1.1.6 תחת Win95, רק הרכיבים שהוא מכיל מודפסים למעשה. המיכל אינו מודפס. מכיוון שהמערכת מדפיסה למעשה רכיבי גרפיקה על הנייר, האיכות תהיה תלויה במדפסת בה משתמשים. עבור הרכיבים המשמשים בתוכנית הדגמה זו, האיכות תהיה למעשה טובה למדי כאשר משתמשים במדפסת Cannon BJC-400  הפועלת בשחור-לבן.

 

      if(myPrintJob != null){
        Graphics printGraphics = myPrintJob.getGraphics();
        if(printGraphics != null){
          if(e.getActionCommand().equals("Print the Panel"))
            panelToPrint.printAll(printGraphics);
          else myFrame.printAll(printGraphics);

 

 

 

 

 

 

 

לאחר שהחומר מודפס על הנייר, צריך לאכוף על המדפסת לפלוט את הנייר. אנו גם צריכים לשחרר את המשאבים הכבולים על-ידי אובייקט ה- Graphics. ניתן לבצע זאת על-ידי הפעלת המתודה dispose() על אובייקט ה- Graphics כפי שמציג מקטע הקוד הבא. מקטע זה מפעיל גם את המתודה end()  על אובייקט ה- PrintJob , שלפי תיעוד ה- JavaSoft ב- JDK 1.1.6:

"מסיים את עבודת ההדפסה ומבצע כל cleanup  שנדרש".

 

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

 

          printGraphics.dispose();
        }//end if statement
        else 
          System.out.println(
                       "Didn't get print graphics object");
        myPrintJob.end();
      }//end if statement
      else 
        System.out.println("PrintJob cancelled by user");
    }//end actionPerformed()
  }//end class PrintActionListener

 

 

 

 

 

 

 

 

 

 

 

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

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