תכנות מתקדם ב-Java/ממשק גרפי

חבילות (packages)

עריכה

הספריות בג'אווה מאורגנות בחבילות (packages) כשכל חבילה היא אוסף של מחלקות. כל מחלקה יכולה לקרוא אוטומטית למחלקות ולפונקציות של מחלקות שנמצאות באותה חבילה כמוה. בהגדרת התוכנית ניתן לשייך את המחלקות שלה לחבילה מסויימת, ע"י שימוש במילה השמורה package ונתינת שם לחבילה. לדוגמא:

package newpack;

class a

{
...
}

class b
{
...
}

כל המחלקות שבקובץ שיצרנו, a ו b במקרה שלנו, תהיינה שייכות לחבילה newpack. אם לא נגדיר שום חבילה יגדיר המהדר את החבילה לחבילה חסרת שם כרצונו.

שימוש במחלקות מחבילות אחרות

עריכה

כדי לנצל את המחלקות שהוכנו כבר בשפה, ניתן ליבא את החבילה ע"י שימוש במילה import וכתיבת שם המחלקה המפורש שבה נרצה להשתמש. אחת החבילות הפופולריות ביותר תהיה חבילת awt - חבילת הספריה הגרפית (ראה להלן). שימוש במחלקות מתוך החבילה הנ"ל יעשה כך:

import.java.awt.Frame;

כלומר: ייבאנו את המחלקה Frame, שבספרייה הגרפית, שנמצאת במחלקת הבסיס java. אם נרצה להשתמש בכמה מחלקות מהספריה הגרפית, נוכל בקיצור לכתוב:

import.java.awt.*;

כלומר: ייבאנו את כל המחלקות שיש בתת הספריה הגרפית של הספריה הראשית. שימוש אפשרי בתוכנית במחלקות יעשה, למשל, ע"י ירושת התכונות של המחלקה, או קריאה לעצמים מסוג המחלקה תוך כדי התוכנית. לדוגמא:

import java.awt.*;

public class a extends Frame

{

Panel p= new Panel();

}

פה יבאנו את הספריה הגרפית על מחלקותיה, בנינו מחלקה a שמרחיבה את מחלקת Frame ובתוכה הצהרנו על עצם p מסוג panel.

חבילות לדוגמה שקיימות בג'אווה

עריכה

יצירת תוכניות מבוססות אינטרנט - java.aplet

הספריה הגרפית, לציור גרפיקה (ממשקי משתמש) - java.awt

לפונקציות של קלט ופלט - java.io תמיכה כללית (מיובאת אוטומטית) - java.lang

פונקציות מתמטיות - java.math

הספריה הגרפית

עריכה

ג'אווה מספקת למשתמש ממשקי גרפיקה מובנים בשפה, דבר המקנה יתרון עצום לתוכנית, מכיוון שכך הממשק הגרפי אינו תלוי במחשב שבו עובדים ובמערכת ההפעלה. ספריית הגרפיקה נקראת awt

(abstract window toolkit), ובעזרת שימוש בה המתכנת יוכל ליצור חלונות, לצייר צורות גיאומטריות שונות, ליצור כפתורים למיניהם, תפריטים נוחים וכו'. הרכיבים היסודיים בספריה הם: Component - רכיב. כל סוגי הרכיבים שמאפשרים ממשק עם המשתמש. למשל: כפתור, כפתור רדיו, תיבות גלילה, רשימה שאפשר לבחור ממנה. Container - מיכל. רכיב שמכיל רכיבים אחרים (למשל מהסוג הקודם) למשל: חלון מסגרת - frame, תיבת דו שיח. Menu - תפריטים. השורה בראש החלון, המכילה פקודות כמו: קובץ, עריכה, עזרה וכו'. כמו כן קיים מודל הארועים (event model) - המנגנון ששולט על דרך תגובת התוכנית לארוע שהתרחש. כלומר אם בנינו מסגרת המכילה שני כפתורים, בעזרת מודל הארועים נשלוט במה שיקרה בלחיצה על כל אחד מהכפתורים האלה. העיקרון בבנית התוכנית יהיה "הכלה": נגדיר מיכל (container) כלשהו, למשל מסגרת חלון, שבו "נשים" כל מיני רכיבים (Components) כמו כפתורים למשל, ע"י שימוש בפונקצית ()add שמוגדרת במחלקה שלו, ולבסוף נגדיר מאזין לרכיב - listener, כלומר קשר בין הרכיב לתוכנית, כך שפעולה על הרכיב, כמו הקלקה עליו באמצעות העכבר, תעשה משהו ספציפי בתוכנית. נראה תוכנית לדוגמא:

