המצגת נטענת. אנא המתן

המצגת נטענת. אנא המתן

© Keren Kalif GUI קרן כליף.

מצגות קשורות


מצגת בנושא: "© Keren Kalif GUI קרן כליף."— תמליל מצגת:

1 © Keren Kalif GUI קרן כליף

2 ביחידה זו נלמד: AWT לעומת SWING Look & Feel תכנון היררכי של ה- GUI
אירועים Layout MVC

3 דוגמא בסיסית של GUI באמצעות AWT
יש לרשת מהמחלקה Frame כדי שהתוכנית תיפתח בחלון כב"מ, ה- Frame אינו מגיב ללחיצה על ה- X, ולכן צריך להוסיף אירוע (פירוט בהמשך) יש להגדיר כיצד יסודרו הרכיבים בחלון (פירוט בהמשך) הוספת 2 פקדי Label ופקד Button כב"מ Frame אינו מוצג למסך, לכן צריך להפעיל את setVisible. לכל שאר הפקדים הערך true הוא ב"מ.

4 היסטוריה (1) GUI הינו ממשק משתמש גרפי: Graphic User Interface
בעבר בשפת JAVA עבדו עם מנגנון ה- AWT (Abstract Window Toolkit) מנגנון זה היה תלוי במערכת ההפעלה, ולכן הרצת התוכנית נראתה באופן שונה על מערכות הפעלה שונות ה- JVM ביקש ממערכת ההפעלה לבצע את הציור בפועל (הפקדים), ומכאן נבע השוני בהופעה למסך בגלל הפניות הרבות למערכת ההפעלה, שלמעשה הינן יציאה ממסגרת ה- JVM, השימוש במנגנון כבד בגלל השוני בין מערכות ההפעלה השונות, לא ניתן לבצע קוסטומיזציה למשל: אם ב- windows ניתן להציג תמונה על כפתור ובלינוקס לא, זה בעייתי

5 היסטוריה (2) בגירסא 1.2 של JAVA יצא ה- SWING, העובד באופן שונה מאשר AWT: ב- swing שכתבו חלק מהקומפוננטות (רכיבים) של AWT, ושמן יהיה זהה פרט לכך שיתחילו ב- J למשל: Jframe במקום Frame. ההבדל המהותי בין AWT ל- SWING הוא ש- SWING מציירת בעצמה את הרכיבים ולא מערכת ההפעלה. כלומר, swing יודע עפ"י מערכת ההפעלה שעליה הוא רץ כיצד להציג את הרכיב. יתרונות: התוכנית יותר קלה ומהירה כי אין פניות רבות למ"ה ניתן לבצע קוסטימיזציה בקלות כי אין תלות במ"ה (ה- swing יודע לצייר את הרכיב ולא מתבסס על מ"ה, בניגוד ל- AWT

6 דוגמא בסיסית של GUI באמצעות SWING
הפעם יש לרשת מהמחלקה JFrame כב"מ, ה- JFrame אינו מגיב ללחיצה על ה- X, אבל יש פקודה מובנית להגבת האירוע שמות הפקדים מתחילים ב- J

7 התצוגה ב- AWT לעומת SWING

8 לא ניתן להוסיף פקד פעמיים

9 שינוי התצוגה באפליקציית swing
תצוגת Windows משמע להתאים את גודל החלון לגודל הרכיבים בעקבות שינוי התצורה כך יראה בלי theFrame.pack

10 ערכים שונים ל- L&F UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel"); UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel"); UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); יקח את הגדרות מערכת ההפעלה, Windows במקרה שלי UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); וזוהי אופציית ב"מ

11 במקום חלון. מאפשר לפתוח JAVA בדפדפן. כבר לא בשימוש.
קומפוננטות ב- SWING מתחלקות ל- 3 סוגים: JComponent: הרכיבים הבסיסים שניתן להציג. למשל: JLabel, JText, JButton. יש כ- 35 רכיבים שכאלו. Container: רכיב שיכול להכיל בתוכו רכיבים אחרים, סוג של לוח ציור. JPanel, JTabbedPane, JSplitPane, JScrollPane Top Level Container: יש רק אחד כזה באפליקציה והוא למעשה החלון של התוכנית, ה- Conatiner הראשי. יכול להיות אחד מהבאים: JFrame, JDialog, JApplet, JWindow הכי פופלארי Pop Up במקום חלון. מאפשר לפתוח JAVA בדפדפן. כבר לא בשימוש.

