» נושאי לימוד
» נושאי לימוד
יום שני 29 באפריל 2024
קטעי קוד מעניינים
דף ראשי  מתחילים  מבוא לממשק משתמש גרפי (GUI)  קטעי קוד מעניינים גרסה להדפסה

 

קטעי קוד מעניינים

 

חלק זה יתמקד במספר קטעי קוד, שהם בעלי חשיבות להבנת התכנות ב‑Java כדי להכין אותך להתמודד עם GUI’s.

 

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

 

import java.awt.*;
import java.awt.event.*;
import com.sun.java.swing.*;//JDK 1.1 version
//import javax.swing.*;//JDK 1.2 version

 

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

 

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

 

משתנה-ההֵדגֵם השני הינו הצבעה על אובייקט Label, המשרת כרכיב הפלט או התצוגה עבור התוכנית.

 

public class Gui01 extends Frame implements ActionListener{
  boolean toggle = false;
  Label display;

 

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

 

  public static void main(String[] args){
    Gui01 displayWindow = new Gui01();
  }//end main

 

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

 

הקטע הבא מציג את ההתחלה של הבנאי יחד עם הפעלת שתי מתודות property set שונות, לקביעת הכותרת של אובייקט ה‑Frame ופרישׂה (layout) של האובייקט.
הפרישׂה קובעת את האופן שבו רכיבי ה‑
GUI ממוקמים בתוך ה‑Frame
FlowLayout ממקם את הרכיבים משמאל לימין ומלמעלה למטה.

 

  public Gui01(){//constructor
    setTitle("Copyright 1998, R.G.Baldwin");
    setLayout(new FlowLayout());//set layout for container

 

לאחר זאת, אנו ניצור ונקבע את ה‑properties עבור מספר רכיבים של ה‑GUI.
בכך אנו מפעילים את הבנאים הפרמטריים עבור האובייקטים וכן מספר מתודות
property set עבור האובייקטים. שים לב במיוחד לשימוש בקבועים סימבוליים סטטיים של מחלקת Color,
כגון
Color.green.
הערות נוספות לגבי יצירת רכיבים אלה יינתנו בתוכנית המלאה שתוצג בהמשך השיעור.

 

    Button toggleColorButton = new Button("Toggle Color");
    display = new Label("Color Me");
    display.setBackground(Color.green);
    Label toggleColorLabel = new Label("Toggle Color");
    toggleColorLabel.setBackground(Color.red); 
    JButton sayHelloButton = new JButton("Say Hello");
    JButton sayGoodbyeButton = new JButton("Say Goodbye");

 

הקטע הבא מוסיף את הרכיבים, שנוצרו לפני כן, לאובייקט ה‑Frame בהתאם לציוני המיקום של ה‑layout manager, שצוינו לעיל.

 

    this.add(toggleColorButton);
    this.add(display);
    this.add(toggleColorLabel);
    this.add(sayHelloButton);
    this.add(sayGoodbyeButton);

 

לבסוף, נקבע את גודלו של אובייקט ה‑Frame בנקודות, ונהפוך אותו לנראה.
בשלב זה, יש בידינו ממשק משתמש גרפי מלא, אך חסר תפקוד. אילו השארנו את התוכנית במצב זה, ה‑
GUI היה מופיע על המסך, אך לא היה עושה דבר. כדי לאלץ את התוכנית להסתיים, היה עלינו להשבית אותה (ctrl‑c).

 

    setSize(300,150);//Set frame size 
    setVisible(true);//Display the frame

 

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

 

נתחיל ברישום אובייקט מאזין לעכבר עבור אובייקט ה‑Label אשר יתנהג כ‑Button מדומה. ההתנהגות של המאזין לעכבר כמטפל באירוע mouseClicked שמופיע על ה‑Label,
תהיה לייצר אירוע פעולה מדומה ולהאשים בכך את אובייקט ה‑
Button.
נראה כיצד הדבר מתבצע כאשר נבחן את הקוד של מחלקת
MouseListener,
אותה נגדיר בהמשך התוכנית.

 

שים לב שבמקרה זה, אנו רושמים אובייקט אנונימי של מחלקה חיצונית ברמה העליונה בשם MyMouseListener ל‑Label. אנו מעבירים לבנאי הצבעה על אובייקט ה‑Button עבור האובייקט האנונימי הנ"ל.

 

    toggleColorLabel.addMouseListener(
                  new MyMouseListener(toggleColorButton));

 

לאחר מכן, נרשום את האובייקט כמאזין לפעולה עבור אובייקט ה‑heavyweight Button ושני אובייקטֵי lightweight JButton. כזכור, ניתן לרשום אובייקט זה כמאזין לפעולה משום שהמחלקה משתמשת בממשק ActionListener.

 

    toggleColorLabel.addMouseListener(
                  new MyMouseListener(toggleColorButton));

 

ההוראה הבודדת בקטע הבא יוצרת בתוך המחלקה אובייקט אנונימי מטיפוס WindowAdapter, ורושמת אותו לטיפול באירוע windowClosing לאובייקט ה‑Frame. הקוד משתמש בתחביר המקוצר, שמגדיר את מחלקת Listener באופן אנונימי (למחלקת Listener אין שם-מחלקה וגם לאובייקט, שנוצר מתוך המחלקה, אין שם). ההתנהגות של אובייקט המאזין גורמת לתוכנית להסתיים כאשר החלון נסגר.

 

זוהי ההוראה האחרונה בבנאי עבור האובייקט.

 

    this.addWindowListener(
         new WindowAdapter(){//anonymous class definition
           public void windowClosing(WindowEvent e){
             System.exit(0);//terminate the program
           }//end windowClosing()
         }//end WindowAdapter
       );//end addWindowListener

  }//end constructor

 

הקטע הבא הוא מתודת actionPerformed עבור האובייקט.
המתודה מופעלת כל אימת שאחד ה‑
Buttons נלחץ, או כאשר אירוע פעולה מדומה נשלח עם אובייקט ה‑Button בתור אובייקט המקור המוגדר. הקוד במתודה זו גורם לצבע התצוגה להתחלף מצהוב לירוק ולהיפך, או להצגת "Hello" או "Goodbye", בהתאם לרכיב שנלחץ.

 

ההגיון שמאחורי זה הוא פשוט למדי. הקוד קובע את מקור האירוע באמצעות חילוץ פקודת action מתוך אובייקט ה‑ActionEvent, המועבר כפרמטר, ומשתמש בזיהוי המקור על מנת להחליט איזו פעולה לבצע בתצוגה.

 

זהו הסוף של המחלקה השולטת בשם Gui01.

 