import java.awt.*;

public class App

{

Frame f=new Frame("first aplication");

public App()

{

f.setLayout(new FlowLayout());

Button b1=new Button ("button1");

Button b2=new Button("button2");

f.add(b1);

f.add(b2);

f.setVisible(true);

}

public static void main (String[]args)
{
App app=new App();

}

}

הסבר לתוכנית:

עריכה

יבאנו את הספריה הגרפית (ע"י import). הצהרנו על המחלקה App, שבה הצהרנו על עצם f, מיכל מסוג Frame. המחרוזת שהועברה לקונסטרקטור של העצם היא תווית הזיהוי שתתנוסס מעל החלון: first application. בקונסטרקטור של המחלקה עצמה הצהרנו בהתחלה על צורת ההכנסה של הרכיבים לתוך החלון ע"י שימוש ב setLayout, כך:

f.setLayout(new flowLayout());

קיימים מספר סוגים של סידורים אוטומטיים של החלון:


FlowLayout - היא אחת מהאפשרויות לסידור הרכיבים במיכל. הרכיבים יונחו לפי הסדר משמאל לימין.

BorderLayout - ברירת המחדל לחלון, הרכיבים יונחו לפי סדר "גאוגרפי": צפון (למעלה),דרום (למטה), מזרח (ימין), מערב (שמאל), מרכז.

GridLayout - המסגרת תחולק לשורות וטורים.

דוגמה:

f.setLayout(new GridLayout(2,0));

הסבר: קבענו את מספר השורות ל - 2 ומספר העמודות ל - 0, כלומר הרכיבים יסודרו בשתי שורות, ומספר העמודות יקבע עפ"י מספר הרכיבים. בהמשך נראה פונקציות שבעזרתן ניתן לקבוע גם מיקום מדויק של עצם בחלון ולא ע"פ סידור אוטומטי. בנוסף, הגדרנו שני כפתורים:

Button b1 = new Button ("button1");
Button b2 = new Button ("button2");

המחרוזת שבהגדרת הכפתור היא התווית שתכתב עליו. אחרי הגדרת 2 הכפתורים הוספנו אותם לחלון עצמו ע"י שימוש בפונקציה add:

f.add(b1);
f.add(b2);

סיימנו את יצירת החלון, שבו יהיו 2 כפתורים. נשאר לנו רק לגרום לחלון להופיע ואת זה נעשה ע"י פקודת setVisible כך:

f.setVisible(true);

עכשיו כל יצירת עצם מסוג App תיצור אוטומטית חלון ובו 2 כפתורים על המסך, וזה בדיוק מה שעשינו בפונקציה הראשית של המחלקה (main) - יצרנו מופע שלה. עדיין לא הגדרנו שום פעולה שתעשה ע"י הכפתורים שהגדרנו, כך שהם בעצם "חופשיים".

רכיבים - components

עריכה

קיימים מספר סוגים של רכיבים שכיחים:

כפתור - Button

עריכה

כפתור, שלחיצה עליו תיצור ארוע. ניתן לתת לכפתור ערך אמת או שקר: בערך שקר הכפתור יהיה לא פעיל, ויהיה אפשר בשלב כלשהו להפעיל אותו. נראה את הקוד שלו, כפי שכתבנו בתוכנית, ונוסיף "ניטרול" של אחד הכפתורים:

Button b1 = new Button ("button1");
Button b2 = new Button ("button2");
b1.setEnabled(false);
f.add(b1);
f.add(b2);

יצרנו שני כפתורים, את השני הפכנו לכפתור לא פעיל, והוספנו אותם למסגרת f.

תווית - Label

עריכה

תוית תשמש לכתיבת טקסט שאינו משתנה בחלון. בקונסטרקטור של התוית יופיע הטקסט הרצוי בתוית. נוסיף גם תוית לתוכנית:

Label l = new Label ("my first label");
f.add(l);

הוספנו לחלון תוית, שעליה יהיה כתוב my first label.

רכיבי טקסט - text components

עריכה

קיימים שני סוגי רכיבי טקסט בסיסיים: שדה טקסט, TextField, שבו ניתן למשתמש לכתוב שורת טקסט אחת אחרי שהחלון כבר הופעל, ואזור טקסט, TextArea, שבו ניתן למשתמש לכתוב כמה שורות טקסט בחלון. נוסיף רכיבים כאלה לתוכנית:

TextField tf = new TextField (20);
TextArea ta = new TextArea (10, 20);
f.add(tf);
f.add(ta);

הוספנו שדה טקסט באורך 20 תוים, ואזור טקסט בגודל 10 שורות ובאורך 20 תוים.

תיבת סימון - checkbox

עריכה

תיבה שאפשר לסמן בה בחירות שונות. אפשר ליצור תיבות בודדות, או ליצור כמה תיבות שיושבות בתוך "קבוצת תיבות", CheckboxGroup, כך שרק אחת מכל הקבוצה תוכל להיות מסומנת בזמן נתון.

נוסיף רכיבים לתוכנית:

Checkbox cb1 = new Checkbox ("Checkbox 1");
CheckboxGroup cbg = new CheckboxGroup ();
Checkbox cb2 = new Checkbox ("Checkbox 2", cbg, true);
Checkbox cb3 = new Checkbox ("Checkbox 2", cbg, false);
f.add(cb1);
f.add(cb2);
f.add(cb3);

הצהרנו על 3 תיבות סימון ועל קבוצת תיבות סימון אחת. את אחת מתיבות הסימון השארנו חופשיה, ואת השתים האחרות איגדנו יחד תחת הקבוצה, כשאת הראשונה קבענו לתיבה שנבחרה.

בחירה - Choice

עריכה

בחירת אפשרות אחת מתוך "רשימה קופצת" (popup) של אפשרויות. נוסיף לתוכנית:

Choice c = new Choice();
c.add("sunday");
c.add("monday");
c.add("saturday");
f.add(c);

רשימה - List

עריכה

בדומה לבחירה, אבל ניתן יהיה לבחור מספר אפשרויות:

List l = new List();
l.add("one");
l.add("two");
l.add("zero");
f.add(l);

הוספנו רשימה, שממנה יהיה ניתן לבחור מספר ספרות.

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

f.setSize (330, 330);

נראה שוב כיצד תיראה התוכנית בשלמותה:

import java.awt.*;
public class App

{

Frame f=new Frame("first aplication");

public App()

{

f.setLayout(new FlowLayout());
f.setSize (330, 330);

Button b1=new Button ("button1");

Button b2=new Button("button2");
b1.setEnabled(false);
f.add(b1);

f.add(b2);


Label l = new Label ("my first label");
f.add(l);

TextField tf = new TextField (20);
TextArea ta = new TextArea (10, 20);
f.add(tf);
f.add(ta);

Checkbox cb1 = new Checkbox ("Checkbox 1");
CheckboxGroup cbp = new CheckboxGroup ();
Checkbox cb2 = new Checkbox ("Checkbox 2", cbg, true);
Checkbox cb3 = new Checkbox ("Checbox 2", cbg, false);
f.add(cb1);
f.add(cb2);
f.add(cb3);


Choice c = new Choice();
c.add("sunday");
c.add("monday");
c.add("saturday");
f.add(c);



List list = new List();
list.add("one");
list.add("two");
list.add("zero");
f.add(list);

f.setVisible(true);

}
}


הפרק הקודם:
עבודה ברשת
ממשק גרפי הפרק הבא:
תהליכונים