תכנות מכוון עצמים בשפת JAVA הרצאה – 06חלק א' GUIבסיסי © Keren Kalif :ביחידה זו נלמד SWING לעומתAWT Look & Feel GUI -תכנון היררכי של ה JFrame הגדרות של נפרדThread - בSwing הרצת Icon הצגת JComboBox הפקד Layout הצגת נתונים בטבלה © Keren Kalif 2 דוגמא בסיסית של GUIבאמצעות יש לרשת מהמחלקה Frame כדי שהתוכנית תיפתח בחלון כב"מ ,ה Frame -אינו מגיב ללחיצה על ה- ,Xולכן צריך להוסיף אירוע (פירוט בהמשך) יש להגדיר כיצד יסודרו הרכיבים בחלון (פירוט בהמשך) הוספת 2פקדי Labelופקד Button כב"מ Frameאינו מוצג למסך ,לכן צריך להפעיל את .setVisible 3 הפקדים הערך trueהוא ב"מ. שאר © Keren לכלKalif AWT היסטוריה ()1 GUI הינו ממשק משתמש גרפיGraphic User Interface : בעבר בשפת JAVAעבדו עם מנגנון הAbstract ( AWT - )Window Toolkit מנגנון זה היה תלוי במערכת ההפעלה ,ולכן הרצת התוכנית נראתה באופן שונה על מערכות הפעלה שונות ה JVM -ביקש ממערכת ההפעלה לבצע את הציור בפועל (הפקדים), ומכאן נבע השוני בהופעה למסך בגלל הפניות הרבות למערכת ההפעלה ,שלמעשה הינן יציאה ממסגרת ה ,JVM -השימוש במנגנון כבד בגלל השוני בין מערכות ההפעלה השונות ,לא ניתן לבצע קוסטומיזציה למשל :אם ב windows -ניתן להציג תמונה על כפתור ובלינוקס לא ,זה בעייתי 4 © Keren Kalif היסטוריה ()2 בגירסא 1.2של JAVAיצא ה ,SWING -העובד באופן שונה מאשר :AWT ב swing -שכתבו חלק מהקומפוננטות (רכיבים) של ,AWTושמן יהיה זהה פרט לכך שיתחילו בJ - למשל Jframe :במקום .Frame ההבדל המהותי בין AWTל SWING -הוא ש SWING -מציירת בעצמה את הרכיבים ולא מערכת ההפעלה .כלומר swing ,יודע עפ"י מערכת ההפעלה שעליה הוא רץ כיצד להציג את הרכיב. יתרונות: התוכנית יותר קלה ומהירה כי אין פניות רבות למ"ה ניתן לבצע קוסטימיזציה בקלות כי אין תלות במ"ה (ה swing -יודע לצייר את הרכיב ולא מתבסס על מ"ה ,בניגוד לAWT - 5 © Keren Kalif דוגמא בסיסית של GUIבאמצעות הפעם יש לרשת מהמחלקה JFrame כב"מ ,ה JFrame -אינו מגיב ללחיצה על ה- ,Xאבל יש פקודה מובנית להגבת האירוע שמות הפקדים מתחילים בJ - 6 © Keren Kalif SWING SWING לעומתAWT -התצוגה ב © Keren Kalif 7 לא ניתן להוסיף פקד פעמיים 8 © Keren Kalif שינוי התצוגה באפליקציית swing תצוגת Windows 9 כך יראה בלי theFrame.pack © Keren Kalif משמע להתאים את גודל החלון לגודל הרכיבים בעקבות שינוי התצורה 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()); וזוהי אופציית ב"מ © Keren Kalif 10 קומפוננטות בSWING - מתחלקות ל 3 -סוגים: :JComponent .1הרכיבים הבסיסים שניתן להציג. למשל .JLabel, JText, JButton :יש כ 35 -רכיבים שכאלו. :Container .2רכיב שיכול להכיל בתוכו רכיבים אחרים ,סוג של לוח ציור. JPanel, JTabbedPane, JSplitPane, JScrollPane :Top Level Container .3יש רק אחד כזה באפליקציה והוא למעשה החלון של התוכנית ,ה Conatiner -הראשי. יכול להיות אחד מהבאיםJFrame, JDialog, JApplet, : JWindow במקום חלון .מאפשר לפתוח JAVA הכי פופלארי Pop Up © Keren Kalif 11 בדפדפן .כבר לא בשימוש. היררכיה נכונה ביצירת אפליקציה JFrame, JDialog למשל JLabel ,Jbutton למשל JFrame JPanel JPanel JLabel JPanel למשל JPanel JTextBox הרכיב הראשי מציג ברקורסיה את כל הרכיבים שתחתיו JButton © Keren Kalif 12 דוגמא לאפליקציה פשוטה יצירת Panelעם מסגרת וכותרת יצירת כל הפקדים על panelולא ישירות על הFrame - © Keren Kalif 13 לכל containerצריך לתת גודל ,אחרת גודלו הוא 0 JFrame - גם דרך הContent Pane -הוספת פקדים ל panel -הוספת הפקד ל frame -ולא ל © Keren Kalif 14 הגדרות גודל ידני של Frame כאשר מייצרים הוא נפתח בפינת המסך השמאלית העליונה ויש לקבוע את גודלו באמצעות השיטה ,setSizeאחרת הוא נפתח ללא גודל כך יפתח החלון בלי השורה setSize © Keren Kalif 15 הגדרת גודל של Frameביחס גודל המסך © Keren Kalif 16 הגדרת מיקום פתיחת החלון כב"מ ,החלון נפתח בפינה העליונה השמאלית. ניתן לשנות הגדרה זו באמצעות השיטה :setBounds במקום setBoundsניתן להשתמש ב- setSizeוב setLocation -בנפרד © Keren Kalif 17 פתיחת החלון במרכז המסך במקום nullניתן לתת חלון אחר של התוכנית ,ואז חלון זה יפתח במרכזו. © Keren Kalif 18 קישורים להסברים על הפקדים השונים http://download.oracle.com/javase/tutorial/ui/features/co mpWin.html + פלט:SWING - בלינק הבא יש דוגמאות לקוד המשתמש ב )? (לא זמין באופן זמניsource code http://java.sun.com/products/jfc/jws/SwingSet2.jnlp © Keren Kalif 19 הפעלת ה swing -ב thread -נפרד את ה swing -גם נריץ ב thread -נפרד כדי שנוכל להריץ את הלוגיקה שלנו במקביל בלי תקיעויות כלומר ,שאם קורה אירוע בזמן ציור ה ,GUI -התוכנית לא "תתקע" Thread זה נקרא )EDT( Event Dispatch Thread באפליקציות גדולות'thread ,ים אחרים ירצו לעדכן את ה,GUI - וכדי למנוע "תקיעות" וכדי שהעבודה תיעשה במקביל © Keren Kalif 20 הקוד- נפרדthread - בswing -הפעלת ה © Keren Kalif 21 הצגת תמונה יש לשים לב שהמסלול הוא יחסי ביחס לתיקיית ה src -ולכן ישתנה מפרוייקט לפרוייקט .כמובן שניתן גם להעביר את המסלול כפרמטר. מחלקה זו מספקת שיטה המקבלת את שם ה Icon -ומחזירה אותו © Keren Kalif 22 )2( הצגת תמונה © Keren Kalif 23 ComboBox הפקד © Keren Kalif 24 Layout Manager נכתוב תוכנית המוסיפה 10רכיבים לחלון .כיצד הם יסודרו? יסודרו ברצף אחד ליד השני. שינוי גודל החלון יארגן אותם מחדש. © Keren Kalif 25 FlowLayout כב"מ JAVAמסדרת לנו את הרכיבים בFlowLayout - כלומר ,סידור הרכיבים אחד ליד השני ומעבר לשורה הבאה כאשר נגמר המקום אלא אם נתנו מיקום מדויק לרכיב מתן מיקום מדויק אינו טוב ,מאחר וכבר לא תהייה פרופורציה כאשר נשנה את גודל החלון JAVA מספקת לנו כל מיני אלגוריתמי סידור ( ,)Layoutוהם גם יודעים לחשב את הפרופרציות עם שינוי גודל החלון בשימוש ב Layout -ניתן לקבוע את המרחק בין הרכיבים השונים © Keren Kalif 26 Layout סקירת http://www.docstoc.com/docs/33446046/Java-Swing לקוח מתוך © Keren Kalif 27 BorderLayout מאפשר סידור רכיבים בצורת מסגרת .כב"מ שם את הפקד בתוך החלק של ה ,CENTER -ולכן בדוגמא זו רואים רק את הפקד האחרון: © Keren Kalif 28 - BorderLayoutהכיוונים שינוי בגודל החלון משנה רק את גודל הרכיב המרכזי: גובה הצפון והדרום נשארים קבועים, ורוחב המזרח והמערב נשארים קבועים. רק השטח של ה CENTER -משתנה. © Keren Kalif 29 BoxLayout – סידור הרכיבים בשורה או בעמודה בניגוד ל,FlowLayout - הרכיבים לא יעברו לשורה הבאה. © Keren Kalif 30 - Spring Layout סידור רכיבים במיקום יחסי ה west -של ה label -יהיה במרחק 50 פיקסלים מה west -של הpanel - ה west -של הtextField -יהיה במרחק 5פיקסלים מה east -של הlabel - © Keren Kalif 31 Layoutנוספים :CardLayout הצגת רכיב אחד כל פעם ,אחד מעל השני :GridLayout מגדיר טבלה .יש לספק כמות שורות וכמות עמודות. אם כמות השורות היא ,0אז מסתמך על כמות העמודות ,והפוך כל הגדלים של התאים זהים הוספת רכיבים היא לפי הסדר ,לא ניתן לדלג על תאים :ComplexLayout כאשר layoutאחד מכיל layoutאחר באחד הרכיבים שלו כאשר הראשי עושה ,resizeזה משפיע גם על הפנימיים מדריך מצויין ל'layout -ים: http://download.oracle.com/javase/tutorial/uiswing/layout /visual.html © Keren Kalif 32 דוגמא לעבודה עם טבלה בעבודה עם טבלה יש אובייקט שנקרא AbstractTableModel המחזיק את המידע שבטבלה המחלקה המובנית DefaultTableModelמהווה מימוש למחלקה אבסטרקטית זו: הדוגמא JTableWithDefaultTabelModelExample ניתן לרשת מממשק זה: הדוגמא JTableWithAbstractTabelModelExample © Keren Kalif 33 :ביחידה זו למדנו SWING לעומתAWT Look & Feel GUI -תכנון היררכי של ה JFrame הגדרות של נפרדThread - בSwing הרצת Icon הצגת JComboBox הפקד Layout הצגת נתונים בטבלה © Keren Kalif 34