12 היררכיה נכונה ביצירת אפליקציה
למשל JFrame, JDialog למשל Jbutton, JLabel JFrame JPanel JLabel JTextBox JButton למשל JPanel הרכיב הראשי מציג ברקורסיה את כל הרכיבים שתחתיו

13 דוגמא לאפליקציה פשוטה יצירת Panel עם מסגרת וכותרת
יצירת כל הפקדים על panel ולא ישירות על ה- Frame לכל container צריך לתת גודל, אחרת גודלו הוא 0

14 הוספת פקדים ל- Content Pane גם דרך ה- JFrame
הוספת הפקד ל- panel ולא ל- frame

15 הגדרות גודל ידני של Frame
כאשר מייצרים הוא נפתח בפינת המסך השמאלית העליונה ויש לקבוע את גודלו באמצעות השיטה setSize, אחרת הוא נפתח ללא גודל כך יפתח החלון בלי השורה setSize

16 הגדרת גודל של Frame ביחס גודל המסך

17 הגדרת מיקום פתיחת החלון
כב"מ, החלון נפתח בפינה העליונה השמאלית. ניתן לשנות הגדרה זו באמצעות השיטה setBounds: במקום setBounds ניתן להשתמש ב- setSize וב- setLocation בנפרד

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

19 אירועים נרצה לקשר את הפעולה על הפקד (למשל לחיצה על כפתור או בחירת CheckBox) לפעולה כלשהי כלומר, המתכנת אינו יודע מראש מה סדר הפעולות שיופעל, אבל הוא מכין אוסף פעולות שסדר הפעלתן יקבע ע"י האירועים שיפעלו ע"י המשתמש

20 המחלקה הפנימית יכולה לגעת בתכונות ובשיטות של המלחקה החיצונית
תזכורת: מחלקה פנימית המחלקה הפנימית יכולה לגעת בתכונות ובשיטות של המלחקה החיצונית יצירת אובייקט מהמחלקה הפנימית יהייה אך ורק באמצעות אובייקט של המחלקה החיצונית, מאחר והוא צריך גישה לאובייקט חיצוני ספציפי

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

22 הפעלת האירוע ב- main

23 יצירת אירוע באמצעות אובייקט אנונימי
באובייקט אנונימי אין צורך לייצר מחלקה נפרדת, אלא להגדיר אותה בשימוש וכן לממש את כל שיטותיה

24 האזנה ללא אובייקט אנונימי
האזנה ללא אובייקט אנונימי

25 האזנה ליותר מאירוע אחד

