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