Transcript GUI
תכנות מכוון עצמים בשפת JAVA הרצאה – 06חלק ג' – GUIתכנות מכוון אירועים © Keren Kalif ביחידה זו נלמד: אירועים מהו אירוע שימוש באירועים השימוש ב Observer -ובObservable - אירועים בGUI - אובייקט אנונימי האזנה לאירועים ע"י Listenerאו Adapter Abstract Action אירוע סגירת הTopLevelContainer - validate + repaint הפרדה בין ה BL -לGUI - 2 © Keren Kalif מהו אירוע עד היום ,אם אוביקט רצה לדעת אם קרה משהו שמעניין אותו, הוא היה צריך ליזום הפעלה של שיטה אירוע הוא דרך להודיע לאובייקט שקרה משהו שמעניין אותו אנחנו מכירים אירועים מהשימוש ב GUI -בו מופעלת שיטה כאשר התקיים איזשהו תנאי :למשל לחיצה על כפתור המחלקה ביקשה שיודיעו לה כאשר קורה האירוע לחיצת כפתור עם קבלת ההודעה מופעלת השיטה המטפלת באירוע במחלקה כלומר ,לא המחלקה יוזמת את הפעלת השיטה ,אלא קיום האירוע 3יוזם את הפעלת השיטה © Keren Kalif דוגמא לקוח רוצה לקבל התרעה על מבצעים בחנות אינו רוצה ליזום פניה לחנות כל פעם כדי לבדוק האם יש מבצע הלקוח רוצה לקבל הודעה מהחנות כאשר יש מבצע 4 © Keren Kalif דוגמא :חלק – 1הגדרת אירוע הגדרת מחלקה שתכיל את האובייקט שיזום את האירוע. אובייקט ממחלקה זו הוא ( immutableלא ניתן לשנות את ערכיו לאחר היצירה) ,כדי שאם כמה אובייקטים חולקים אותו ,שינוי אצל אחד לא ישפיע על השאר. 5 © Keren Kalif דוגמא :חלק – 2הגדרת הממשק השיטה מקבלת משתנה מטיפוס האירוע שהגדרנו ותופעל כאשר האירוע יקרה 6 © Keren Kalif דוגמא :חלק – 3מחלקות המממשות את הממשק 7 © Keren Kalif דוגמא :חלק – 4המחלקה היוזמת אירוע מכילה את אוסף המאזינים יצירת האירוע והפעלתו אצל כל המאזינים 8 © Keren Kalif דוגמא :חלק – 5 הmain - כלומר ,ניתן לרשום כמה listenersשונים לאירוע ,כאשר כל אחד יבצע פעולה אחרת 9 © Keren Kalif מנגנון שימוש באירועים המנגנון כולל 4חלקים: .1הגדרת מחלקה שתייצג את האירוע. תכלול את האובייקט שיזם את האירוע אופציונלי :הודעה .2ממשק שיש לממש כאשר רוצים להקשיב לאירוע מסויים ,כלומר לקבל הודעה כאשר האירוע קורה .3הגדרת מחלקה שתיזום את האירוע: תכיל אוסף של אובייקטים המממשים את הממשק מסעיף .2 תממש שיטה המוסיפה אובייקטים לאוסף. כאשר האירוע קורה תפעיל את השיטה שבממשק על כל איבר באוסף. .4מחלקה מנהלת שתכיל את האובייקט שיוזם אירועים ,תרשום אליו מאזינים ותפעיל שיטה שתגרור את האירוע. © Keren Kalif 10 שימוש ב Observer -ובObservable - הפרמטר השני הוא להעברת מידע נוסף במקרה הצורך ,למשל בחירת בין פעולות שונות לביצוע © Keren Kalif 11 )2( Observable - ובObserver -שימוש ב אחרת,סימון שיש שינוי באובייקט לא תעבודnotifyObservers Observers -הודעה לכל ה © Keren Kalif 12 Observer -שימוש ב )3( Observable -וב Observable - לObserver רישום © Keren Kalif 13 אירועים וGUI - נרצה לקשר את הפעולה על הפקד (למשל לחיצה על כפתור, בחירת CheckBoxוכד') לפעולה כלשהי כלומר ,המתכנת אינו יודע מראש מה סדר הפעולות שיופעל ,אבל הוא מכין אוסף פעולות שסדר הפעלתן יקבע ע"י האירועים שיפעלו ע"י המשתמש © Keren Kalif 14 תזכורת :מחלקה פנימית המחלקה הפנימית יכולה לגעת בתכונות ובשיטות של המלחקה החיצונית יצירת אובייקט מהמחלקה הפנימית יהייה אך ורק באמצעות אובייקט של המחלקה החיצונית, מאחר והוא צריך גישה לאובייקט חיצוני ספציפי © Keren Kalif 15 יצירת אירוע הפעולה שתופעל עם הלחיצה על הכפתור נשים לב :בתוך המחלקה הפנימית ניתן לגעת בשיטות ובתכונות של המחלקה החיצונית ,ללא אובייקט מפעיל מקבל כפרמטר אובייקט המממש את הממשק ActionListener המחלקה המממשת את הממשק מוגדרת כמחלקה פנימית בתוך מחלקה זו © Keren Kalif 16 main -הפעלת האירוע ב © Keren Kalif 17 יצירת אירוע באמצעות אובייקט אנונימי באובייקט אנונימי אין צורך לייצר מחלקה נפרדת ,אלא להגדיר אותה בשימוש וכן לממש את כל שיטותיה © Keren Kalif 18 האזנה ללא אובייקט אנונימי © Keren Kalif 19 דוגמא :חשבשבת מסתובבת © Keren Kalif 20 דוגמא :חשבשבת מסתובבת ()2 © Keren Kalif 21 דוגמא :חשבשבת מסתובבת ()3 © Keren Kalif 22 דוגמא :שינוי הפונטים בחלון © Keren Kalif 23 דוגמא :שינוי הפונטים בחלון ()2 © Keren Kalif 24 דוגמאComboBox : שערכיו אובייקטים © Keren Kalif 25 האזנה ליותר מאירוע אחד © Keren Kalif 26 האזנה לאירועים לכל פקד יש אוסף של שיטות שכל אחת מאפשרת להאזין לאירועים מקבוצה מסויימת (למשל פעולות עכבר ,פעולות מקלדת וכד') כאשר אנחנו מעבירים כפרמטר לשיטה new XXXListenerאנחנו מעבירים אובייקט המממש את הממשק המוגדר ,ולכן עלינו לספק מימושים לכל המתודות המוגדרות ,אפילו מימוש ריק במקום להעביר new XXXListenerניתן להעביר שהיא מחלקה המממשת את הממשק עם מימושים ריקים ,וכך ניתן לספק מימוש רק לשיטות שאנחנו בוחרים © Keren Kalif 27 new XXXAdapter האזנה לאירועים ע"י מימוש ממשק לעומת מימוש מחלקה ממשק יסתיים ב Listener -ויש חובה לספק מימוש לכל המתודות מחלקה תסתיים בAdapter - וניתן לספק מימוש רק לחלק מהמתודות © Keren Kalif 28 האזנה לאירועים באמצעות AbstractAction יש מקרים בהם נרצה שכמה פקדים יגיבו בצורה זהה ,בלי לשכפל את הקוד. למשל :תפריט ,כפתור וכד' גם הטקסט וגם הפעולה ActionPerformedתהייה זהה ישנם פקדים שה c’tor -שלהם מקבל אובייקט מהמחלקה AbstractActionהמגדיר את הטקסט שיוצג על הפקד ואת הפעולה שתבוצע בעת לחיצה/בחירה © Keren Kalif 29 - AbstractAction דוגמא כמובן שבאפליקציה בה כל רכיב נמצא במחלקה אחרת ,גם המחלקה שלנו שיורשת מ AbstractAction -תשב בקובץ נפרד © Keren Kalif 30 דריסת פעולת סגירת החלון הפרמטר הראשון של JOptionPaneמקבל הוא החלון שבמרכזו נציג את התיבה ( nullעבור מרכז המסך(. נרצה שהתיבה תפתח במרכז ה.JFrame - מאחר ואנו בתוך ,InnerClassכדי לקבל את המחלקה החיצונית נשתמש ב<outer class name>.this - © Keren Kalif 31 עדכון יזום של התצוגה – repaint נפעיל אותה כאשר יש לצייר את ה container -מחדש, לאחר הוספת/הסרת פקד – validate גוררת סידור מחדש של הרכיבים ב,container - נפעיל לרוב על TopLevelContainerלאחר הוספה והסרה של פקד .הפקודה תחלחל רקורסיבית לכל הרכיבים המוכלים .יגרור repaintבמקרה הצורך. לכן בהוספה ובהסרה נפעיל את repaint+validate הדוגמאRepaintAndValidateExample : © Keren Kalif 32 דוגמא לעבודה עם טבלה בעבודה עם טבלה יש אובייקט שנקרא AbstractTableModel המחזיק את המידע שבטבלה המחלקה המובנית DefaultTableModelמהווה מימוש למחלקה אבסטרקטית זו: הדוגמא JTableWithDefaultTabelModelExample ניתן לרשת מממשק זה: הדוגמא JTableWithAbstractTabelModelExample © Keren Kalif 33 דוגמא להפרדה בין ה BL -לGUI - הדוגמא ב package -שנקרא blseperation ניהול אוסף החברים במחלקה MyFriendsועדכון הנתונים דרך הGUI - המושג (Bussiness Logic) BLמייצג את המידע שבמערכת נשים לב שכל הפעולות שקשורות לניהול החברים יבוצעו נBL - ורק יוצגו בGUI - למשל ,ההחלטה האם ניתן להוסיף חבר נוסף תתבצע ב BL -ולא ב- GUI © Keren Kalif 34 הדוגמא Survivorsמהזיפ: כבר קיים בדוגמא: JSplitPane בין שני השבטים JPanel לכל שבט ובתוכו JScrollPaneלהצגת השורדים הוספת שורד לשבט באמצעות כפתור ובאמצעות תפריט העברת שורדים משבט לשבט באמצעות כפתור ובאמצעות DC עליכם להוסיף: JPanel לאי המתים בתוך JScrollPane JSplitPane בין החלק העליון של השבטים לאי המתים העברת שורד לאי המתים באמצעות כפתור מחיקת שורד מאי המתים ,יהיה באמצעות דאבל קליק על השורד עם הודעת אישור © Keren Kalif 35 ביחידה זו למדנו: אירועים מהו אירוע שימוש באירועים השימוש ב Observer -ובObservable - אירועים בGUI - אובייקט אנונימי האזנה לאירועים ע"י Listenerאו Adapter Abstract Action אירוע סגירת הTopLevelContainer - validate + repaint הפרדה בין ה BL -לGUI - © Keren Kalif 36