26 האזנה לאירועים לכל פקד יש אוסף של שיטות שכל אחת מאפשרת להאזין לאירועים מקבוצה מסויימת (למשל פעולות עכבר, פעולות מקלדת וכד') כאשר אנחנו מעבירים כפרמטר לשיטה new XXXListener אנחנו מעבירים אובייקט המממש את הממשק המוגדר, ולכן עלינו לספק מימושים לכל המתודות המוגדרות, אפילו מימוש ריק במקום להעביר new XXXListener ניתן להעביר new XXXAdapter שהיא מחלקה המממשת את הממשק עם מימושים ריקים, וכך ניתן לספק מימוש רק לשיטות שאנחנו בוחרים

27 האזנה לאירועים ע"י מימוש ממשק לעומת מימוש מחלקה
ממשק יסתיים ב- Listener ויש חובה לספק מימוש לכל המתודות מחלקה תסתיים ב- Adapter וניתן לספק מימוש רק לחלק מהמתודות

28 האזנה לאירועים באמצעות AbstractAction
יש מקרים בהם נרצה שכמה פקדים יגיבו בצורה זהה, בלי לשכפל את הקוד. למשל: תפריט, כפתור וכד' גם הטקסט וגם הפעולה ActionPerformed תהייה זהה ישנם פקדים שה- c’tor שלהם מקבל אובייקט מהמחלקה AbstractAction המגדיר את הטקסט שיוצג על הפקד ואת הפעולה שתבוצע באת לחיצה/בחירה

29 AbstractAction - דוגמא

30 דריסת פעולת סגירת החלון
לא חובה לציין פקודה זו. ב"מ היא HIDE_ON_CLOSE כך שלא יקרה כלום אם נשאיר אותה, כי בכל מקרה אנו דורסים את פעולת הסגירה. הפרמטר הראשון של JOptionPane מקבל הוא החלון שבמרכזו נציג את התיבה (null עבור מרכז המסך(. נרצה שהתיבה תפתח במרכז ה- JFrame. מאחר ואנו בתוך InnerClass, כדי לקבל את המחלקה החיצונית נשתמש ב- <outer class name>.this

31 אבחנה לוגית בין שיטות הרכיבים
Properties: שיטות המגדירות כיצד הרכיב יראה, למשל setBackgroundColor, setPrefferedSize. אין קשר למידע שיוצג עליו. Methods: שיטות המאפשרות אינטראקציה עם המידע. Event: מתודה המאפשרת לתת lisetener לכל מיני אירועים.

32 לינק עם הצגה של כל הפקדים
הדוגמא של שינוי התצוגה הדוגמא SimpleLookAndFeelExample מקובץ הזיפ mpWin.html לינק עם הצגה של כל הפקדים

33 הפעלת ה- swing ב- thread נפרד
כלומר, שאם קורה אירוע בזמן ציור ה- GUI, התוכנית לא "תתקע" Thread זה נקרא Event Dispatch Thread (EDT) באפליקציות גדולות, thread'ים אחרים ירצו לעדכן את ה- GUI, וכדי למנוע "תקיעות" וכדי שהעבודה תיעשה במקביל

34 הפעלת ה- swing ב- thread נפרד - הקוד

35 מחלקה זו מספקת שיטה המקבלת את שם ה- Icon ומחזירה אותו
הצגת תמונה יש לשים לב שהמסלול הוא יחסי ביחס לתיקיית ה- src ולכן ישתנה מפרוייקט לפרוייקט. כמובן שניתן גם להעביר את המסלול כפרמטר. מחלקה זו מספקת שיטה המקבלת את שם ה- Icon ומחזירה אותו

36 הצגת תמונה (2)

37 יסודרו ברצף אחד ליד השני. שינוי גודל החלון יארגן אותם מחדש.
Layout Manager נכתוב תוכנית המוסיפה 10 רכיבים לחלון. כיצד הם יסודרו? יסודרו ברצף אחד ליד השני. שינוי גודל החלון יארגן אותם מחדש.

38 FlowLayout כב"מ JAVA מסדרת לנו את הרכיבים ב- FlowLayout
כלומר, סידור הרכיבים אחד ליד השני ומעבר לשורה הבאה כאשר נגמר המקום אלא אם נתנו מיקום מדויק לרכיב מתן מיקום מדויק אינו טוב, מאחר וכבר לא תהייה פרופורציה כאשר נשנה את גודל החלון JAVA מספקת לנו כל מיני אלגוריתמי סידור (Layout), והם גם יודעים לחשב את הפרופרציות עם שינוי גודל החלון בשימוש ב- Layout ניתן לקבוע את המרחק בין הרכיבים השונים

39 סקירת Layout לקוח מתוך

40 BorderLayout מאפשר סידור רכיבים בצורת מסגרת. כב"מ שם את הפקד בתוך החלק של ה- CENTER, ולכן בדוגמא זו רואים רק את הפקד האחרון:

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

42 BoxLayout – סידור הרכיבים בשורה או בעמודה
בניגוד ל- FlowLayout, הרכיבים לא יעברו לשורה הבאה.

43 Spring Layout - סידור רכיבים במיקום יחסי
ה- west של ה- label יהיה במרחק 50 פיקסלים מה- west של ה- panel ה- west של ה- textFieldיהיה במרחק 5 פיקסלים מה- east של ה- label

44 Layout נוספים CardLayout: הצגת רכיב אחד כל פעם, אחד מעל השני
GridLayout: מגדיר טבלה. יש לספק כמות שורות וכמות עמודות. אם כמות השורות היא 0, אז מסתמך על כמות העמודות, והפוך כל הגדלים של התאים זהים הוספת רכיבים היא לפי הסדר, לא ניתן לדלג על תאים ComplexLayout: כאשר layout אחד מכיל layout אחר באחד הרכיבים שלו כאשר הראשי עושה resize, זה משפיע גם על הפנימיים מדריך מצויין ל- layout'ים: /visual.html

45 עדכון יזום של התצוגה repaint – נפעיל אותה כאשר יש לצייר את ה- container מחדש, לאחר הוספת/הסרת פקד validate – גוררת סידור מחדש של הרכיבים ב- container, נפעיל לרוב על TopLevelContainer לאחר הוספה והסרה של פקד. הפקודה תחלחל רקורסיבית לכל הרכיבים המוכלים. יגרור repaint במקרה הצורך. לכן בהוספה ובהסרה נפעיל את repaint+validate הדוגמא: RepaintAndValidateExample

46 הדוגמא Survivors מהזיפ:
כבר קיים בדוגמא: JSplitPane בין שני השבטים JPanel לכל שבט ובתוכו JScrollPane להצגת השורדים הוספת שורד לשבט באמצעות כפתור ובאמצעות תפריט העברת שורדים משבט לשבט באמצעות כפתור ובאמצעות DC עליכם להוסיף: JPanel לאי המתים בתוך JScrollPane JSplitPane בין החלק העליון של השבטים לאי המתים העברת שורד לאי המתים באמצעות כפתור מחיקת שורד מאי המתים, יהיה באמצעות דאבל קליק על השורד עם הודעת אישור

47 דוגמאות לרכיבים ב- swing
בלינק הבא יש דוגמאות לקוד המשתמש ב- SWING: פלט + source code

48 דוגמא לעבודה עם טבלה בעבודה עם טבלה יש אובייקט שנקרא AbstractTableModel המחזיק את המידע שבטבלה המחלקה המובנית DefaultTableModel מהווה מימוש למחלקה אבסטרקטית זו: הדוגמא JTableWithDefaultTabelModelExample ניתן לרשת מממשק זה: הדוגמא JTableWithAbstractTabelModelExample

49 הפרדה בין ה- BL ל- GUI בתכנות נכון יש להפריד בין הלוגיקה (שכבת ה- Bussiness Logic) לעומת התצוגה (שכבת ה- UI). הסיבה היא שה- UI הוא דרך להצגת המידע, ואת הלוגיקה ניתן להציג בדרכים שונות, ללא שיכפול של קוד הלוגיקה. בפרוייקט גדול, יש צוות יעודי ללוגיקה וצות יעודי לממשק המשתמש ויש הפרדה ברורה. לכן לא נשים הודעות שגיאה/לוגים המדפיסים למסך בקוד שלנו, אלא נשתמש במנגנון החריגות כדי ליידע על בעיות.

50 MVC – Model-View-Controller
2 4 3 1 התמונה לקוחה מ:

51 MVC – Model-View-Controller
ל- Model ול- View יהיה listener שיודיע לכל המאזינים עם כל עדכון סגנונות המקובלים לשיטה זו: fireXXXChanged fireXXXEvent הדוגמא MVCBusExample.simple הזיפ

52 הדוגמא MVCBusExample.renderer הזיפ
משמש כ- controller המובנה בשפה תפקידו לקשר בין אובייקט מה- BL ל- UI וכן להציגו DefaultListCellRenderer הוא סוג של JLabel וישנם renderer'ים נוספים, למשל טבלה יש לדרוס את השיטה getListCellRendererComponent אשר קובעת כיצד תראה תצוגת האובייקט הדוגמא MVCBusExample.renderer הזיפ

53 עורך GUI ניתן להוריד plug-in לאקליפס המאפשר יצירת GUI בצורת Drag & Drop בסביבת העבודה של ה- NetBeans כבר יש תשתית built-in לכך יש לשים לב, שאם יוצרים GUI באמצעות drag&drop ברוב התוכנות מתווסף קוד שלא יעבוד בסביבה אחרת

54 ביחידה זו למדנו: AWT לעומת SWING Look & Feel תכנון היררכי של ה- GUI
אירועים Layout MVC


הורד את "ppt "© Keren Kalif GUI קרן כליף.

מצגות קשורות


מודעות Google