  public void actionPerformed(ActionEvent e){
    if(e.getActionCommand().equals("Toggle Color")){ 
      if(!toggle){
        toggle = true;
        display.setBackground(Color.yellow);
      }else{
        toggle = false;
        display.setBackground(Color.green);
      }//end else
    }else 
      if(e.getActionCommand().equals("Say Hello"))
        display.setText("Hello");
      else display.setText("Goodbye");
  }//end actionPerformed()
  //-----------------------------------------------------//
 
}//end class Gui01

 

הקטע הבא מציג את המחלקה החיצונית ברמה העליונה, שמשמשת לניטור לחיצות עכבר על אובייקט Label.

 

כל אימת שהמשתמש לוחץ על ה‑Label, הקוד באובייקט של המחלקה יוצר אובייקט ActionEvent מדומה ושולח אותו ל‑SystemEventQueue.

 

מקור האירוע מצוין כאובייקט Button, המועבר כאשר נוצר אובייקט של המחלקה. באופן כזה, אובייקט ה‑Label "טוען" כי הוא אובייקט ה‑Button ושולח אובייקטֵי ActionEvent,
המתפרשים במערכת זמן-ריצה כאילו מקורם הוא באובייקט ה‑
Button.

 

טיפוס ה‑ActionEvent שנוצר הוא אירוע ACTION_PERFORMED.
אנו נראה לְמה משמש מידע זה כאשר ניצור אובייקט
ActionEvent שנשלח לתור אירועי המערכת.

 

האירועים הנשלחים נמסרים אוטומטית למתודת actionPerformed() של אובייקט ActionListener הרשום עבור ה‑Button.

 

שים לב שבהגדרה של מחלקה זו לא נעשה שימוש בממשק MouseListener,
אלא היא מרחיבה את מחלקת
MouseAdapter.

 

הגדרת המחלקה מכילה מתודת mouseClicked() שדורסת את המתודה המוצהרת בממשק MouseListener ומוגדרת כמתודה ריקה במחלקת MouseAdapter.

 

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

 

class MyMouseListener extends MouseAdapter{
  Button toggleColorButton;//reference to the Button

  MyMouseListener(Button toggleColorButton){//constructor
    this.toggleColorButton = toggleColorButton;
  }//end constructor
 
  //Overridden mouseClicked() method
  public void mouseClicked(MouseEvent e){
    //Note that the following is a single statement
    Toolkit.getDefaultToolkit().
        getSystemEventQueue().
        postEvent(new ActionEvent(toggleColorButton,
                                  ActionEvent.
                                  ACTION_PERFORMED,
                                  "Toggle Color"));
  }//end overridden mouseClicked() method
}//end MyMouseListener

 

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

 

 21-12-03 / 19:13  נוצר ע"י רונית רייכמן  בתאריך 
 מבוא לממשק משתמש גרפי (GUI) - הקודםהבא - התוכנית במלואה 
תגובות הקוראים    תגובות  -  0
דרכונט
מהי מערכת הדרכונט?
אינך מחובר, להתחברות:
דוא"ל
ססמא
נושאי לימוד
חיפוש  |  לא פועל
משלנו  |  לא פועל
גולשים מקוונים: 5