מקטעי קוד מעניינים עבור המתודה 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 להצגה. מכיוון שזה לא בדיוק נושא השיעור, לא נדון במחלקות אלה בסעיף זה. עם זאת, מובא שם מידע חשוב מסוים שאינו נידון בשיעורים אחרים של המדריך הזה. כדאי לך לנצל את ההזדמנות ללמוד את המחלקות האלה מתוך הפירוט המלא של התוכנית המופיע בהמשך.