חלקי קוד מעניינים
נתחיל עם הצהרות חשובות אשר מדגישות את הדרישה לייבא חבילות Swing.
import java.awt.*; |
מכיוון שהיא מרחיבה את Jframe. חלק זה גם מכריז על מספר משתנים של אובייקטים הנדרשים מאוחר יותר במטפל אירוע פעולה על מנת להחליף את שני הכפתורים בין השכבות.
בנוסף כללתי פונקצית main() בחלק זה על מנת לספק רצף.
class SwingPane01 extends JFrame{//subclass JFrame
JLayeredPane theLayeredPane;
JButton greenButton;
JButton yellowButton; public static void main(String[] args){
new SwingPane01();
}//end main
חלק הבא מראה את תחילת הבנאי בה הרבה מהעבודה בתוכנית נשלמת. נתחיל בהשגת פוינטר
ל- layeredPane על מנת שיהיה נוח יותר לעבוד אתו אחר כך. ערכי רוחב וגובה עבור אובייקט
ה- Jframe גם כן נקבעים בחלק זה.
SwingPane01(){//constructor |
החלק הבא מראה את הקוד בו משתמשים על מנת לגלות ולהציג את סוגי השמשות השונות יחד עם יחסי ההורה-ילד בהיררכית השמשות. קוד זה הוא אינטואיטבי למדי. תוכל להבין את הנעשה מתוך שמות הפונקציות המעוררות.
System.out.println("Root pane is: " + this.getRootPane().getClass()); System.out.println("Parent of root pane is " + this.getRootPane().getParent() + "\n"); System.out.println("Glass pane is: " + this.getGlassPane().getClass()); System.out.println("Parent of glassPane is " + this.getGlassPane().getParent() + "\n"); System.out.println("Layered pane is: " + this.getLayeredPane().getClass()); System.out.println("Parent of layeredPane is " + this.getLayeredPane().getParent() + "\n"); System.out.println("Content pane is: " + this.getContentPane().getClass()); System.out.println("Parent of contentPane is " + this.getContentPane().getParent() + "\n"); |
החלק בהא מאתחל אובייקט
מנהל מחדל התצוגה עבור contentPane הוא BorderLayout. קוד זה ממקם את JtextField האדום במיקום מרכזי של ה- contentPane וממקם את ה-Jlabel במיקום דרומי.
עבור L&F מטאלי, ה- Jlabel מוצג כאפור ונראה כחלק מהגבול בתחתית אובייקט ה- Jframe.
ה- Jlabel הדרומי מספק הוראות לגבי השימוש באובייקטים של Jbutton אשר ימוקמו על אובייקט
ה- Jframe.
JLabel theLabel = new JLabel( " Click buttons to swap their layer positions."); this.getContentPane().add(theLabel,"South"); JTextField redTextField = new JTextField( " redTextField on contentPane"); redTextField.setBackground(Color.red); this.getContentPane().add(redTextField,"Center"); |
החלק הבא מאתחל אובייקט
מספר אחת (1).
שים לב שיש שימוש בפונקצית setBounds() על מנת לבסס את המיקום והגודל של הכפתור בקואורדינטות יסודות תמונה אבסולוטיות.
תיזכר שאמרתי קודם שמסתבר שמנהל מחדל התצוגה עבור layeredPane הוא אפס.
אחרת, היה צורך עבורי לכוונו לאפס לפני השמת אובייקט זה על בסיס מיקום וגודל אבסולוטי.
שים לב שמאזין פעולה רשום על אובייקט ה- Jbutton. נראה את המחלקה המגדירה את התנהגות אובייקט המאזין מאוחר יותר.
greenButton = new JButton( "greenButton on Layered Pane"); greenButton.setBackground(Color.green); greenButton.setBounds(10,10,240,40); greenButton.addActionListener(new MyActionListener()); theLayeredPane.add(greenButton,new Integer(1)); |
כעת נאתחל אובייקט Jbutton צהוב ונמקם אותו ב- layeredPane שכבה מספר 29999-.
זוהי השכבה התחתונה ביותר מכל השכבות האפשריות ב- layeredPane. ה- contentPane
נופל ישירות מתחת לשכבה זו.
yellowButton = new JButton( "yellowButton on Layered Pane"); yellowButton.setBackground(Color.yellow); yellowButton.setBounds(40,20,240,40); yellowButton.addActionListener(new MyActionListener()); theLayeredPane.add(yellowButton,new Integer(-29999)); |
אחר כך, נכוון כותרת, גודל, ראות, וכ"ו, של אובייקט ה- Jframe ונרשום מאזין אנונימי
על מנת לסיים את התוכנית כאשר המשתמש סוגר את ה- Jframe. וזה מסיים את הבנאי.
this.setTitle("Copyright 1998, R.G.Baldwin"); this.setSize(frameWidth,frameHeight); this.setVisible(true); //===================================================// //Anonymous inner class to terminate program. this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0);}});//end addWindowListener }//end constructor |
לבסוף, נראה מחלקת מאזין פעולה ממנה אובייקטים מאזינים נרשמים על שני האובייקטים של
התנהגות פונקצית actionPerformed() היא במקרה זה לגרום למיקומי השכבות של שני האובייקטים של ה- Jbutton להתחלף בכל פעם שהכפתור העליון נלחץ. זה גורם לאובייקט ה- Jbutton הנמצא בדיוק מתחת לאובייקט העליון לעבור לראשית המחסנית.
שים לב שפונקציה זו מעוררת את פונקצית setLayer() של מחלקת JlauyeredPane לסדר מחדש את מיקומי שני האובייקטים מסוג Jbutton בזמן ההרצה.
class MyActionListener implements ActionListener{ public void actionPerformed(ActionEvent e){ if(e.getActionCommand().equals( "greenButton on Layered Pane")){ theLayeredPane.setLayer(greenButton,-29999); theLayeredPane.setLayer(yellowButton,1); }else{ theLayeredPane.setLayer(greenButton,1); theLayeredPane.setLayer(yellowButton,-29999); }//end else }//end actionPerformed() }//end class MyActionListener |