07c-swing_components.ppt

Download Report

Transcript 07c-swing_components.ppt

‫עוד רכיבי ‪swing‬‬
‫‪1‬‬
‫עוד על ‪swing‬‬
‫‪ ‬תכנות ‪ GUI‬ב‪ swing-‬הוא נושא נרחב‪ .‬יש‬
‫רכיבים‪ ,‬מיכלים ומנהלי פרישה רבים‪ ,‬שכוללים‬
‫אפשרויות רבות‪ .‬לוקח זמן להכיר את כל‬
‫האפשרויות‬
‫‪ ‬מה שהצגנו כאן אינו אלא מבוא קצר‪ ,‬אך מבוא זה‬
‫יאפשר להמשיך וללמוד לבד‪.‬‬
‫‪ ‬מובן שצריך להיעזר באופן שוטף בתיעוד של ה‪-‬‬
‫‪ .API‬יש גם ספרים ומדריכים רבים‪ .‬נקודת‬
‫התחלה טובה היא הג'אווה טוטוריאל של סאן‪:‬‬
‫‪2‬‬
Java Tutorial
Creating a GUI with JFC/Swing :‫הפרק‬
:‫ של סאן‬Tutorial-‫ב‬
http://java.sun.com/docs/books/tutorial/uiswing/index.html
swing-‫מדריך ויזואלי של רכיבי ה‬
http://java.sun.com/docs/books/tutorial/ui/features/components.
html
3
‫דוגמה נוספת‪ :‬נגן )‪(Sound Player‬‬
‫‪ ‬עד כה הצגנו בפירוט דוגמה אחת של תכנות ‪ .GUI‬נציג‬
‫כעת עוד דוגמה‪ ,‬שאותה לא נסביר לעומק‪ .‬עליכם ללמוד‬
‫את הקוד שלה בעצמכם‬
‫‪ ‬הנגן מוצא ומנגן קליפים של אודיו בתיקייה ‪ audio‬בתוך‬
‫תיקיית הפרויקט‬
‫‪ ‬הוא יכול לנגן קליפים בפורמטים אחדים )… ‪(wav, au,‬‬
‫‪ ‬המימוש מצוי בשתי מחלקות‪ SoundPlayerGUI :‬ו‪-‬‬
‫‪( SoundEngine‬פרויקט ‪ ,simplesound‬פרק ‪11‬‬
‫בספר ‪)OFwJ‬‬
‫‪ ‬הכוונה היא ללמוד רק את המחלקה הראשונה‪ ,‬העוסקת‬
‫ב‪ ;GUI-‬אך התלמיד המתעניין‪ ,‬יכול כמובן ללמוד גם את‬
‫המחלקה השנייה (היא כוללת מושגים אחדים שלא‬
‫נלמדים בקורס)‬
‫‪4‬‬
‫ההפרדה מודל‪/‬תצפית‬
‫‪ ‬ביישומי ‪ GUI‬רצוי ליצור הפרדה נקייה בין‬
‫הפונקציונאליות של התכנה לבין ממשק המשתמש‬
‫שלה זה נקרא הפרדה בין המודל והתצפית‬
‫)‪(model/view‬‬
‫‪ ‬נגן המוזיקה מציג הפרדה טובה יותר מאשר מציג‬
‫התמונות‪ :‬מחלקה אחת מרכזת את המודל‬
‫והאחרת את התצפית‬
‫‪ ‬בעקרון יכולות להיות כמה מחלקות בכל חלק‪ ,‬אך‬
‫לא רצוי שמחלקה תשתייך גם למודל וגם לתצפית‬
‫‪5‬‬
‫רכיבי טקסט‬
‫‪‬‬
‫‪.1‬‬
‫‪.2‬‬
‫‪.3‬‬
‫‪.4‬‬
‫‪‬‬
‫‪6‬‬
‫המחלקה ‪( JTextComponent‬תת‪-‬מחלקה של‬
‫‪ )JComponent‬מייצגת רכיבי טקסט‪ .‬מאפשרת‪:‬‬
‫לבחור טקסט‬
‫לקבל את הטקסט שנבחר כמחרוזת‬
‫לקבל או לקבוע )‪ (get and set Text‬את הטקסט‬
‫שברכיב‬
‫לקבוע האם הרכיב ניתן לעריכה (ע"י ‪)setEditable‬‬
‫ה‪ swing-‬מגדיר כמה סוגים של רכיבי טקסט‪ ,‬למשל‪:‬‬
‫‪JTextField JTextArea JPasswordField‬‬
‫טיפוסי אירועים אחרים‬
‫‪ ‬עד כה ראינו רק אירועי פעולה )‪,(ActionEvent‬‬
‫רכיבים יכולים לייצר גם סוגים אחרים של אירועים‬
‫‪ ‬למשל‪ ,‬רכיבי טקסט יכולים לייצר‪:‬‬
‫‪ .1‬אירועי מיקוד )‪ – (FocusEvent‬כאשר הם מקבלים או‬
‫מאבדים את המיקוד (רכיב נמצא במיקוד כאשר הטקסט‬
‫שמוקלד במקדלת מגיע אליו)‬
‫‪ .2‬אירועי מקש )‪ (KeyEvent‬בכל לחיצה על מקש ברכיב‬
‫שנמצא במיקוד‬
‫‪ .3‬אירועי פעולה – הקשה על ‪ Enter‬ברכיב שנמצא‬
‫במיקוד‬
‫ראו תכנית דוגמה ‪ TextDemo1‬בתיקיית הדוגמאות‬
‫שמדגים שימוש בתיבת טקסט ובאזור טקסט‪ ,‬ובאירוע‬
‫פעולה על תיבת טקסט‬
‫‪7‬‬
‫מתאמים למאזינים‬
‫‪ ‬חלק מהממשקים של המאזינים כוללים כמה שיטות‬
‫ולעיתים רוצים לנצל רק אחת מהן‪ .‬במקרה כזה אין‬
‫צורך לממש את כל השיטות ואפשר להסתפק‬
‫במימוש ריק‪.‬‬
‫‪ ‬מימוש ריק כזה מסופק ע”י ג’אווה בדמות מתאם‬
‫)‪ (adapter‬למאזין‪ .‬לכל מאזין שכולל כמה שיטות‬
‫מוגדר מתאם‬
‫‪ ‬מתאם הוא מחלקה מופשטת המספקת מימוש‬
‫ריק לכל השיטות של המאזין‬
‫‪8‬‬
‫המחשה‪ :‬הרחבת מתאם במקום מימוש‬
‫ממשק‬
‫‪ ‬הממשק ‪ KeyListener‬מגדיר האזנה לאירועים שנוצרים ע"י לוח‪-‬‬
‫המקשים‪ .‬הוא מגדיר שלוש שיטות‪keyReleased , keyTyped:‬‬
‫ו‪keyPressed -‬‬
‫‪ ‬מחלקה שמעוניינת לטפל בקלט מלוח המקשים צריכה לממש ממשק‬
‫זה ואז את כל שלושת השיטות שלו‪ .‬או להרחיב את המתאם‬
‫‪ KeyAdapter‬ולהגדיר מחדש רק את השיטה בה מעוניינים‪.‬‬
‫‪ ‬במקום לכתוב‪:‬‬
‫‪public MyKeyListener implements KeyListener‬‬
‫} מימוש של שלוש שיטות {‬
‫אפשר לכתוב‪:‬‬
‫‪public MyKeyListener extends KeyAdapter‬‬
‫}מימוש של השיטה שרוצים בלבד {‬
‫‪9‬‬
KeyAdapter ‫ מימוש‬:‫דוגמה‬
KeyListener ‫ במקום לממש את כל השיטות של המאזין‬
‫ ולממש רק את‬KeyAdapter ‫אפשר להרחיב את‬
:‫השיטה הדרושה‬
private class KeyLst extends KeyAdapter {
public void keyTyped(KeyEvent e) {
if (e.getKeyChar() == 'a')
message.setText("You Typed: a");
else if (e.getKeyChar() == 'b')
message.setText("You Typed: b");
}
}
10
‫דוגמה לשימוש בתיבות טקסט ולטיפול‬
‫באירועים מטיפוסים שונים‬
‫‪ ‬הפרויקט ‪( text-fields‬בתיקיית הדוגמאות) מציג כמה‬
‫דוגמאות לשימוש ברכיבי טקסט‬
‫‪ ‬היישום ‪ TextDemo2a‬מציג דוגמה לתיבת טקסט שלה‬
‫רושמים שלושה מאזינים מטיפוסים שונים‬
‫‪ ‬היישום ‪ TextDemo2b‬דומה ליישום הקודם‪ ,‬אך משתמש‬
‫במאזין אחד שמממש שלושה ממשקי מאזינים‪:‬‬
‫‪private class GeneralListener extends KeyAdapter‬‬
‫‪implements FocusListener, ActionListener‬‬
‫{‬
‫…‬
‫‪11‬‬
‫רכיבי בחירה )‪(selection‬‬
‫‪ ‬קיימים ב‪ swing-‬כמה רכיבים שמאפשרים‬
‫למשתמש לבחור באפשרות אחת מתוך כמה‬
‫אפשרויות נתונות‬
‫‪ ‬נסקור להלן כמה מהרכיבים הללו‬
‫‪12‬‬
‫תיבות תיוג ‪JCheckBox‬‬
‫‪ ‬הפרויקט ‪( selection‬בתיקיית הדוגמאות) מציג‬
‫דוגמה לשימוש בתיבות תיוג‪ .‬תכנית הדוגמה‬
‫‪CheckBoxFrame‬‬
‫‪ ‬המאזין הוא מטיפוס ‪ ,ItemListener‬השיטה‬
‫שיש לממש היא ‪itemStateChanged‬‬
‫‪ ‬השיטה ‪ isSelected‬של ‪ JCheckBox‬מחזירה‬
‫‪ true‬כאשר התיבה דולקת‬
‫‪13‬‬
‫כפתורי רדיו ‪JRadioButton‬‬
‫‪ ‬כפתורי רדיו מאפשרים ליצור בחירה אחת מתוך כמה‬
‫אפשרויות – כאשר בוחרים כפתור אחד‪ ,‬מבטלים את‬
‫הבחירה הקודמת‬
‫‪ ‬תכנית דוגמה ‪( RadioButtonFrame‬פרויקט‬
‫‪ selection‬בתיקיית הדוגמאות)‬
‫‪ ‬כפתור רדיו מיוצג ע"י עצם מטיפוס ‪JRadioButton‬‬
‫הבנאי מקבל פרמטר שקובע האם הכפתור דולק‬
‫‪ ‬צריך להוסיף את הכפתורים לקבוצה (עצם מטיפוס‬
‫‪)ButtonGroup‬‬
‫‪ ‬בתכנית הדוגמה‪ ,‬המאזין מקבל כפרמטר את סגנון הפונט‬
‫(מודגש‪/‬נטוי) ואז כאשר המשתמש לוחץ על הכפתור‬
‫משתנה הסגנון‬
‫‪14‬‬
‫רשימת קומבו ‪JComboBox‬‬
‫‪ ‬רשימת קומבו היא רשימת בחירה שנפתחת ע"י לחיצה על‬
‫הרכיב‬
‫‪ ‬תכנית דוגמה‪ComboBoxFrame :‬‬
‫‪ ‬גם כאן המאזין הוא מטיפוס ‪ ,ItemListener‬השיטה שיש‬
‫לממש היא ‪itemStateChanged‬‬
‫‪ ‬בהינתן עצם האירוע ‪( event‬כארגומנט) בודקים שינוי מצב‬
‫באמצעות‪:‬‬
‫)‪if (event.getStateChange() == ItemEvent.SELECTED‬‬
‫‪ ‬הפריט שהמשתמש בחר ניתן ע"י ‪ getSelectedIndex‬של‬
‫‪JComboBox‬‬
‫‪15‬‬
JList ‫רשימת בחירה‬
‫ תומכת בבחירה יחידה או בבחירה‬JList ‫ רשימה מטיפוס‬
ListFrame ‫ תכנית דוגמה‬.‫מרובה‬
‫ בשם‬,‫ להלן יצירת רשימת בחירה מתוך מערך של מחרוזות‬
‫ וקביעה‬,‫ שורות ברשימה‬5 ‫ קביעת שיוצגו‬,colorNames
:‫שאפשר יהיה לבחור רק פריט אחד‬
colorJList = new JList( colorNames );
colorJList.setVisibleRowCount( 5 );
// do not allow multiple selections
colorJList.setSelectionMode(
ListSelectionModel.SINGLE_SELECTION );
16
‫טיפול בבחירה מרשימה‬
:ListSelectionListener
‫ המאזין שצריך לממש הוא‬
colorJList.addListSelectionListener(
new ListSelectionListener() {
// handle list selection events
public void valueChanged(
ListSelectionEvent event ) {
…
} );
17
‫•רשימות ‪ JList‬אינן תומכות בגלילה באופן אוטומאטי‪ ,‬לכן יש להשתמש ב‪-‬‬
‫‪:JScrollPane‬‬
‫‪add( new JScrollPane( colorJList ) ); // add list with scrollpane‬‬
‫•השיטה )(‪ getSelectedValues‬מחזירה מערך ][‪ Object‬של הפריטים שנבחרו‬
‫•השיטה )(‪ getSelectedIndices‬מחזירה מערך ][‪ int‬של האינדקסים של‬
‫הפריטים שנבחרו‬
‫•השיטה ‪ setListData‬מקבלת מערך ][‪ Object‬או ווקטור ומאכלסת את הרשימה‬
‫לפי תוכן הארגומנט‬
‫‪18‬‬
‫טיפול באירועי עכבר‬
‫יש שני ממשקי מאזינים קשורים‪:‬‬
‫‪ MouseListener‬ו‪MouseMotionListener -‬‬
‫להלן פירוט‪.‬‬
‫‪19‬‬
:‫ כולל חמש שיטות‬MouseListener •
•void mouseClicked(MouseEvent e)
Invoked when the mouse has been clicked on a
component.
•void mouseEntered(MouseEvent e)
Invoked when the mouse enters a component.
•void mouseExited(MouseEvent e)
Invoked when the mouse exits a component.
•void mousePressed(MouseEvent e)
Invoked when a mouse button has been pressed
on a component.
•void mouseReleased(MouseEvent e)
Invoked when a mouse button has been released
on a component.
20
:‫ כולל שתי שיטות‬MouseMotionListener •
void mouseDragged(MouseEvent e)
Invoked when a mouse button is pressed on a
component and then dragged.
void mouseMoved(MouseEvent e)
Invoked when the mouse button has been moved
on a component (with no buttons no down).
‫ שמרחיב את‬MouseInputListener ‫ כוללת ממשק‬javax.event.swing ‫החבילה‬
.‫ ולכן כולל את כל השיטות שמוגדרות בהן‬awt-‫שני ממשקים של ה‬
21
‫דוגמה‪ :‬ציור עיגול בנקודת ההקלקה‬
‫‪ ‬תכנית ‪MouseDemo1‬‬
‫‪22‬‬
‫האזנה לכפתור עכבר ימני ומרכזי‬
‫השיטות הבאות של ‪ MouseEvent‬מאפשרות לדעת איזה‬
‫כפתור עכבר נלחץ‪:‬‬
‫‪ .1‬השיטה )(‪ isMetaDown‬מחזירה ‪ true‬אם נלחץ‬
‫הכפתור הימני‬
‫‪ .2‬השיטה )(‪ isAltDown‬מחזירה ‪ true‬אם נלחץ‬
‫הכפתור המרכזי‬
‫אם אין כפתורים כאלו בעכבר‪ ,‬אפשר לדמות את זה ע"י‬
‫לחיצה על ‪( Meta‬או ‪ )alt‬תוך הקלקה על הכפתור‬
‫השמאלי)‬
‫תכנית דוגמה‪( MouseDetails :‬והמחלקה‬
‫‪)MouseDetailsFrame‬‬
‫‪23‬‬
‫האזנה לגלגלת של העכבר‬
‫; מחלקת‬MouseWheelListener ‫ הממשק‬
MouseWheelEvent:‫האירוע‬
24
‫מדרג האירועים של ה‪AWT-‬‬
‫‪25‬‬
‫סוגי אירועים‬
‫אירועי פעולה ‪ (Action) -‬רכיבים פשוטים כמו כפתורים יכולים לייצר‬
‫אירועי פעולה שמציינים שהמשתמש מעונין שפעולה מסוימת‬
‫תתבצע‪.‬‬
‫•אירועי כוונון ‪ (Adjustment) -‬מיוצרים ע”י ‪Adjustable objects,‬‬
‫למשל‪ ,‬פסי גלילה‪.‬‬
‫•אירועי רכיב ‪ (Component) -‬אירועים ברמה נמוכה המיוצרים ע”י כל‬
‫רכיב כדי לציין שינוי בגודלו‪ ,‬מיקומו‪ ,‬או בניראותו ‪ (visibility).‬מחלקה‬
‫זו היא מחלקת על לאירועים נוספים‪.‬‬
‫•אירועי מיכל ‪ (Container) -‬אירועים ברמה נמוכה הנוצרים ע”י‬
‫מיכלים כדי לדווח למאזינים על הוספה או הסרה של רכיבים‪.‬‬
‫•אירועי מיקוד ‪ (Focus) -‬מיוצרים ע”י רכיבים כמו רכיבי טקסט כדי‬
‫לדווח למאזינים שהרכיב קיבל או איבד את היכולת לקבל קלט מלוח‬
‫‪ 26‬המקשים‪.‬‬
‫( מיוצרים ע”י קופסאות תיוג ורשימות בחירה כדי‬Item) - ‫•אירועי פריט‬
.‫לציין שהמשתמש ביצע בחירה‬
.‫( מיוצרים ע”י כל רכיב בעל מיקוד ללוח המקשים‬Key) - ‫•אירועי מקש‬
key ‫ אירוע כזה יכול להיות‬.‫מודיעים למאזינים על לחיצה על מקש‬
‫ כדי לקלוט הקשה על תווים‬. key typed ‫ או‬pressed, key released
‫הסוגים האחרים יקלטו‬-key typed. ‫ללא תלות בפלטפורמה השתמש ב‬
.‫ וכו’ שאינה תו‬shift ‫גם לחיצה על‬
The getKeyChar method always returns a valid Unicode
character or CHAR_UNDEFINED. For key pressed and key
released events, the getKeyCode method returns the event's
keyCode. For key typed events, the getKeyCode method always
returns VK_UNDEFINED.
27
‫אירועי מקש‬
‫‪ ‬מיידעים אותך על כך שהמשתמש לחץ על‬
‫מקש‪ .‬נוצרים ע"י הרכיב שנמצא במיקוד של‬
‫לוח‪-‬המקשים‪.‬‬
‫‪ ‬אפשר לקבל מידע על כך שהמשתמש הקליד‬
‫תו ‪( Unicode‬אירוע ‪ )key-typed‬או כאשר‬
‫הוא לחץ או שחרר מקש ( ‪key pressed,‬‬
‫‪ .)key-released‬כללית‪ ,‬רצוי לטפל רק‬
‫בהקלדת תווים‪ ,‬כי המקשים תלויים‬
‫בפלטפורמה‪.‬‬
‫‪28‬‬
‫דוגמה לטיפול באירועי מקש‬
KeyDemoFrame ‫ שכוללת את‬KeyDemo ‫ תכנית‬
‫ שמציין‬boolean ‫ מחזירה ערך‬isActionKey ‫ השיטה‬
)F1 ‫האם נלחץ מקש פעולה (כמו‬
:KeyEvent ‫ של‬getKeyModifiersText ‫ השיטה‬
Returns a String describing the modifier
key(s), such as "Shift", or "Ctrl+Shift".
29
‫כיצד רכיב מקבל מיקוד ללוח‬
‫המקשים?‬
‫‪ ‬ודאו שהרכיב יכול לקבל מיקוד (רכיבים מסוימים לא‬
‫יכולים – למשל‪ ,‬במערכות אחדות תוויות לא יכולות)‬
‫‪ ‬ודאו שהרכיב ביקש את המיקוד בעת הצורך‪.‬‬
‫לעיתים צריך לממש ‪ MouseListener‬שיקרא ל‪-‬‬
‫‪requestFocus‬‬
‫‪ ‬אם אתם כותב רכיב משלכם ממשו את השיטה‬
‫‪ isFocusTraversable‬של הרכיב‪ ,‬כך שתחזיר‬
‫‪ true‬כאשר הרכיב מאופשר (‪ .)enabled‬זה‬
‫יאפשר למשתמש‬
‫‪.to tab to your component‬‬
‫‪30‬‬
‫מדרג ממשקי המאזינים‬
‫‪31‬‬
‫שירותים של המחלקה‬
‫‪java.awt.Component‬‬
‫‪ ‬תמיכה בציור‪update ,repaint ,paint :‬‬
‫‪ ‬טיפול באירועים‪ :‬תומך באירועים שמאפשרים‬
‫שליטה של לוח המקשים על הרכיב‪.‬‬
‫‪ ‬הופעה‪ :‬שיטות לקביעה ואחזור הפונט של‬
‫הרכיב וכן שליטה בצבע (‪,setForeground‬‬
‫‪)setBackground‬‬
‫‪ ‬נראות‪setVisible(boolean) :‬‬
‫‪ ‬אפשור ומניעה‪setEnabled(boolean) :‬‬
‫‪32‬‬
Component ‫המשך שירותי‬
‫ קביעת סוג החץ של העכבר כעצם‬:Cursors 
)getCursor ,setCursor( Cursor ‫מטיפוס‬
.‫ בעקרון נשלט ע"י מנהל הפרישה‬:‫ בקרת גודל ומיקום‬
, getPreferredSize :‫אך השיטות‬
getMaximumSize -‫ ו‬getMinimumSize
.‫מאפשרות לדווח למנהל הפרישה על גדלים רצויים‬
setSize-‫ ו‬getSize 
getLocation ,setLocation 
33
‫מחלקות נוספות שכלולות ב‪AWT-‬‬
‫•מנהלי פריסה‬
‫•מחלקות לייצוג צורות וגדלים ‪ Dimension, Insets,‬וכן ‪Point,‬‬
‫‪ Rectangle‬ו‪Polygon-‬‬
‫•ייצוג צבע )‪(Color‬‬
‫•טיפול בתמונות )‪(Image‬‬
‫•טיפול בטקסט ‪ Font‬ו‪FontMetrics-‬‬
‫•פעולות גרפיות‪ :‬המחלקה ‪Graphics‬‬
‫ה ‪-AWT‬כולל תת‪-‬חבילות אחדות‪ ,‬החשובה מהן היא ‪ awt.event‬ויש‬
‫עוד כמה תת‪-‬חבילות‬
‫‪34‬‬