Presentation is loading. Please wait.

Presentation is loading. Please wait.

مقدمه اي بر Java : جاوا ثمره 15 سال تلاش جهت ایجاد زبان برنامه نویسی بهتر و محیط ساده تر برای ساخت برنامه های مطمئن تر می باشد.

Similar presentations


Presentation on theme: "مقدمه اي بر Java : جاوا ثمره 15 سال تلاش جهت ایجاد زبان برنامه نویسی بهتر و محیط ساده تر برای ساخت برنامه های مطمئن تر می باشد."— Presentation transcript:

1 مقدمه اي بر Java : جاوا ثمره 15 سال تلاش جهت ایجاد زبان برنامه نویسی بهتر و محیط ساده تر برای ساخت برنامه های مطمئن تر می باشد.

2 برنامه نویسی شی گرا : (Object Oriented Programming (OOP
اگر چه زمان زیادی می برد، تا بتوانید در این برنامه نویسی خبره شوید، ولی منطق اولیه این نوع برنامه نویسی بسیار ساده است، ایجاد اشیا به همان صورتی که در طبیعت وجود دارند. برای شروع موارد زیر را بررسی می کنیم: ایجاد کلاسها اتصال کلاسها به یکدیگر به گونه ای که یک کلاس خواص کلاس های دیگر را به ارث ببرد. لینک کلاسها به یکدیگر از طریق Package ها و واسطها.

3 کلاسها و اشیاء : Class & Object
اصول برنامه نویسی شیء گرا از جهان واقعی اقتباس شده است. در جهان واقعی یک شیء از اشیاء کوچکتر تشکیل شده است. بنابر این در برنامه نویسی شیء گرا قابلیت ترکیب اشیا برای ایجاد اشیاء بزرگتر یکی از اصول می باشد. از کلاسها برای ایجاد اشیاء استفاده می کنیم، در واقع اشیاء نمونه های یک کلاس می باشند. برای مثال از کلاس به نام دانشجو می توان تعداد زیادی شیء دانشجو ایجاد کرد.

4 متغیر :Variable یک متغیر محلی جهت نگهداری اطلاعات در زمان اجرای برنامه می باشد. مقدار متغیر را می توان در طول اجرای برنامه تغییر داد. روش ایجاد متغیر در زبان جاوا به صورت زیر می باشد. Data_Type Variable_Name; مثال : int highScore; String username; boolean gameOver;

5 نكته سه نوع متغیر متفاوت در زبان جاوا وجود دارد این سه نوع متغیر عبارتند از: متغیرهای نمونهInstance Variable این نوع متغیرها هنگام ایجاد یک شی از کلاس مقدار می گیرند، اشیا متفاوتی که از روی یک کلاس ساخته می شوند، می توانند دارای مقادیر متفاوتی برای این نوع متغیر باشند. متغیرهای کلاس Class Variable متغیرهای کلاس در هنگام تعریف کلاس مقدار می گیرند، و مقدارشان برای تمام اشیا کلاس یکسان می باشد.

6 نكته متغیرهای محلی Local Variable
این نوع متغیرها درون یک متد یا بخشی از یک متد تعریف می شوند.

7 نكته بر خلاف دیگر زبانهای برنامه نویسی در زبان جاوا متغیر Global وجود ندارد .

8 مقدار دهی اولیه به متغیرها : Default Value
مقدار دهی اولیه به متغیرها در زبان جاوا به صورت زیر می باشد. Data_Type Variable_name = Value; int zipcode = 90210; String name = ”Brandon”; boolean cheatedOnKelly = true; int age = 28, height = 70, weight = 140;

9 نكته متغیرهای محلی باید قبل از استفاده مقدار دهی شوند، بنابر این بهتر است به تمام متغیرهای محلی مقدار اولیه نسبت داد. نکته: متغیرهای نوع کلاس و نمونه بسته به نوع متغیر مقدار اولیه می گیرند. متغیرهای عددی : 0 متغیرهای منطقی : false اشیاء : null متغیرهای کاراکتری : ‘\O’

10 نام گذاری متغیرهاNaming Variables :
نام یک متغیر باید با یک حرف، underscore یا $ آغاز شده و پس از آن می تواند ترکیبی از حروف واعداد باشد . نکته: به این دلیل که زبان جاوا از unicode استفاده می کند، نام متغیرها می تواند شامل هر کاراکتری که دارای کد unicode است، باشد. نکته: زبان جاوا یک زبان Case-Sensitive می باشد. نکته: برای متغیرهای خود نامهای با معنی انتخاب کنید. این امر باعث می شود که نام متغیرها بهتر در ذهنتان بماند.

11 قوانين نام گذاری متغیرها
جهت افزایش خوانایی نام متغیرها از قواعد زیر استفاده کنید. برای اولین حرف نام متغیر از حروف کوچک استفاده کنید. اگر نام متغیر بیش از یک کلمه است، اولین حرف کلمات بعدی را به صورت بزرگ تایپ کنید. تمام کلمات دیگر را به صورت کوچک تایپ نمایید.

12 انواع متغیرها از نظر نوع اطلاعات:
توجه داشته باشید که علاوه بر نام متغیر باید نوع اطلاعاتی را که می خواهیم درون یک متغیر درج نماییم، تعیین کنیم. نوع اطلاعات یک متغییر یکی از حالات زیر می باشد. نوع داده مقدماتی نام یک کلاس یا واسط یک آرایه

13 انواع داده ای مقدماتی :Primitive Data Type
در مجموع 8 نوع داده ای متفاوت برای اعداد صحیح، اعداد اعشاری، کاراکترها و مقادیر منطقی وجود دارد. انواع داده ای فوق را انواع اولیه(پایه) هم می نامند. دلیل نام گذاری فوق وجود این انواع داده ای در زبان جاوا به طور پیش فرض می باشد، به عبارت دیگر این انواع داده ای شیء نیستند بنابراین استفاده از آنها راحت تر است. انواع داده ای فوق در هر محیط اجرا و سیستم عاملی دارای طول یکسان می باشند.

14 Value that can be stored
1 ) Integer Type Value that can be stored Size Type -128 to 127 8 bit Byte to 32767 16 bit Short to 32 bit Int -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 64 bit Long

15 Value that can be stored
2 ) Floating Point Type Value that can be stored Size Type 1.4E-45 to 3.4E+38 - Float 4.9E-324 to 1.7E+308 Double برای ذخیره کردن کاراکترها از char و برای ذخیره کردن داده های منطقی از boolean استفاده می شود.

16 متغیر نوع کلاس : Class Type Variable
علاوه بر هشت نوع داده ای فوق یک، متغیر می تواند از نوع کلاس تعریف شود. به مثالهای زیر توجه کنید. String lastname = “Walsh”; Color hair; وقتی یک متغیر از نوع کلاس تعریف می شود، آنگاه این متغیر اشاره به یک شیء از آن کلاس یا یکی از زیر کلاسهایش دارد. برای مثال کلاس Fruit را در نظر بگیرید، فرض کنید این کلاس دارای سه زیر کلاس با نامهای Apple، Pear یا Strawberry می باشد. اگر متغیری از نوع کلاس Fruit به نام favoriteFruit ایجاد نمایید، این متغیر می تواند به یکی از سه کلاس Apple، Pear یا Strawberry اشاره کند.

17 نكته تعریف یک متغیر از نوع Object به این معناست که این متغیر می تواند به هر شیء اشاره نماید. در زبان جاوا کلمه کلیدی مشابه typedef در C++ وجود ندارد. برای ایجاد یک نوع داده ای جدید باید کلاس جدیدی تعریف نمایید

18 اختصاص مقدار به متغیرها : Assigning Value to Variable
اختصاص مقدار به متغیرها به صورت زیر می باشد. IdCode = ; snappyDresser = false;

19 توضیحات : Comment جهت افزایش خوانایی برنامه از توضیحات استفاده می شود. در زبان جاوا دو روش برای افزودن توضیحات به برنامه وجود دارد. توضیحات یک خطی: در ابتدای خط از علامت // استفاده می شود. int creditHours = 3; //Setup credit hours for course

20 توضیحات : Comment توضیحات چند خطی:
ابتدا و انتهای آنها به ترتیب از علامتهای */ و /* استفاده می شود . /* This program was written late at night under the influence of expired antihistamine medicine and generic supermarket soda. I offer no warranties express nor implied that works for any useful purpose whatsoever. */

21 لیترال :Literal علاوه بر متغیرها از لیترالها نیز در در عبارات جاوا استفاده می شود. لیترالها شامل اعداد، متن یا هر داده دیگری می باشند، که مقدار آنها دقیقاً مشخص است. int year = 1998;

22 لیترال عددی زبان جاوا لیترالهای عددی متفاوتی دارد. برای مثال عدد 4 میتواند به یکی از صورتهای زیر در نظر گرفته شود. int pennyTotal = 4; byte pennyTotal = 4; short pennyTotal = 4; long pennyTotal = 4L;

23 نكات برای اینکه یک لیترال عددی نظیر 4 به صورت long در نظر گرفته شود، از حرف L بعد از عدد 4استفاده می کنیم . اگر بخواهیم اعداد را در مبنای 8 یا 16 در نظر بگیریم، قبل از عدد مورد نظر به ترتیب 0 یا 0x درج می کنیم. برای مثال اگر بخواهیم عدد 777 را در مبنای 8 در نظر بگیریم، عدد را به صورت 0777 تایپ می کنیم. و اگر بخواهیم مبنای را 16 در نظر بگیریم عدد را به صورت 0xFF يا 0x12 تایپ می کنیم. اگر بخواهیم یک لیترال را به صورت منفی در نظر بگیریم، به صورت زیر عمل می کنیم. int pennyTotal = -4;

24 نكات : تمام لیترالهای اعشاری به عنوان double در نظر گرفته می شوند، مگر اینکه با ذکر حرف F بعد از عدد آن را به عنوان float تعریف کنیم. double myGPA = 2.25; float piValue = F; اگر بخواهید یک لیترال اعشاری را به صورت توانی ذکر نمایید، به صورت زیر عمل نمایید. double x = 12e22; double y = 19E-45;

25 لیترالهای منطقی لیترالهای کاراکتری
این لیترالها یکی از مقادیر true یا false می باشند، و به صورت زیر تعریف می شوند. boolean toThineOwnself = true; لیترالهای کاراکتری این نوع لیترالها به صورت زیر به کار می روند. char letter = ’3’; char letter = ’a’;

26 کاراکترهای خاص: Meaning Character New Line \n Tab \t Backspace \b
Carriage return \r Fromfeed \f Backslash \\ Single quotation mark \’ Double quotation mark \” Octal \d Hexadecimal \xd Unicode character \ud

27 لیترالهای رشته ای این نوع لیترالها به صورت زیر ذکر می شوند.
String coauthor = ”Laura Lemay, Killer of trees”; String example = “Socrates asked, \”Hemlock is poisson?\” ”; String title = “Sams Teach Yourself Java in a 3-Day Weekend\u2122”; همان طور که ملاحظه می فرمایید، می توان از کاراکترهای خاص در این نوع لیترالها استفاده کرد. عبارت \u2122 کد سمبل TM می باشد.

28 عملگرها: عملگرها سمبلهایی برای انجام اعمال محاسباتی، مقایسه های منطقی و ... می باشند. Example Meaning Operator 3+4 Addition + 5-7 Subtraction - 5*5 Multiplication * 14/7 Division / 20%7 Modules % نکته: امکان اتنسابهای چند گانه در زبان جاوا وجود دارد. x = y = z = 7; توجه داشته باشید، که عملگرهای =+، =-، =*، =/، ++، -- در زبان جاوا وجود دارند.

29 boolean unusual = (age < 21) & (brotherAge >78);
عملگرهای مقایسه ای عملگرهای منطقی: این عملگرها اعمال AND، OR، XOR و NOT را انجام می دهند. boolean unusual = (age < 21) & (brotherAge >78); به جای & از && هم می توان استفاده کرد، تفاوت دو عملگر فوق در این است که عملگر & هر دو عملوند را در نظر می گیرد، ولی عملگر && ابتدا به عملوند اول نگاه می کند، اگر مقدار این عملوند false باشد، به عملوند دوم توجه نمی کند. Boolean unusual = (grimThoughts>10) || (brotherAge>78);

30 تفاوت عملگر || با عملگر | در این است، که وقتی مقدار عملوند اول true باشد، به مقدار عملوند دوم توجه نمی کند و مقدار true باز می گرداند. برای XOR از عملگر ^ و برای NOT از عملگر ! استفاده می شود.

31 تقدم عملگرها: تقدم عملگرها به صورت زیر می باشد : ترتيب عملگر () 1
تقدم عملگرها به صورت زیر می باشد : عملگر ترتيب () 1 ++ , -- 2 * , / , % 3 + , - 4

32 عملگر:new همان طور که می دانید برنامه های جاوا از مجموعه ای از کلاسها تشکیل می شود. ضمناً می دانید که از کلاسها برای ایجاد اشیاء استفاده می شود. برای این منظور از عملگر new به صورت زیر استفاده میشود: class_type object_name = new class-type(); String teamName = new String(); Random randInfo = new Random(); Point pt = new Point(0,0);

33 مثال: import java.util.Random; class RandomNumbers {
public static void main(String arguments[]) { Random r1, r2; r1 = new Random(); System.out.println("Random value 1: " + r1.nextDouble()); r2 = new Random( ); System.out.println("Random value 2: " + r2.nextDouble()); }

34 نكات کلاس Random در حالت پیش فرض(بدون آرگومان) زمان جاری سیستم را به عنوان آرگومان درنظر می گیرد. : کلاس Random اعداد را از مجموعه ای متوالی و بسیار بزرگ استخراج می کند. این مجموعهpseudo-random number generation نامیده می شود. توجه داشته باشید که خط هفتم برنامه فوق شیئی از کلاس Random می سازد، که همیشه دارای مقدار می باشد. دلیل این مسئله وجود آرگومان ثابت هنگام ایجاد شیء است.

35 نكات اگر بخواهید عدد ایجاد شده توسط کلاس Random را به عدد صحیح تبدیل کنید به صورت زیر عمل می نمایید. Random r1 = new Random(); int number = (int)(r1.nextDouble()*12); در این صورت مقدار متغیر number عددی بین 0 و 11 خواهد بود.

36 نكات نکته: هنگام استفاده از عملگر new اعمال زیر انجام می شود :
نمونه ای جدید از یک کلاس ساخته می شود. فضای حافظه به شیء جدید و متغیرهایش اختصاص می یابد. متد constructor (سازنده) کلاس فراخوانی می شود.

37 نكات متد Constructor متدی است، که برای ایجاد و مقدار دهی اولیه نمونه های یک کلاس استفاده می شود. متد Constructor شیء جدید و متغیرهایش را مقدار دهی می کند، تمام اشیاء دیگری را که این شیء به آنها احتیاج دارد، را ایجاد می نماید و تمام عملیات دیگری را که برای مقدار دهی شیء مورد نیاز است، را انجام می دهد . متد Constructor را می توان چندین بار و هر بار با تعداد آرگومان متفاوت تعریف کرد

38 نكات و مثال اختصاص فضای حافظه به یک شیء و آزاد سازی آن در زبان جاوا به صورت اتوماتیک انجام می شود، و نیازی به نوشتن کد جهت انجام این اعمال وجود ندارد. import java.awt.Point; class SetPoints { public static void main(String arguments[]) { Point location = new Point(4, 13); System.out.println("Starting location:"); System.out.println("X equals " + location.x); System.out.println("Y equals " + location.y); System.out.println("\nMoving to (7, 6)"); location.x = 7; location.y = 6; System.out.println("\nEnding location:"); }

39 متغیرهای کلاس: همان طور که ملاحظه کردید، متغیر کلاس متغیری است، که تعریف و مقدار دهی آن درون کلاس انجام می شود و مقدار این متغیر برای تمام نمونه های کلاس ثابت است. در واقع تفاوت این نوع متغیر با متغیرهای نمونه در این است که اگر مقدار این نوع متغیرها در یکی از نمونه های کلاس تغییر کند، این تغییر مقدار به تمام نمونه های دیگر اعمال می شود، در حالی که در مورد متغیرهای نمونه این طور نیست. class FamilyMember{ static String surname = “Igwebuike”; String name; int age; }

40 نكات جهت دسترسی به متغیرهای کلاس مانند متغیرهای عمومی عمل می کنیم.
FamilyMember dad = new FamilyMember(); System.out.println(“Family’s surname is : ” + dad.surname); System.out.println(“Family’s surname is : ” + FamilyMember.surname);

41 نكات و مثال فراخوانی متدها نیز مانند فراخوانی متغیرها می باشد.
class CheckString { public static void main(String arguments[]) { String str = "In my next life, I will believe in reincarnation"; System.out.println("The string is: " + str); System.out.println("Length of this string: " + str.length()); System.out.println("The character at position 7: " + str.charAt(7)); System.out.println("The substring from 24 to 31: " + str.substring(24, 31)); System.out.println("The index of the character x: " + str.indexOf('x')); System.out.println("The index of the beginning of the " + "substring \"will\": " + str.indexOf("will")); System.out.println("The string in upper case: " + str.toUpperCase()); }

42 متدهای کلاس متدهای کلاس مانند متغیرهای کلاس می باشند، از این نوع متد زمانی استفاده می شود، که عملیات آن به طور مستقیم بر روی نمونه ای از کلاس اثر نگذارد. برای مثال کلاس String متدی دارد که می تواند انواع متفاوت داده ای را بپذیرد و نمونه ای جدید از کلاس String شامل مقدار رشته ای آرگومان ایجاد کند. String s1, s2; s1 = “item”; s2 = s1.valueOf(5); s2 = String.valueOf(5);

43 ضمناً متدهای کلاس برای جمع آوری متدهایی با کاربرد مشابه درون یک کلاس کاربرد دارند. برای مثال کلاس Math که درون پکیج java.lang قرار دارد، شامل مجموعه عظیمی از عملیات ریاضی به عنوان متدهای کلاس می باشد. برای درک بهتر موضوع متد Math.max() را در نظر بگیرید. این متد دارای دو آرگومان است و مقدار آرگومانی را که بزرگتر است، را باز می گرداند. int maximumPrice = Math.max(firstPrice, SecondPrice);

44 ارجاع به اشیاء ارجاع در واقع نوعی اشاره گر جهت نمایش مقدار یک شیء می باشد. import java.awt.Point; class ReferencesTest { public static void main (String arguments[]) { Point pt1, pt2; Point object X:200 Y:200 pt1 = new Point(100, 100); pt x:200 pt2 = pt1; pt y:200 pt1.x = 200; pt1.y = 200; System.out.println(“Point1: “ + pt1.x + “, “ + pt1.y); System.out.println(“Point2: “ + pt2.x + “, “ + pt2.y); }

45 تبدیل نوع : Cast تبدیل نوع داده یک متغیر به نوع دیگر را Cast می گویند. تبدیل نوع دارای انواع متفاوتی به شرح زیر مي باشد : تبدیل یک نوع داده ای اولیه به نوع داده ای اولیه دیگر تبدیل یک نوع داده ای اولیه به شیء و سپس بازگرداندن به همان نوع داده ای اولیه تبدیل نمونه ای از یک کلاس به نمونه ای از کلاس دیگر

46 تبدیل انواع داده ای پایه:
این نوع تبدیل یک نوع اولیه را به نوع اولیه دیگر تبدیل می کند و عموماً جهت تبدیل انواع عددی به کار می رود. روش انجام عمل تبدیل به صورت زیر است: (type_name) value; (int)(x/y); نکته: عمل تبدیل نوع در مورد متغیرهای منطقی قابل انجام نیست. نکته: اگر یک نوع داده ای اولیه را به نوع داده ای دیگر با بازه کوچکتر تبدیل کنید، ممکن است مقداری از اطلاعات را از دست بدهید. برای مثال تبدیل نوع float به int را در نظر بگیرید.

47 تبدیل نوع اشیاء تنها محدودیتی که برای تبدیل اشیاء به یکدیگر وجود دارد، این است که کلاسهای آنها باید از طریق وراثت با یکدیگر مرتبط باشند. نکته: تمام زیر کلاسها را می توان به جای کلاس والد استفاده کرد. برای مثال متدی را در نظر بگیرید، که دارای دو آ رگومان می باشد، آرگومان اول از نوع Object و آرگومان دوم از نوع Window . نمونه های تمام کلاسها را می توان به جای آرگومان اول قرار داد، زیرا تمام کلاسهای جاوا زیر کلاس، کلاس Object می باشند و به جای آرگومان دوم می توان از کلاسهای FileDialog، Dialog و Frame استفاده کرد.

48 تبدیل نوع کلاسها به صورت زیر انجام می شود
مثال: Employee emp = new Employee(); vicePresident veep = new vicePresident(); emp = veep; //no cast need for upward use; veep = (vicePresident)emp; //must cast explicity

49 تبدیل انواع داده ای اولیه به اشیاء و بر عکس
جهت تبدیل انواع داده ای پایه به اشیاء کلاسهایی در زبان جاوا در نظر گرفته شده است. این کلاسها عبارتند از: Integer، Float و توجه داشته باشید که نام این کلاسها با حروف بزرگ شروع می شود، در حالی که نام انواع داده ای با حروف کوچک آغاز می شود. عملکرد جاوا در مورد انواع داده ای پایه و کلاسهای مشابه شان بسیار متفاوت است و در صورتی که یکی از آنها به جای دیگری استفاده شوند، خطای کامپایل ایجاد می کنند.

50 روش تبدیل یک نوع داده ای اولیه به شیء به صورت زير مي باشد
Class_name Object_name = new Class_name(Value); مثال: Integer dataCount = new Integer(4403); نکته: استفاده از این اشیاء مانند دیگر اشیاء می باشد و هیچ تفاوتی بین آنها وجود ندارد. اگر بخواهید شیء فوق را مجدداً تبدیل به نوع داده ای پایه نمایید، به روش زیر عمل کنید. Data_type Variable_name = Object_name.intValue(); int newCount = dataCount.intValue(); //returns 4403

51 نكات و مثال اگر بخواهید نمونه ای ازکلاس String را به نوع داده ای int تبدیل نمایید، روش کار کمی متفاوت و به صورت زیر خواهد بود. Integer_Variable = Integer.parseInt(String_variable); مثال: String Pennsylvania = ”65000”; int penn = Integer.parseInt(Pennsylvania);

52 مقایسه مقادیر اشیاء اگر بخواهید مقادیر دو شیء را باهم مقایسه کنید، از چه عملگرهایی استفاده می کنید؟ اگر پاسخ شما عملگرهای == و=! می باشد، کاملاٌ در اشتباه هستید. این دو عملگر برابری خود اشیاء را بررسی می کنند، نه مقدار آنها را. برای مقایسه مقادیر دو شیء باید توابعی را در بدنه برنامه تان بگنجانید. برای مثال کلاس String را در نظر بگیرید. فرض کنید دو شیء متفاوت این کلاس دارای مقدار مشابه می باشند، اگر ازعملگر == جهت مقایسه اشیاء استفاده کنید، مقدار بازگشتی false خواهد بود.

53 مثال class EqualsTest { public static void main(String args[]) {
String str1, str2; str1 = “Free the bound periodicals.”; str2 = str1; System.out.println(“String1: “ + str1); System.out.println(“String2: “ + str2); System.out.println(“Same object? “ + (str1 == str2)); str2 = new String(str1); System.out.println(“Same value? “ + str1.equals(str2)); }

54 تعیین کلاس یک شیء جهت انجام این عمل به یکی از روشهای زیر عمل می نماییم. 1- Class_name Object_name = obj.getClass().getName(); مثال: String name = obj.getClass().getName(); 2- Object_name instanceof Class_name “Swordfish”instanceof String //true Point pt = new Point(10,10); pt instanceof String //false

55 تعیین متدها و مشخصه های کلاس
به روش زیر می توان متدها و مشخصه های زیر را بارگذاری نمود و آنها را مشاهده کرد. مثال: import java.lang.reflect.*; import java.util.Random; class SeeMethods { public static void main(String[] arguments) { Random rd = new Random(); Class className = rd.getClass(); Method[] methods = className.getMethods(); for (int i = 0; i < methods.length; i++) { System.out.println(“Method: “ + methods[i]); }

56 آرایه ها از آرایه ها جهت ذخیره کردن لیستی از عناصر با نوع داده ای یکسان استفاده می شود. این نوع داده ای می تواند یک نوع داده ای اولیه یا یک کلاس باشد. نکته: نوع داده ای تمام عناصرآرایه باید یکسان باشد. در زبان جاوا برای ایجاد یک آرایه اعمال زیر را انجام می دهیم. تعریف یک متغیر به عنوان آرایه ایجاد یک شیء آرایه جدید و اختصاص آن به متغیرآرایه ذخیره اطلاعات درون آرایه

57 تعریف متغیر آرایه :Declaring Array Variable
متغیر آرایه را به یکی از صورتهای زیر تعریف می کنیم : 1- Data_type array_name[]; مثال: String difficultWords[]; Point hits[]; int donations[]; 2- Data_type[] array_name; String[] difficultWords; Point[] hits; int[] donations;

58 ایجاد شیء آرایه برای ایجاد شیء آرایه اعمال زیر را انجام می دهیم:
استفاده از عملگر new مقدار دهی اولیه آرایه Data_type array_name = new Data_type[Element_number]; مثال: String[] playerNames = new String[10]; int[] temps = new int[99];

59 نكات و مثال نکته: هنگام استفاده از عملگر new تمام خانه های آرایه مقدار می گیرند. این مقادیر به ازای انواع داده ای، متفاوت می باشند. مقادیر مذکور عبارتند از: 0 برای عناصر آرایه های عددی false برای عناصر آرایه های منطقی ‘\0’ برای عناصر آرایه های کاراکتری Null برای عناصر آرایه ای از اشیاء نکته: تعریف و مقدار دهی آرایه را می توان به طور همزمان انجام داد. برای انجام این کار از روش زیر استفاده می شود. Data_type array_name = {Value1, Value2, … }; مثال: String[] chiles = {“jalapeno”, “anaheim”, “serrano”, “habanero”, “thai”};

60 عناصر آرایه جهت بررسی نحوه ی استفاده از عناصر آرایه به مثال زیر توجه کنید. class ArrayTest { String[] firstNames = { “Dennis”, “Grace”, “Bjarne”, “James” }; String[] lastNames = new String[firstNames.length]; void printNames() { int i = 0; System.out.println(firstNames[i]+ “ “ + lastNames[i]); i++; System.out.println(firstNames[i] + “ “ + lastNames[i]); }

61 ArrayTest a = new ArrayTest(); a.printNames();
public static void main (String arguments[]) { ArrayTest a = new ArrayTest(); a.printNames(); System.out.println(“-----“); a.lastNames[0] = “Ritchie”; a.lastNames[1] = “Hopper”; a.lastNames[2] = “Stroustrup”; a.lastNames[3] = “Gosling”; }

62 آرایه های چند بعدی : Multidimensional Array
در زبان جاوا آرایه های چند بعدی وجود ندارد، ولی این امکان وجود دارد که آرایه های تو در تو تعریف کنیم. به عبارت دیگر می توانیم آرایه تعریف نماییم که هر کدام از عناصرآن یک آرایه باشد. عبارات زیر روش تعریف این گونه آرایه ها و نحوه دسترسی به عناصر آن را نشان می دهد. int[][] coords = new int[12][12]; coords[0][0] = 1; coords [0][1] = 2;

63 نكته اگر بخواهیم متغیری را به بلوکی از برنامه محدود کنیم. به این صورت عمل می کنیم : void testBlock(){ int x = 10; { //Start of block int y = 40; y = y + x; } //End of block }

64 عبارت شرطی If ازاین دستور به دوصورت استفاده می شود. 1- if(Condition)
Statement; 2-if(Condition) else

65 مثال 1- if(age > 39) System.out.println(“You call that a haicut?”);
2- if(blindDataIsAttractive == true) restaurant = ”Benihanas”; else restaurant = ”Burritohut”;

66 نكات و مثال نکته: تفاوت دستور if در زبان جاوا و C در این است که در زبان جاوا پس از انجام مقایسه یک مقدار منطقی بازگردانده می شود، در حالی که زبان C یک عدد صحیح باز می گرداند. مثال: class EvenSteven { void evenCheck(int val) { System.out.println(“Value is “ + val + “. “); if (val % 2 == 0) System.out.println(“Steven!”); } public static void main (String arguments[]) { EvenSteven e = new EvenSteven(); e.evenCheck(1); e.evenCheck(2); e.evenCheck(54); e.evenCheck(77); e.evenCheck(1346);

67 نكات و مثال نکته: دستور زیر عملکردی مانند if else دارد.
test ? trueResult : falseResult; مثال: عبارت زیر را در نظر گرفته و معادل آن را با دستور if بنویسید؟ int ourBestScore = myScore > yourScore ? myScore : yourScore; int ourBestScore; if(myScore > yourScore) outBestScore = myScore; else ourBestScore = yourScore;

68 عبارت شرطی Switch از دستور switch به این صورت استفاده می شود.
switch(Variable){ case Value1: Statement; break; case Value2: case Value3: . . . default: }

69 مثال switch(grade){ case ‘A’: System.out.println(“Great job – an A!”);
break; case ‘B’: System.out.println(“Good job -- a B!”); case ‘C’: System.out.println(“Your grade was a C.”); default: System.out.println(“An F – consider cheating”) ; }

70 مثال مثال: switch(oper){ case ‘+’: addargs(arg1, arg2); break;
mulargs(arg1, arg2); case ‘-’: subargs(arg1, arg2); case ‘/’: divargs(arg1, arg2); }

71 نكته همان طور که ملاحظه می فرمایید، وجود قسمت default اختیاری است و در صورت وجود اگر هیچکدام از قسمتها اجرا نشود، قسمت default اجرا خواهد شد. نکته: اگر چند شرط داشته باشیم که بخواهیم عملکرد یکسانی داشته باشند، به صورت زیرعمل می کنیم. Switch(x){ case ‘2’: case ‘4’: case ‘6’: case ‘8’: System.out.println(“x is an even number”); break; default: System.out.println(“x is an odd number”); }

72 مثال class NumberReader { String convertNum(int val) { switch (val) {
case 0: return “zero “; case 1: return “one “; case 2: return “two “; case 3: return “three “; case 4: return “four “; case 5: return “five “; case 6: return “six “; case 7: return “seven “; case 8: return “eight “; case 9: return “nine “; default: return “ “; }

73 NumberReader n = new NumberReader();
public static void main (String arguments[]) { NumberReader n = new NumberReader(); String num = n.convertNum(4) n.convertNum(1) + n.convertNum(3); System.out.println(“413 converts to “ + num); }

74 دستور For دستور For به این صورت استفاده می شود.
for(Initialization; Test; Increment){ Statement; }

75 مثال class NamesLoop { String[] firstNames = { “Dennis”, “Grace”, “Bjarne”, “James” }; String[] lastNames = new String[firstNames.length]; void printNames() { for (int i = 0; i < firstNames.length; i++) System.out.println(firstNames[i] + “ “ + lastNames[i]); } public static void main (String arguments[]) { NamesLoop a = new NamesLoop(); a.printNames(); System.out.println(“-----“); a.lastNames[0] = “Ritchie”; a.lastNames[1] = “Hopper”; a.lastNames[2] = “Stroustrup”; a.lastNames[3] = “Gosling”;

76 دستور While دستور while به این صورت است. while(Condition){ Statement;
}

77 مثال class CopyArrayWhile {
public static void main (String arguments[]) { int[] array1 = { 7, 4, 8, 1, 4, 1, 4 }; float[] array2 = new float[array1.length]; System.out.print(“array1: [ “); for (int i = 0; i < array1.length; i++) { System.out.print(array1[i] + “ “); } System.out.println(“]”); System.out.print(“array2: [ “); int count = 0; while ( count < array1.length && array1[count] != 1) { array2[count] = (float) array1[count]; System.out.print(array2[count++] + “ “);

78 دستور Do…While دستور do…while به این صورت است. do{ Statement;
} while(Condition);

79 مثال class DoTest { public static void main (String arguments[]) {
int x = 1; do { System.out.println(“Looping, round “ + x); x++; } while (x <= 10); }

80 نكته تفاوت do…while و while در این است که دستور while ابتدا شرط را چک می کند، اگر شرط حلقه درست باشد عبارات داخل حلقه اجرا می شوند، ولی دستور در انتهای حلقهdo…while شرط را کنترل می کند، بنابر این عبارات داخل حلقه do…while حداقل یک بار اجرا می شوند.

81 دستور Break از این دستور برای خروج از حلقه در شرایط خاص استفاده می شود. int count = 0; while(count < userData1.length){ if(userData[count] == 1) break; userData2[count] = (float)userData1[count++]; }

82 دستور Continue از این دستور برای بازگشتن به ابتدای حلقه در شرایط خاص استفاده می شود. int count = 0; int count2 = 0; while(count++ <= userData1.length){ if(userData[count] == 1) continue; userData2[count2++] = (float)userData1[count]; }

83 مثال class LabelTest { public static void main (String arguments[]) {
thisLoop: for (int i = 1; i <= 5; i++) for (int j = 1; j <= 3; j++) { System.out.println(“I is “ + i + “, j is “ + j); if (( i + j) > 4) break thisLoop; } System.out.println(“end of loops”);

84 تعریف کلاسها به این خاطر که اساس برنامه نویسی جاوا بر پایه کلاسها می باشد، روش تعریف کلاسها را در قسمتهای قبل ملاحظه کردید. در این قسمت می خواهیم جزئیات این کار را بررسی کنیم. Class Class_name{ //body of the class }

85 نكته تمام کلاسهایی که تعریف می کنیم زیر کلاس، کلاس Object می باشند. اگر بخواهیم کلاسی زیرکلاس، کلاس دیگری باشد، باید از عبارت زیر استفاده کنیم: Class Subclass_name extends Superclass{ //body of the class }

86 تعریف متغیرهای نمونه تعریف متغیرهای نمونه مانند تعریف متغیرهای محلی می باشد. تنها تفاوت آنها در محل تعریف متغیر است. در واقع متغیرهای محلی در بدنه متدهای یک کلاس تعریف می شوند و متغیرهای نمونه بیرون از بدنه ی متدها. مثال: class Student{ int studentNo; String name; }

87 ثوابت اگر بخواهیم متغیری تعریف نماییم که مقدارش در طول اجرای برنامه تغییر نکند، از ثوابت استفاده می کنیم. final Data_type Constant_name = Value; مثال: final float PI = ;

88 نكات نکته: تمام انواع متغیرها اعم از متغیرهای کلاس، متغیرهای نمونه و متغیرهای محلی را می توان به صورت ثابت تعریف کرد. نکته: استفاده از ثوابت در بسیاری از موارد باعث افزایش خوانایی برنامه می شود. به علاوه باعث کاهش تغییر در کد برنامه در مواقعی که نیاز داریم، مقدار ثابت را تغییر دهیم، می شود. final byte MAX = 100;

89 متغیرهای کلاس همان طور که می دانید متغیرهای کلاس برای تمام اشیاء یک کلاس مقدار یکسانی دارند. static Data_type Variable_name; static int sum; اگر بخواهیم یک متغیر کلاس را به صورت ثابت تعریف نماییم، از عبارت زیر استفاده می کنیم. static final Data_type Constant_name = Value; static final int MAX = 10;

90 تعریف متدها تعریف متدها شامل چهار بخش می باشد. نام متد
نوع شیء یا نوع داده ای اولیه ای که متد باز می گرداند. آرگومانهای متد بدنه متد Data_type Method_name(Data_type1 arg1, ...){ //body of the method }

91 نكته نکته: اگر مقدار بازگشتی یک آرایه باشد، تعریف متد به صورت زیر خواهد بود. Data_type[] Method_name(Data_type1 arg1, ...){ //body of the method }

92 مثال class RangeClass { int[] makeRange(int lower, int upper) {
int arr[] = new int[ (upper – lower) + 1 ]; for (int i = 0; i < arr.length; i++) { arr[i] = lower++; } return arr; public static void main(String arguments[]) { int theArray[]; RangeClass theRange = new RangeClass(); theArray = theRange.makeRange(1, 10); System.out.print(“The array: [ “); for (int i = 0; i < theArray.length; i++) { System.out.print(theArray[i] + “ “); System.out.println(“]”);

93 کلمه کلیدی This اگر بخواهید درون بدنه یک متد به متغیرهای نمونه شیء دسترسی پیدا کنید، یا به شیء جاری به عنوان آرگومان متد دیگر ارجاع کنید، باید از کلمه کلیدی this استفاده کنید. t = this.x; //The x instance variable for this object this.resetData(this); //Call the resetData method, defined in //this class, and pass it the current object return this; //Return the current object

94 نكته اغلب موارد نیازی به ذکر کلمه کلیدی this نمی باشد. برای مثال جهت دسترسی به متغیرها و متدهای نمونه نیازی به ذکر کلمه کلیدی this نمی باشد. t = x; resetData(this);

95 محدوده متغیرها محدوده قسمتی از برنامه است که متغیر یا هر داده ی دیگری در آن قسمت قابل استفاده می باشد. محدوده متغیرهای محلی بلوکی است که درون آن تعریف شده اند. بنابر این تمام متدهای یک کلاس می توانند از متغیرهای نمونه و کلاس استفاده کنند. نکته: زمانی که برنامه جاوا با متغیری مواجه می شود، ابتدا دنبال تعریف آن به عنوان متغیر محلی می گردد. اگر چنین تعریفی وجود نداشت، به دنبال تعریف متغیر به عنوان متغیر نمونه یا متغیر کلاس در همان کلاس خواهد گشت، و در نهایت کلاسهای والد را به جهت یافتن تعریف متغیر جستجو خواهد کرد

96 مثال class ScopeTest { int test = 10; void printTest () {
System.out.println(“test = “ + test); } public static void main(String arguments[]) { ScopeTest st = new ScopeTest(); st.printTest();

97 ارسال آرگومانها به متدها
برای بررسی چگونگی ارسال آرگومانها به متدها به مثال زیر توجه کنید. Class PassByReference { int onetoZero(int arg[]) { int count = 0; for (int i = 0; i < arg.length; i++) { if (arg[i] == 1) { count++; arg[i] = 0; } return count; public static void main(String arguments[]) { int arr[] = { 1, 3, 4, 5, 1, 1, 7 }; PassByReference test = new PassByReference(); int numOnes; System.out.print(“Values of the array: [ “); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + “ “);

98 System.out.println(“]”);
numOnes = test.onetoZero(arr); System.out.println(“Number of Ones = “ + numOnes); System.out.print(“New values of the array: [ “); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + “ “); } نکته: ارسال اشیاء و آرایه ها به متدها با روش فراخوانی با ارجاع و ارسال انواع داده ای پایه به صورت فراخوانی با مقدار است.

99 متدهای کلاس متدهای کلاس ,متدهایی هستند که توسط خود کلاس ، اشیا کلاس و کلاسهای دیگر قابل استفاده می باشد، به عبارت دیگر برای استفاده از این متد نیازی به ایجاد شیء نمی باشد. برای مثال کلاس Math را در نظر بگیرید، این کلاس دارای تعداد زیادی متد می باشد که اعمال ریاضی را انجام می دهند. اگر بخواهید ازاین متدها استفاده کنید، کافی است عبارتی شبیه عبارات زیر را درون کد برنامه بگنجانید. float root = Math.sqrt(453.0); System.out.print(“The larger number is ” + Math.max(x,y));

100 نكته و مثال نکته: برای تعریف متد کلاس از کلمه کلیدی static استفاده می کنیم. static Data_type Method_name(Data_type1 Arg1, …){ //Body of the method } مثال: static int max(int arg1, int arg2){

101 ایجاد متدها با یک نام و آرگومانهای متفاوت : Function Overloading
متدهای با نام مشابه دو وجه تمایز نسبت به یکدیگر دارند: تعداد آرگومانها نوع داده ای و اشیاء متفاوت به عنوان آرگومان نکته: زمانی متدهای با نام مشابه را ایجاد می کنیم، که این متدها همگی عمل یکسانی را انجام دهند. نکته: توجه داشته باشید که متدهای دارای نام مشابه باید مقدار بازگشتی یکسان داشته باشند، در غیر این صورت برنامه جاوا کامپایل نخواهد شد.

102 مثال import java.awt.Point; class MyRect { int x1 = 0; int y1 = 0;
MyRect buildRect(int x1, int y1, int x2, int y2) { this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; return this; }

103 MyRect buildRect(Point topLeft, Point bottomRight) {
x1 = topLeft.x; y1 = topLeft.y; x2 = bottomRight.x; y2 = bottomRight.y; return this; } MyRect buildRect(Point topLeft, int w, int h) { x2 = (x1 + w); y2 = (y1 + h);

104 void printRect(){ System.out.print(“MyRect: <” + x1 + “, “ + y1); System.out.println(“, “ + x2 + “, “ + y2 + “>”); } public static void main(String arguments[]) { MyRect rect = new MyRect(); System.out.println(“Calling buildRect with coordinates 25,25, 50,50:”); rect.buildRect(25, 25, 50, 50); rect.printRect(); System.out.println(“***”); System.out.println(“Calling buildRect with points (10,10), (20,20):”); rect.buildRect(new Point(10,10), new Point(20,20));

105 System.out.println(“***”);
System.out.print(“Calling buildRect with 1 point (10,10),”); System.out.println(“ width (50) and height (50):”); rect.buildRect(new Point(10,10), 50, 50); rect.printRect(); }

106 متد سازنده : Constructor
متد سازنده متدی است، که در زمان ایجاد یک شیء از کلاس فراخوانی می شود. بر خلاف دیگر متدها، متد new سازنده را نمی توان مستقیماً فراخوانی کرد. متد سازنده هنگام استفاده از عملگر new فراخوانی می شود. نکته: اگر متد سازنده در یک کلاس وجود نداشته باشد، باید متغیرهای نمونه را خودتان مقدار دهی کنید. انجام این عمل با فراخوانی متدهای دیگر قابل انجام است.

107 نكته و مثال نکته: متد سازنده دارای دو تفاوت عمده با متدهای دیگر می باشد. این تفاوتها عبارتند از: متدهای سازنده هم نام کلاسشان هستند، در حالی که نام متدهای دیگر را خودمان تعیین می کنیم. متدهای سازنده مقدار بازگشتی ندارند. مثال: class Person { String name; int age; Person(String n, int a) { name = n;

108 age = a; } void printPerson() { System.out.print(“Hi, my name is “ + name); System.out.println(“. I am “ + age + “ years old.”); public static void main (String arguments[]) { Person p; p = new Person(“Luke”, 50); p.printPerson(); System.out.println(“----“);

109 p = new Person(“Laura”, 35);
p.printPerson(); System.out.println(“----“); }

110 فراخوانی یک متد سازنده توسط متد سازنده دیگر
برای ملاحظه ی نحوه ی فراخوانی یک متد سازنده توسط متد سازنده ی دیگر به مثال زیر توجه کنید. مثال: class myCircle{ int x, y, radius; myCirlce(int xPoint, int yPoint, int rediusLength){ this.x = xPoint; this.y = yPoint; this.radius = radiusLength; } myCirlce(int xPoint, int yPoint){ this(xPoint, yPoint, 1);

111 مثال import java.awt.Point; class MyRect2 { int x1 = 0; int y1 = 0;
MyRect2(int x1, int y1, int x2, int y2) { this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; }

112 MyRect2(Point topLeft, Point bottomRight) {
x1 = topLeft.x; y1 = topLeft.y; x2 = bottomRight.x; y2 = bottomRight.y; } MyRect2(Point topLeft, int w, int h) { x2 = (x1 + w); y2 = (y1 + h);

113 void printRect() { System.out.print(“MyRect: <” + x1 + “, “ + y1); System.out.println(“, “ + x2 + “, “ + y2 + “>”); } public static void main(String arguments[]) { MyRect2 rect; System.out.println(“Calling MyRect2 with coordinates 25,25 50,50:”); rect = new MyRect2(25, 25, 50,50); rect.printRect(); System.out.println(“***”);

114 System.out.println(“Calling MyRect2 with points (10,10), (20,20):”);
rect= new MyRect2(new Point(10,10), new Point(20,20)); rect.printRect(); System.out.println(“***”); System.out.print(“Calling MyRect2 with 1 point (10,10)”); System.out.println(“ width (50) and height (50):”); rect = new MyRect2(new Point(10,10), 50, 50); }

115 Overriding Methods اگر دو متد دارای نام، مقدار بازگشتی و آرگومانهای یکسان باشند و یکی از متدها در کلاس والد و دیگری در کلاس فرزند باشد. متدی که در کلاس فرزند است، حق تقدم دارد. مثال: //Super Class class PrintClass { int x = 0; int y = 1; void printMe() { System.out.println("x is " + x + ", y is " + y); System.out.println("I am an instance of the class " + this.getClass().getName()); }

116 //Sub Class class PrintSubClass extends PrintClass { int z = 3; public static void main(String arguments[]) { PrintSubClass obj = new PrintSubClass(); obj.printMe(); }

117 Overriding Construcror
مثال import java.awt.Point; class NamedPoint extends Point { String name; NamedPoint(int x, int y, String name) { super(x,y); this.name = name; } public static void main (String[] arguments) { NamedPoint np = new NamedPoint(5, 5, "SmallPoint"); System.out.println("x is " + np.x); System.out.println("y is " + np.y); System.out.println("Name is " + np.name);

118 متد خاتمه دهنده : Finalizer Method
متد خاتمه دهنده مخالف متد سازنده می باشد. زمانی که نیاز به یک شیء خاتمه می یابد فراخوانی می شود. Protected void finalize() throws Throwable{ Super.finalize(); }

119 اپلت :Applet برنامه های جاوایی که در سمت سرویس گیرنده اجرا می شوند. تفاوت اپلتها با برنامه های کاربردی جاوا در نحوه ی اجرای آنهاست. برنامه های کاربردی با درج نام برنامه در خط فرمان اجرا می شوند و اپلتها توسط لینکی در مرورگر وب.

120 محدودیتهای اپلتها اپلتها نمی توانند فایلهای درون سیستم را بخوانند یا روی آن بنویسند. اپلتها نمی توانند با هیچ سایتی غیر از سایتی که از روی آن بارگذاری شده اند، ارتباط برقرار کنند. اپلتها نمی توانند هیچ برنامه ای را در سیستم سرویس گیرنده اجرا کنند. اپلتها نمی توانند هیچ برنامه ای را در سیستم سرویس دهنده اجرا کنند.

121 ایجاد اپلتها برای ایجاد یک اپلت به صورت زیر عمل می کنیم.
public class Applet_Name extends java.applet.Applet{ //Applet Core Comes Here } نکته: تمام اپلتها را باید به صورت public تعریف کرد.

122 متدهای اپلتها متد init متد start متد stop متدdestroy متدpaint

123 متد Init این متد در زمان فراخوانی اپلت اجرا می شود. این متد اعمالی نظیر ایجاد اشیاء مورد نیاز اپلت، تنظیمات اولیه، بارگذاری تصاویر و فونتها و تنظیم پارامترها را انجام می دهد. public void init(){ //Core here }

124 متد Start پس از متد init این متد فراخوانی می شود. این متد زمانی هم که متد stop فراخوانی شده باشد قابل اجرا است. public void start(){ //Core here }

125 متدStop این متد اجرای اپلت را متوقف می کند public void stop(){
//Core here }

126 متد Destroy این متد قبل از آزاد شدن فضای حافظه اختصاص داده شده به اپلت فراخوانی می شود. با اجرای این متد تمامی threadها و اشیاء از بین می روند. اگر اپلت از منابع خاصی نظیر threadها استفاده نکرده باشد، نیازی به override کردن این متد وجود ندارد. public void destroy(){ //Core here }

127 متد Paint این متد نحوه ی نمایش اپلت را کنترل می کند. به کمک این متد می توان متن، خطوط، رنگ پشت زمینه و تصاویر را برای اپلت تعیین کرد. این متد بعد از متد init اجرا می شود. هرگاه اپلت نیازمند به روز رسانی باشد، این متد مجدداً فراخوانی می شود. public void paint(){ //Core here }

128 مثال JAVA FILE: import java.awt.Graphics; import java.awt.Font;
import java.awt.Color; public class Palindrome extends java.applet.Applet { Font f = new Font("TimesRoman", Font.BOLD, 36); public void paint(Graphics screen) { screen.setFont(f); screen.setColor(Color.red); screen.drawString("Go hang a salami, I'm a lasagna hog.", 5, 40); }

129 HTML FILE: <HTML> <HEAD> <TITLE>The Palindrome Page</TITLE> </HEAD> <BODY> <P>My favorite meat-related palindrome is: <BR> <APPLET CODE="Palindrome.class" WIDTH=600 HEIGHT=100> A secret if your browser does not support Java! </APPLET> </BODY> </HTML>

130 تگ APPLET تگ APPLET در زبان HTML برای افزودن اپلتها به صفحات وب استفاده می شود. این تگ دارای خصایصی به شرح زیر می باشد. خصيصه WIDTH: تعیین کننده عرض صفحه وب. خصيصه HEIGHT: تعیین کننده ارتفاع صفحه وب. خصيصه ALIGN: تعیین کننده محل قرار گرفتن اپلت در صفحه وب. این خصیصه می تواند یکی از مقادیر زیر باشد.

131 خصايص ALIGN LEFT RIGHT TEXTTOP ABSMIDDLE MIDDLE BASELINE BOTTOM
ABSBOTTOM

132 نکته <BR CLEAR = LEFT> اولین فضای خالی سمت چپ را در نظر می گیرد.
<BR CLEAR = RIGHT> اولین فضای خالی سمت راست را در نظر می گیرد. <BR CLEAR = ALL> اولین فضای خالی را در نظر می گیرد.

133 خصایص HSPACE و VSPACE: تعیین میزان فاصله ی متن اطراف اپلت از آن. خصیصه HSPACE کنترل فضای افقی(سمت چپ و راست) و خصیصه VSPACE کنترل فضای عمودی(بالا و پایین) اپلت را انجام می دهد مثال: <APPLET CODE = “ShowSmiley.class” WIDTH = 45 HEIGHT = 42 ALIGN = LEFT VSPACE = 50 HSPACE = 10> Required Java </APPLET>

134 خصایص CODE و CODEBASE تعیین محل قرار گرفتن فایل کلاس پایه اپلت و دیگر فایلهای مورد نیاز. خصیصه CODE نام فایل کلاس پایه را تعیین می کند و خصیصه CODEBASE مسیر قرار گرفتن فایل کلاس پایه را تعیین می نماید. نکته: در صورتی که از خصیصه CODEBASE به همراه خصیصه CODE استفاده نشود، مسیر قرار گرفتن فایل کلاس پایه اپلت همان مسیر قرار گرفتن صفحه وبی خواهد بود که اپلت درون آن قرار دارد

135 مثال <APPLET CODE = “Bix.class” HEIGHT = “40” WIDTH = “400”> </APPLET> <APPLET CODE = “Bix.class” CODEBASE = “Toshire” HEIGHT = “40” WIDTH = “400”> </APPLET> <APPLET CODE = “Bix.class” CODEBASE = “ HEIGHT = “40” WIDTH = “400”> </APPLET>

136 تگ Object تگ OBJECT برای تمام اشیاء قابل استفاده است، در حالی که تگ APPLET تنها توانایی بارگذاری اپلتها را داشت. <OBJECT CLASSID = “java.bix.class” CODEBASE = “javaclasses” HEIGHT = “40” WIDTH = “400”> </OBJECT>

137 کلاس Graphics این کلاس شامل تمام متدهای ساده و اولیه می باشد. این کلاس درون بسته ی java.awt قرار دارد. مثال: import java.awt.Graphics; import java.awt.Polygon; public class Map extends java.applet.Applet { public void paint(Graphics screen) { screen.drawString("Florida", 185, 75); }

138 ترسیم اشکال هندسی

139 ترسیم خطوط برای ترسیم خطوط از متد drawLine استفاده می شود. این متد خطی بین دو نقطه ی (x1,y1) و (x2,y2)ترسیم می کند. drawLine(x1,y1,x2,y2);

140 چهار ضلعی برای ترسیم چهار ضلعی از متد drawRect استفاده می کنیم. به کمک این متد می توان دو نوع مستطیل ترسیم نمود. 1 ) مستطیل با گوشه های تیز drawRect(x, y, width, height); 2 ) مستطیل با گوشه های گرد drawRoundRect(x, y, width, height, roundWidth, RoundHeight); نکته: برای پر کردن فضای خالی داخل مستطیل از متدهای fillRect() و fillRoundRect() استفاده می شود.

141 چند ضلعی برای ترسیم چند ضلعی از متد drawPolygon() و برای پر کردن فضای داخل آن از متد fillPolygon() استفاده می شود. int x[] = {10, 20, 30, 40, 50}; int y[] = {15, 25, 35, 45, 55}; int points = x.Length; Polygon poly = new Polygon(x, y, points); نكته: پس از ایجاد چند ضلعی برای افزودن یک نقطه ی جدید به آن از متد addPoint(x, y); استفاده می شود. نكته: برای پر کردن فضای داخل چند ضلعی از متد fillpolygon() استفاده می شود.

142 بیضی و دایره برای ترسیم بیضی و دایره از متد drawOval() و برای پر کردن فضای داخل آن از متد fillOval() استفاده می شود. drawOval(x, y, width, height); نكته: مقدار width و height برای ترسیم دایره برابر است.

143 کمان برای ترسیم کمان از متد drawArcs() و برای پر کردن فضای داخل آن از متد fillArcs() استفاده می شود. drawArcs(x, y, width, height, start_angle, traveled_degree);

144 مثال import java.awt.Graphics; import java.awt.Polygon;
public class Map extends java.applet.Applet { public void paint(Graphics screen) { screen.drawString("Florida", 185, 75); screen.drawLine(185,80,222,80); screen.drawRect(2, 2, 345, 345); screen.drawRoundRect(182,61,43,24,10,8); int x[] = { 10, 234, 253, 261, 344, 336, 295, 259, 205, 211, 195, 191, 120, 94, 81, 12, 10 }; int y[] = { 12, 15, 25, 71, 209, 278, 310, 274, 188, 171, 174, 118, 56, 68, 49, 37, 12 };

145 int pts = x.length; Polygon poly = new Polygon(x, y, pts); screen.drawPolygon(poly); screen.fillOval(235,140,15,15); screen.fillOval(225,130,15,15); screen.fillOval(245,130,15,15); for (int ax = 50; ax < 150; ax += 10) for (int ay = 120; ay < 320 ; ay += 10) screen.drawArc(ax, ay, 10, 10, 0, -180); }

146 نكات نکته: برای کپی یا پاک کردن قسمتی از پنجره ی اپلت از متدهای copyArea() و clearRect() استفاده می شود. copyArea(x, y, width, height, horizontal_distance, vertical_distance); screen.CopyArea(0, 0, 100, 100, 50, 25); clearRect(x, y, width, height); نکته: برای پاک کردن کل پنجره ی اپلت از متدهای clearRect() به صورت زیر استفاده می شود. screen.clearRect(0, 0, size().width, size().height);

147 ایجاد شیء Font برای ایجاد شیء Font باید سه آرگومان به متد سازنده ی کلاس Fontارسال کرد. این سه آرگومان عبارتند از: نام فونت حالت فونت(Italic، Bold، Plain) سایز فونت مثال: Font f = new Font(“Dialog”, Font.BOLD + Font.ITALIC, 24); نكته: براي استفاده از یک شیء Font از متد setFont() استفاده می شود. screen. setFont(f); نكته: براي ترسيم روي صفحه نمايش از متد drawString() استفاده می شود.

148 مثال import java.awt.Font; import java.awt.Graphics;
import java.awt.FontMetrics; public class SoLong extends java.applet.Applet { public void paint(Graphics screen) { Font f = new Font("Courier", Font.BOLD, 18); FontMetrics fm = getFontMetrics(f); screen.setFont(f); String s = "So long, and thanks for all the fish."; int x = (size().width - fm.stringWidth(s)) / 2; int y = size().height / 2; screen.drawString(s, x, y); }

149 رنگ با استفاده از کلاسهای color و colorSpace می توان رنگ مورد استفاده در برنامه های کاربردی و اپلتها را تعیین کرد.

150 شیء Color برای تعیین رنگ رو زمینه باید یک شیء Color ایجاد کنیم، یا از یکی از رنگهای استاندارد کلاس Color استفاده کنیم. شیء Color به یکی از صورتهای زیر ایجاد می شود. Color c1 = new Color(0.807F, 1F, 0F); Color c2 = new Color(255, 204, 102);

151 رنگهای استاندارد نکته: رنگ رو زمینه را با استفاده از یکی از روشهای زیر تعیین می کنیم. screen.setColor(Color.pink); Color brush = new Color(255, 204, 102); screen.setColor(brush); نکته: برای تعیین رنگ پشت زمینه از متد setBackground() استفاده می کنیم. نکته: متد setForeground() مانند متد setColor() می باشد با این تفاوت که این متد رنگ یک پنجره یا یک دکمه را تعیین می کند. نکته: اگر می خواهید بدانید رنگ جاری چیست، می توانید از متد getColor() کلاس Graphics یا متدهای getBackground() یا getForeground() کلاس Applet استفاده کنید.

152 شیء Graphics2D برای ایجاد شیء Graphics2D به صورت زیر عمل می کنیم.
public void paint(Graphics screen){ Graphics2D screen2D = (Graphics2D)screen; }

153 الگوهای ترسیم الگوهای ترسیم چگونگی رنگ آمیزی و ترسیم یک شیء را کنترل می کند. اگر از Java2D استفاده می کنید می توانید رنگهای ساده، سایه روشن، یا دارای بافت را به کار ببرید. الگوی ترسیم با استفاده از متد setPaint() کلاس Graphics تعیین می شود.

154 الگوی ترسیم Gradient الگوی ترسیم Gradient دو رنگ متفاوت برای دو نقطه در نظر می گیرد و فاصله بین این دو نقطه با تغییر تدریجی یک رنگ به رنگ دیگر پر می کند. این الگو به دو صورت acyclic و cyclic قابل استفاده است.

155 متد سازنده GradientPaint به صورت زیر است.
GradientPaint(x1, y1, color1, x2, y2, color2, true); توجه داشته باشید که استفاده از آرگومان آخر متد اختیاری است. در صورتی که از این آرگومان استفاده شود الگوی ترسیم به صورت cyclic و در غیر این صورت acyclic خواهد بود. بعد از ایجاد شیء GradientPaint با استفاده از متد setPaint() الگوی ترسیم جاری را تغییر می دهیم. GradientPaint pat = new GradientPaint(0f, 0f, Color.white, 100f, 45f,Color.blue); Screen2D.setPaint(pat);

156 نكات نكته: خطوطی كه تا اينجا ملاحظه کردید یک پیکسل ضخامت داشتند، ولی در Java2D می توان عرض خطوط را نیز تعیین کرد. برای این منظور از متد setStroke() و کلاس BasicStroke() استفاده می شود. متد سازنده ی BasicStroke دارای سه آرگومان به شرح زیر می باشد. یک مقدار folat به عنوان پهنای خط با مقدار پیش فرض یک یک مقدار int برای تعیین دو سر خط یک مقدار int برای تعیین حالت اتصال دو خط به یکدیگر

157 عبارات زیر یک شیء BasicStroke ایجاد می کند و آن رابه عنوان قلم جاری در نظر می گیرد.
BasicStroke pen = BasicStroke(2.0f, BasicStroke.CAP_BUTT, BasicStroke.JOINROUND); Screen2D.setStroke(pen);

158 خطوط ایجاد خطوط در حالت دو بعدی با استفاده از کلاس Line2D.Float صورت می گیرد. این کلاس دارای چهار آرگومان به عنوان مختصات دو سر خط می باشد. Line2D.Float ln = new Line2D.Float(60F, 5F, 13F, 28F); نکته: اگر بعد از آرگومانها از کاراکتر F استفاده نشود، کامپایلر جاوا آنها را به عنوان int در نظر می گیرد.

159 چهارضلعی ایجاد مستطیل با استفاده از کلاسهای Rectangle2D.Float یا Rectangle2D.Double صورت می پذیرد. تفاوت این دو کلاس در نوع آرگومانهایشان است، در واقع کلاس Rectangle2D.Float آرگومانهای float و Rectangle2D.Double آرگومانهای double می پذیرد. کلاس Rectangle2D.Float چهار آرگومان می پذیرد این چهار آرگومان عبارتند از: x، y، width و height. Rectangle2D.Float rc = new Rectangle2D.Float(10F, 13F, 40F, 20F);

160 بیضی و دایره برای ایجاد بیضی و دایره از کلاس Ellipse2D.Float استفاده می شود. این کلاس دارای چهار آرگومان x، y، width و height می باشد. Ellipse2D.Float ee = new Ellipse2D.Float(113, 25, 22, 40);

161 کمان : Arc برای ایجاد کمان از کلاس Arc2D.Float استفاده می شود. این کلاس دارای هفت آرگومان به صورت زیر می باشد. Arc2D.Float Object_name = new Arc2D.Float(x, y, width, height, Start_degree, Traveled_degree, Closing_method); شش آرگومان اول را قبلاً بررسی کردیم، آرگومان هفتم نحوه ی خاتمه کمان را مشخص می کند. Arc2D.Float arc = new Arc2D.Float(27, 22, 30, 33, 90, Arc2D.PIE);

162 چند ضلعی برای ایجاد چند ضلعی ها ابتدا باید یک شیء از کلاس GeneralPath ایجاد کنیم. GeneralPath polly = new GeneralPath(); پس از آن با استفاده از متدmoveTo() اولین نقطه را ایجاد می کنیم. Polly.moveTo(5F, 0F); سپس با استفاده از متد lineTo() خطوط مورد نظر را ایجاد می کنیم. polly.lineTo(205F, 0F); polly.lineTo(205F, 90F); و در نهایت با استفاده از متد زیر مسیر را می بندیم. polly.closePath();

163 نکات و مثال برای ترسیم متن روی صفحه نمایش از متد drawstring با آرگومانهای float استفاده می شود. import java.awt.*; import java.awt.geom.*; public class Map2D extends java.applet.Applet { public void paint(Graphics screen) { Graphics2D screen2D = (Graphics2D)screen; setBackground(Color.blue); // Draw waves screen2D.setColor(Color.white); BasicStroke pen = new BasicStroke(2F, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND);

164 screen2D.setStroke(pen);
for (int ax = 10; ax < 340; ax += 10) for (int ay = 30; ay < 340 ; ay += 10) { Arc2D.Float wave = new Arc2D.Float(ax, ay, 10, 10, 0, 180, Arc2D.OPEN); screen2D.draw(wave); } // Draw Florida GradientPaint gp = new GradientPaint(0F,0F,Color.green, 50F, 50F, Color.orange,true); screen2D.setPaint(gp); GeneralPath fl = new GeneralPath();

165 fl.moveTo(10F,12F); fl.lineTo(234F,15F); fl.lineTo(253F,25F); fl.lineTo(261F,71F); fl.lineTo(344F,209F); fl.lineTo(336F,278F); fl.lineTo(295F,310F); fl.lineTo(259F,274F); fl.lineTo(205F,188F); fl.lineTo(211F,171F); fl.lineTo(195F,174F); fl.lineTo(191F,118F); fl.lineTo(120F,56F); fl.lineTo(94F,68F); fl.lineTo(81F,49F); fl.lineTo(12F,37F); fl.closePath(); screen2D.fill(fl);

166 // Draw ovals screen2D.setColor(Color.black); BasicStroke pen2 = new BasicStroke(); screen2D.setStroke(pen2); Ellipse2D.Float e1 = new Ellipse2D.Float(235,140,15,15); Ellipse2D.Float e2 = new Ellipse2D.Float(225,130,15,15); Ellipse2D.Float e3 = new Ellipse2D.Float(245,130,15,15); screen2D.fill(e1); screen2D.fill(e2); screen2D.fill(e3); }

167 ایجاد تصویر متحرک ایجاد تصاویر متحرک در زبان جاوا شامل مراحل زیر است
1. ترسیم متن، اشیاء، یا فایلهای تصویری 2. ارسال دستور نمایش ترسیمات به سیستم نمایش برنامه

168 کنترل تصاویر متحرک به کمک Threadها
تصاویر متحرک بهترین گزینه برای توضیح Threadها می باشد. با استفاده از Thread می توان بیش از یک وظیفه(Task) را درون برنامه اجرا کرد. با قرار دادن کد مربوط به بارگذاری انیمیشن درون Thread، بقیه ی قسمتهای برنامه از جزییات بارگذاری انیمیشن رهایی یافته و می توانند اعمال دیگری را انجام دهند. برای نوشتن اپلتها با استفاده از Threadها باید اعمال زیر را انجام دهیم.

169 نوشتن اپلتها با استفاده از Threadها
افزودن عبارت implement Runnable ایجاد یک شیء Thread Override کردن متد start() برای ایجاد اپلت و راه اندازی آن Override کردن متد stop() برای null کردن Thread در حال اجرا ایجاد متد run() که حاوی عباراتی است که باعث اجرای مکرر اپلت می شود. public class AppletName extends java.applet.Applet implements Runnable{ //Applet Core }

170 نكات کلاس Thread درون پکیج java.lang قرار دارد، به همین دلیل نیازی به استفاده از import برای بارگذاری آن نداریم. نکته: کلمه کلیدی Runnale برای ایجاد واسط استفاده می شود. در اینجا واسط Runnable توسط کلاسی که به عنوان Thread عمل می کند، پیاده سازی می شود. نکته: برای ایجاد یک Thread ابتدا باید متغیری از نوع Thread تعریف نماییم. Thread runner; تعریف این متغیر درون متد start() اپلت انجام می شود و تا زمانی که شیء آن ساخته نشده باشد، مقدار آن null است. برای ایجاد شیء Thread به صورت زیر عمل می کنیم.

171 ايجاد شي Thread public void start(){ if(runner == null){
runner = new Thread(this); runner.start(); } همان طور که ملاحظه می کنید اپلت را به شیء runner لینک کردیم. این عمل از طریق کلمه کلیدی this انجام می شود. حال باید متد run را به اپلت اضافه کنیم. public void run(){ //What your applet actually does comes here

172 مثال متد run() قلب اپلت شماست، از این متد برای ایجاد توالی تصاویر در فریمهای مختلف استفاده می شود. بعد از نوشتن کدهای لازم درون متد run باید ابتدا متد stop() را برای متوقف کردن Thread، override نماییم. برای متوقف کردن Thread آن را برابر null قرار می دهیم. import java.awt.Graphics; import java.awt.Font; import java.util.Date; public class DigitalClock extends java.applet.Applet implements Runnable { Font theFont = new Font("TimesRoman",Font.BOLD,24); Date theDate; Thread runner;

173 public void start() { if (runner == null) { runner = new Thread(this); runner.start(); } public void stop() { if (runner != null) { runner = null; public void run() { Thread thisThread = Thread.currentThread(); while (runner == thisThread) { repaint(); try {

174 Thread.sleep(1000); } catch (InterruptedException e) { } } public void paint(Graphics screen) { theDate = new Date(); screen.setFont(theFont); screen.drawString("" + theDate.toString(), 10, 50);

175 مثال import java.awt.Graphics; import java.awt.Font;
import java.util.Calendar; public class DigitalClock12 extends java.applet.Applet implements Runnable { Font theFont = new Font("TimesRoman",Font.BOLD,24); Calendar theDate; Thread runner; public void start() {

176 if (runner == null) { runner = new Thread(this); runner.start(); } public void stop() { if (runner != null) { runner = null;

177 public void run() { Thread thisThread = Thread.currentThread(); while (runner == thisThread) { repaint(); try { Thread.sleep(1000); } catch (InterruptedException e) { } }

178 public void paint(Graphics screen) {
theDate = Calendar.getInstance(); screen.setFont(theFont); screen.drawString("" + theDate.getTime(), 10, 50); }

179 نكات هنگامی که متد repaint() فراخوانی می شود این متد، متدupdate() را فراخوانی می کند. متد update() محتویات صفحه نمایش را پاک می کند و رنگ پشت زمینه را جایگزین آن می نماید و سپس متد paint() را صدا می زند، به همین دلیل نمایش انیمیشن دارای پرش خواهد بود. برای جلوگیری در پرش تصاویر هنگام نمایش انیمیشن دو راه وجود دارد. Override کردن متد update() به صورتی که صفحه نمایش را پاک نکند یا تنها قسمتهایی را که تغییر کرده است پاک نماید. Override کردن متد update()و paint() واستفاده از بافرینگ دو گانه (double buffering) توجه داشته باشید که روش اول ساده تر است ولی روش دوم کارائی بهتری دارد .

180 متد update() یک اپلت در حالت پیش فرض به صورت زیر است:
public void update (Graphics screen){ screen.setColor(getBackground()); screen.fillRect(0, 0, size().width, size.height()); screen.setColor(getForegrund()); paint(screen); }

181 مثال import java.awt.Graphics; import java.awt.Color;
import java.awt.Font; public class ColorSwirl extends java.applet.Applet implements Runnable { Font f = new Font("TimesRoman", Font.BOLD, 48); Color colors[] = new Color[50]; Thread runner; public void start() { if (runner == null) { runner = new Thread(this); runner.start(); }

182 public void stop() { runner = null; } public void run() { // initialize the color array float c = 0; for (int i = 0; i < colors.length; i++) { colors[i] = Color.getHSBColor(c, (float)1.0,(float)1.0); c += .02; // cycle through the colors int i = 0;

183 Thread thisThread = Thread.currentThread();
while (runner == thisThread) { setForeground(colors[i]); repaint(); i++; try { Thread.sleep(200); } catch (InterruptedException e) { } if (i == colors.length ) i = 0; } public void paint(Graphics screen) { screen.setFont(f); screen.drawString("Look to the Cookie!", 15, 50);

184 دریافت و استفاده از تصاویر
برای دریافت و استفاده از تصاویر ابتدا باید کلاس URL را که درون java.net می باشد، را import نمائیم و سپس یک شی از آن بسازیم. برای انجام این عمل به صورت زیر عمل می نمائیم. URL u = new URL(“ پس از آن از متد getImage() برای قرار دادن تصاویر درون شی Image استفاده می شود . این متد به یکی از صورتهای زیر استفاده می شود. getImage() با یک آرگومان که URL تصویر را مشخص می کند . getImage() با دو آرگومان. آرگومان اول URL تصویر و آرگومان دوم مسیر عکس یا فایل تصویری.

185 نكات : روش اول ساده تر و روش دوم انعطاف پذیرتر است.
نکته: کلاس Applet دارای دو متد برای ایجاد URL بدون اختصاص آدرس به آن درون برنامه می باشد. این دو متد عبارتند از: متدgetDocumentBase() این متد URLی را به ما باز می گر داند که محتوای آن آدرس پوشه ای است که فایل اپلت درون آن قرار دارد. متد :getCodeBase() شی URLی را به ما باز می گرداند که محتوای آن آدرس اپلت را می باشد. Image img = getImage(getDocumentBase(), book.gif); Image img = getImage(getDocumentBase(), image/book.gif);

186 ترسیم تصاویر بعد از ایجاد شی Image باید آن را نمایش دهید. برای انجام این عمل از متد darwImage() کلاس Graphics استفاده می شود. برای نمایش تصاویر با اندازه واقعی آن متدdrawImage() با چهار آرگومان زیر فراخوانی می شود. شی Image x y کلمه کلیدیthis public void paint (Grapics screen ){ screen.drawImage(img, 10, 10, this); }

187 برای نمایش تصاویربا اندازه دلخواه متد getImage با شش آرگومان زیر فراخوانی می شود
x y width height کلمه کلیدی this

188 مثال import java.awt.Graphics; import java.awt.Image;
public class Fillmore extends java.applet.Applet { Image whig; public void init() { whig = getImage(getCodeBase(), "images/fillmore.jpg"); } public void paint(Graphics screen) { int iWidth = whig.getWidth(this); int iHeight = whig.getHeight(this); int xPos = 10; // 25%

189 screen.drawImage(whig, xPos, 10, iWidth / 4, iHeight / 4, this);
// 100% xPos += (iWidth / 4) + 10; screen.drawImage(whig, xPos, 10, this); }

190 ایجاد انیمیشن با استفاده از تصاویر
ایجاد انیمیشن با استفاده از تصاویر نظیر ایجاد انیمیشن با استفاده از فونتها، رنگها و دیگر اشیاء می باشد. تنها تفاوتی که وجود دارد، نیاز به استفاده از فضایی جهت نگهداری تصاویر می باشد. ایجاد انیمیشن Neko: می خواهیم با استفاده از تصاویر انیمیشنی ایجاد کنیم.

191 ایجاد انیمیشن Neko قدم اول:
عکسهای مورد نظر را از سایت زیر download کنید. قدم دوم: نمایش یکی از تصاویر برای انجام این کار ابتدا تصاویر را درون یک آرایه ذخیره می کنیم و یک شیء به نام currentImg جهت نگهداری تصویری که می خواهیم نمایش دهیم، ایجاد می کنیم. Image nekoPics[] = new Image[9]; Image currentImg; به دلیل اینکه می خواهیم تصاویر در نقاط مختلف صفحه نمایش نمایان شوند، دو متغیر x و y را برای نگهداری مختصات تعریف می کنیم.

192 int x; int y = 50; با استفاده از متد init() تصاویر را درون آرایه nekoPics قرار می دهیم. public void init() { String nekoSrc[] = { "right1.gif", "right2.gif", "stop.gif", "yawn.gif", "scratch1.gif", "scratch2.gif","sleep1.gif", "sleep2.gif", "awake.gif" }; for (int i=0; i < nekoPics.length; i++) { nekoPics[i] = getImage(getCodeBase(), "images/" + nekoSrc[i]); }

193 قدم سوم: پس از بارگذاری تصاویر نوبت متحرک کردن تصاویر فرا می رسد. برای انجام این عمل از متد run() استفاده می کنیم. در برنامه Neko اعمال زیر انجام می شود. از سمت چپ صفحه نمایش شروع به دویدن می کند. وسط صفحه نمایش می ایستد و خمیازه می کشد. چهار بار عضلات خود را می کشد. می خوابد. از خواب بیدار شده و به سمت راست صفحه نمایش دویده و از آنجا خارج می شود.

194 هر کدام از این اعمال درون یک تابع تعریف می شودف این امر باعث می شود که انجام اعمال تکرار پذیر باشند. این متدها عبارتند از: 1 - ) متد nekoRun(): این متد دارای دو آرگومان start و end می باشد. به کمک این آرگومانها محل شروع دویدن و خاتمه آن را تعیین می کنیم. void nekoRun(int start, int end) { //Method Core Comes Here } برای القای حرکت گربه مختصات تصویر را تغییر می دهیم، و برای تغییر محتوای تصویر محتوای شیء currentImg را تغییر خواهیم داد. و در نهایت برای ترسیم مجدد از متد repaint() استفاده می کنیم. آخرین عملی که باید درون متد nekoRun() انجام شود، متوقف کردن حلقه ی for قبل از بارگذاری تصویر جدید می باشد. برای انجام این عمل از متد زیر استفاده می کنیم. void pause(int time) { try { Thread.sleep(time); } catch (InterruptedException e) { }

195 2 - ) متد nekoRun() به صورت زیر می باشد.
void nekoRun(int start, int end) { for (int i = start; i < end; i += 10) { x = i; // swap images if (currentImg == nekoPics[0]) currentImg = nekoPics[1]; else currentImg = nekoPics[0]; repaint(); pause(150); } متد paint() اپلت به صورت زیر است. public void paint(Graphics screen) { if (currentImg != null) screen.drawImage(currentImg, x, y, this);

196 نكته اعمالی که فقط یک فریم هسنتد را درون متد run() می نویسیم.
در اینجا نوبت انجام اعمال زیر می باشد. تغییر تصویر درون متغیر currentImg فراخوانی متد repaint() متوقف کردن اپلت برای یک محدوده زمانی مشخص // stop and pause currentImg = nekoPics[2]; repaint(); pause(1000); // yawn currentImg = nekoPics[3];

197 3 - ) متد nekoScratch(): حال باید قسمت مربوط به کشش عضلات را پیاده سازی کنیم. برای این کار متد nekoScratch() را ایجاد می کنیم. این متد دارای یک آرگومان می باشد که بیانگر تعداد دفعات کشش عضلات می باشد. void nekoScratch(int numTimes) { for (int i = numTimes; i > 0; i--) { currentImg = nekoPics[4]; repaint(); pause(150); currentImg = nekoPics[5]; }

198 4 - ) متد nekoSleep(): از این متد جهت پیاده سازی قسمت مربوط به خوابیدن استفاده می شود.
void nekoSleep(int numTimes) { for (int i = numTimes; i > 0; i--) { currentImg = nekoPics[6]; repaint(); pause(250); currentImg = nekoPics[7]; }

199 حال گربه مورد نظر از خواب بلند می شود و به سمت راست صفحه نمایش رفته و از آنجا خارج می شود.
currentImg = nekoPics[8]; repaint(); pause(500); nekoRun(x, size().width + 10); در اینجا بررسی برنامه خاتمه یافته و کل آن را یک جا ذکر می کنیم.

200 مثال import java.awt.Graphics; import java.awt.Image;
import java.awt.Color; public class Neko extends java.applet.Applet implements Runnable { Image nekoPics[] = new Image[9]; Image currentImg; Thread runner; int x; int y = 50; public void init() {

201 String nekoSrc[] = {"right1. gif", "right2. gif", "stop. gif", "yawn
String nekoSrc[] = {"right1.gif", "right2.gif", "stop.gif", "yawn.gif", “scratch1.gif", scratch2.gif","sleep1.gif", "sleep2.gif","awake.gif" }; for (int i=0; i < nekoPics.length; i++) { nekoPics[i] = getImage(getCodeBase(), "images/" + nekoSrc[i]); }

202 public void start() { if (runner == null) { runner = new Thread(this); runner.start(); } public void stop() { runner = null; public void run() { setBackground(Color.white); // run from one side of the screen to the middle nekoRun(0, size().width / 2);

203 // stop and pause currentImg = nekoPics[2]; repaint(); pause(1000); // yawn currentImg = nekoPics[3]; // scratch four times nekoScratch(4); // sleep for 5 "turns" nekoSleep(5); // wake up and run off currentImg = nekoPics[8]; pause(500); nekoRun(x, size().width + 10);

204 } void nekoRun(int start, int end) { for (int i = start; i < end; i += 10) { x = i; // swap images if (currentImg == nekoPics[0]) currentImg = nekoPics[1]; else currentImg = nekoPics[0]; repaint(); pause(150);

205 void nekoScratch(int numTimes) {
for (int i = numTimes; i > 0; i--) { currentImg = nekoPics[4]; repaint(); pause(150); currentImg = nekoPics[5]; } void nekoSleep(int numTimes) { currentImg = nekoPics[6]; pause(250);

206 currentImg = nekoPics[7];
repaint(); pause(250); } void pause(int time) { try { Thread.sleep(time); } catch (InterruptedException e) { } public void paint(Graphics screen) { if (currentImg != null) screen.drawImage(currentImg, x, y, this);

207 نکته : با وجود اینکه در زبان جاوا آزاد کردن فضای حافظه اختصاص داده شده به اشیاء به طور اتوماتیک انجام می شود، ولی این مسئله در مورد اشیاء Graphics صادق نیست. بنابر این برای آزاد شدن فضای حافظه اختصاص داده شده به این شیء به صورت زیر عمل می کنیم. public void destroy(){ offscreenGraphics.dispose(); }

208 بافرینگ دوگانه :Double Buffering
در صورت استفاده از بافرینگ دوگانه ابتدا کل فریم یک انیمیشن را در ناحیه ای نامریی ایجاد می کند و سپس آن را درون پنجره برنامه کپی می کند. برای پیاده سازی بافرینگ دوگانه ابتدا باید تصویر offscreen و محتوای Graphics را در دو متغیر نمونه قرار داد، و سپس آنها را به متد paint() ارسال کرد. Image offscreenImage; Graphics offscreen; سپس در هنگام مقدار دهی اولیه اپلت اشیایی از این دو کلاس ایجاد نموده و آنها را درون متغیرهای نمونه تعریف شده قرار می دهیم. offscreenImage = createImage(size().width, size().height); offscreen = offscreenImage.getGraphics();

209 سپس برای ترسیم تصاویر به روش زیر عمل می کنیم.
offscreen.drawImage(bug, 10, 10, this); screen.drawImage(offscreenImage, 0 , 0, this); نکته: می توانید متد update() را override نمایید، تا صفحه نمایش بین دو عمل ترسیم پاک نشود. public void update(Graphics g){ paint(g); }

210 مثال import java.awt.*; public class Checkers extends java.applet.Applet implements Runnable { Thread runner; int xPos = 5; int xMove = 4; Image offscreenImg; Graphics offscreen; public void init() { offscreenImg = createImage(size().width, size().height); offscreen = offscreenImg.getGraphics(); }

211 public void start() { if (runner == null); { runner = new Thread(this); runner.start(); } public void stop() { runner = null; public void run() { Thread thisThread = Thread.currentThread(); while (runner == thisThread) { xPos += xMove; if ((xPos > 105) | (xPos < 5)) xMove *= -1;

212 repaint(); try { Thread.sleep(100); } catch (InterruptedException e) { } } public void update(Graphics screen) { paint(screen); public void paint(Graphics screen) { // Draw background

213 offscreen.setColor(Color.black);
offscreen.fillRect(0,0,100,100); offscreen.setColor(Color.white); offscreen.fillRect(100,0,100,100); // Draw checker offscreen.setColor(Color.red); offscreen.fillOval(xPos,5,90,90); screen.drawImage(offscreenImg, 0, 0, this); } public void destroy() { offscreen.dispose();

214 بارگذاری و پخش از فایلهای صوتی
برای بارگذاری و پخش فایلهای صوتی در اپلتها از متد play() استفاده می شود. متد paly() به دو روش قابل استفاده است. با یک آرگومان(URL فایل صوتی) با دو آرگومان(URL فایل صوتی و مسیر آن) play(getCodeBase(), “zap.au”); نکته: با استفاده از متدهای getDocumentBase() و getCodeBase() به عنوان آرگومان متد play() میتوان مسیر فایل اصلی اپلت را به تابع مذکور ارسال کرد.

215 نکات برای پخش مکرر فایل صوتی، start و stop کردن آن یا تعیین دفعات پخش فایل صوتی آن را درون شیء AudioClip قرار می دهیم. انجام این عمل با استفاده از متد getAudioClip() امکان پذیر است. آرگومانهای این متد نیز مانند متد play() می باشد. AudioClip = getAudioClip (getCodeBase(), “audio/marimba.wav”) نکته: در صورتی که بخواهید درون یک Application از فایلهای صوتی استفاده نمائید، باید به صورت زیر عمل کنید AudioClip clip = new AudioClip (audio/marimba.wav ) ; پس ازایجاد شیء AudioClip می توانید آن را با استفاده از متدهای loop(),stop(),play() کنترل کنید

216 مثال import java.awt.Graphics; import java.applet.AudioClip;
public class AudioLoop extends java.applet.Applet implements Runnable { AudioClip bgSound; AudioClip beep; Thread runner; public void start() { if (runner == null) { runner = new Thread(this); runner.start(); }

217 public void stop() { if (runner != null) { if (bgSound != null) bgSound.stop(); runner = null; } public void init() { bgSound = getAudioClip(getCodeBase(),"loop.au"); beep = getAudioClip(getCodeBase(), "beep.au"); public void run() { bgSound.loop(); Thread thisThread = Thread.currentThread(); while (runner == thisThread) { try {

218 Thread.sleep(5000); } catch (InterruptedException e) { } if (beep != null) beep.play(); } public void paint(Graphics screen) { screen.drawString("Playing Sounds ...", 10, 10);

219 نکته در صورتی که یک فایل صوتی به صورت مکرر پخش شود .عمل پخش آن با متوقف شدن Thread اپلت متوقف نمی شود. برای حل این مشکل از متد stop() استفاده می نمائیم

220 Awt AWT شامل مجموعه ای از کلاسها برای ایجاد واسط کاربر و دریافت ورودی از طریق mouse و صفحه کلید می باشد. هنگام استفاده از AWT واسط کاربر شامل سه گزینه زیر می باشد: Components: اشیاء مختلفی که می توانند درون واسط کاربر قرار گیرند. Containers: Componentی که شامل Component های دیگر است. :Layout Manager شیئی که نحوه نمایش Componentها را درون Container تعیین می نماید . کلاسهای AWT همگی درون java.awt قرار دارند .

221 افزودن Component ها به Container
فراخوانی متد add() کلاس Container با آرگومان Component ایجاد شده. نکته: افزودن یک Component به یک Container موجب نما یش آن نخواهد شد. برای نمایان شدن یک Component باید متد paint() توسط متد repaint() فراخوانی شود.

222 افزودن CommandButton مثال1: import java.awt.*;
public class AudioLoop extends java.applet.Applet { String note = "I am extremely tired and would prefer not " + "to be clicked"; Button tired = new Button(note); public void init() { add(tired); }

223 مثال2: import java.awt.*; public class VCR extends java.applet.Applet { Button rewind = new Button("Rewind"); Button play = new Button("Play"); Button ff = new Button("Fast Forward"); Button stop = new Button("Stop"); Button eat = new Button("Eat Tape"); public void init() { add(rewind); add(play); add(ff); add(stop); add(eat); }

224 افزودن Label نکته: Labelها بلا فاصله پس از ایجاد شدن نمایان خواهند شد ونیازی فراخوانی متد paint() ندارند. مثال : import java.awt.*; public class Labels extends java.applet.Applet { Label lefty = new Label("Bleeding heart!"); Label center = new Label("Centrist!", Label.CENTER); Label righty = new Label("Hardliner!", Label.RIGHT); Font lf = new Font("Helvetica", Font.BOLD, 14); GridLayout layout = new GridLayout(3,1); public void init() { setFont(lf); setLayout(layout); add(lefty); add(center); add(righty); }

225 افزودن Checkbox: مثال :import java.awt.*;
public class CheckACzech extends java.applet.Applet { Checkbox c1 = new Checkbox("Milos Forman"); Checkbox c2 = new Checkbox("Paulina Porizkova"); Checkbox c3 = new Checkbox("Ivan Reitman"); Checkbox c4 = new Checkbox("Tom Stoppard"); Checkbox c5 = new Checkbox("Ivana Trump"); public void init() { add(c1); c2.setState(true); add(c2); add(c3); add(c4); add(c5); }

226 افزودن RadioButton مثال: import java.awt.*;
public class AudioLoop extends java.applet.Applet { CheckboxGroup p = new CheckboxGroup(); Checkbox p1 = new Checkbox("Samuel Goldwyn", p, false); Checkbox p2 = new Checkbox("Krzysztof Kieslowski", p, true); Checkbox p3 = new Checkbox("Klaus Kinski", p, false); Checkbox p4 = new Checkbox("Joanna Pacula", p, false);

227 Checkbox p5 = new Checkbox("Roman Polanski", p, false);
public void init() { add(p1); add(p2); add(p3); add(p4); add(p5); }

228 افزودن ComboBox(ChoiceList)
مثال: import java.awt.*; public class SelectASpaniard extends java.applet.Applet { Choice span = new Choice(); public void init() { span.addItem("Pedro Almodóvar"); span.addItem("Antonio Banderas"); span.addItem("Charo"); span.addItem("Xavier Cugat"); span.addItem("Julio Iglesias"); add(span); }

229 افزودن TextBox(TextField)
مثال: import java.awt.*; public class OutOfSite extends java.applet.Applet { Label siteLabel = new Label("Site Name: "); TextField site = new TextField(25); Label addressLabel = new Label("Site Address: "); TextField address = new TextField(25); Label passwordLabel = new Label("Admin Password: "); TextField password = new TextField(25); public void init() { }

230 add(siteLabel); add(site); add(addressLabel); add(address); add(passwordLabel); password.setEchoCharacter('*'); add(password); }

231 افزودن TextArea مثال: import java.awt.*;
public class Virginia extends java.applet.Applet { String letter = "Dear Editor:\n" + "I am 8 years old.\n" +"Some of my little friends say there is no Santa Claus." +" Papa\n" + "says, ''If you see it in The Sun it's so.'' Please tell" + " me the truth,\n" + "is there a Santa Claus?\n\n" + "Virginia O'Hanlon\n" + "115 West 95th Street\n" + "New York"; TextArea lt; public void init() { lt = new TextArea(letter, 10, 50); add(lt); }

232 افزودن ScrollBar & Slider
مثال: import java.awt.*; public class Slider extends java.applet.Applet { GridLayout gl = new GridLayout(1,1); Scrollbar bar = new Scrollbar(Scrollbar.HORIZONTAL, 50, 0, 1, 100); public void init() { setLayout(gl); add(bar); }

233 افزودن Canvas مثال: import java.awt.*;
public class Crosshair extends java.applet.Applet { GridLayout gl = new GridLayout(1,1); MyCanvas can = new MyCanvas(); public void init() { setLayout(gl); add(can); }

234 class MyCanvas extends java.awt.Canvas {
public void paint(Graphics g) { int x = size().width / 2; int y = size().height / 2; g.setColor(Color.black); g.drawLine(x-10, y, x-2, y); g.drawLine(x+10, y, x+2, y); g.drawLine(x, y-10, x, y-2); g.drawLine(x, y+10, x, y+2); }

235 تعیین layout برای تعیین نحوه ی نمایش componentها در پنجره ی اپلت از Layout استفاده می شود. AWT شامل پنج نوع Layout به شرح زیر می باشد. FlowLayout(default) GridLayout GridBagLayout BorderLayout CardLayout برای استفاده از یک Layout ابتدا باید یک شی از نوع آن Layout ایجاد نمود. FlowLayout layout = new FlowLayout(); پس از ایجاد Layout با استفاده از متد SetLayout() آن را به عنوان Layout جاری سیستم در نظر می گیریم. پس از تعیین Layout جاری برنامه می توان Componentها را به پنجره Container افزود.

236 FlowLayout اگر از این Layout استفاده کنید، Componentها پشت سر هم چیده خواهند شد. در صورتی که متد سازنده ی FlowLayout() بدون آرگومان فراخوانی شود. Componentها وسط سطرها درج می شوند. اگر می خواهید Componentها در سمت چپ یا راست درج شوند از آرگومانهای FlowLayout.LEFT یا FlowLayout.RIGHT استفاده کنید.

237 مثال import java.awt.*; public class Alphabet extends java.applet.Applet { Button a = new Button("Alibi"); Button b = new Button("Burglar"); Button c = new Button("Corpse"); Button d = new Button("Deadbeat"); Button e = new Button("Evidence"); Button f = new Button("Fugitive"); FlowLayout lm = new FlowLayout(FlowLayout.LEFT);

238 public void init() { setLayout(lm); add(a); add(b); add(c); add(d); add(e); add(f); } متد سازنده FlowLayout() در حالت پیش فرض بین هر Component با Component بعدی سه پیکسل فاصله می گذارد (این مسئله در مورد سطرها هم صادق است). در صورتی که بخواهیم فاصله پیش فرض را تغییر دهیم، به صورت زیر عمل می کنیم. FlowLayout layout = new FlowLayout(FlowLayout.LEFT, 10, 30);

239 GridLayout در صورتی که از این Layout استفاده کنید، Componentها به حالت Grid پشت سر هم قرار خواهند گرفت. در صورتی که متد سازنده ی GridLayout() دارای چهار آرگومان می باشد. آرگومان اول بیانگر تعداد سطرها، آرگومان دوم بیانگر تعداد ستونها، آرگومان سوم بیانگر فاصله ی بین Componentها و آرگومان چهارم بیانگر فاصله بین سطرها می باشد. GridLayout gr = new GridLayout(10, 3, 5, 8); نکته: فاصله پیش فرض در GridLayout صفر می باشد.

240 مثال import java.awt.*; public class Bunch extends java.applet.Applet { GridLayout family = new GridLayout(3,3,10,10); Button marcia = new Button("Marcia"); Button carol = new Button("Carol"); Button greg = new Button("Greg"); Button jan = new Button("Jan"); Button alice = new Button("Alice"); Button peter = new Button("Peter"); Button cindy = new Button("Cindy"); Button mike = new Button("Mike"); Button bobby = new Button("Bobby");

241 public void init() { setLayout(family); add(marcia); add(carol); add(greg); add(jan); add(alice); add(peter); add(cindy); add(mike); add(bobby); }

242 BorderLayout این Layout، Container را به پنج قسمت شمال، جنوب، شرق، غرب و مرکز تقسیم می کند. متد سازنده این کلاس به دو صورت قابل دسترسی می باشد. بدون آرگومان :در این حالت Componentها بدون فاصله درج خواهند شد. BorderLayout(); با دو آرگومان : در این حالت آرگومان اول تعیین کننده فاصله افقی و آرگومان دوم تعیین کننده فاصله عمودی خواهد بود. BorderLayout(int, int); به منظور افزودن یک Component به Container باید به صورت زیر عمل کنیم add(String, Component) آرگومان اول(String) می تواند دارای یکی از مقادیر North، South، East، West یا Center باشد و بیانگر محل قرار گرفتن Component می باشد .

243 مثال import java.awt.*; public class Border extends java.applet.Applet { BorderLayout b = new BorderLayout(); Button north = new Button("North"); Button south = new Button("South"); Button east = new Button("East"); Button west = new Button("West"); Button center = new Button("Center"); public void init() { setLayout(b); add("North", north); add("South", south); add("East", east); add("West", west); add("Center", center); }

244 نکته در صورتی که بخواهیم از چند Layoutمتفاوت در یک برنامه استفاده کنیم، باید Containerهای اضافی به Container اصلی (در اینجا پنجره Applet) اضافه کنیم به عنوان مثال می توان از Panelها که برای گروه بندی Componentها به کار می روند استفاده کرد .هنگام استفاده از Panelها به موارد زیر توجه کنید: افزودن Component ها بهPanel قبل از افزودن Panel به Containerبزرگتر باشد. هر Panel دارای Layout جداگانه است. برای ایجاد یک شی Panel به صورت زیر عمل می کنیم. Panel pane = new Panel(); و برای تعیین Layout یک Panel از قطعه کد زیر استفاده می کنیم. BorderLayout bo = new BorderLayout(); pane.setLayout (bo); توجه داشته باشید Componentهایی که به Panelها می افزاییم، درون Container های دیگر نظیر Appletها هم قابل دسترسی هستند. برای افزودن یک Component به Panel به صورت زیر عمل می کنیم. pane.add(dialogue);

245 CardLayout این Layoutشامل تعدادی Container یا Component می باشد ، که در یک لحظه فقط یکی از آنها قابل رویت است . روش معمولی برای استفاده از CardLayout استفاده از یک Panel برای هر کارت می باشد. Componentها به Panelاول اضافه می کنیم و سپس Panel به Container اضافه می شود. برای ایجاد یک شی CardLayout به صورت زیر عمل می کنیم : CardLayout cc = new CardLayout (); متد زیر برای تعیین این Layout به عنوان Layout جاری سیستم استفاده می شود . setLayout (cc);

246 برای افزودن card ها از متد add استفاده می کنیم .
add (String, Component); add( String, Container) نکته: قبل از افزودن یک (card)Container باید تمام Componentهای لازم به آن add شود. بعد از افزودن Containerها برای نمایش هرکدام می توان ازمتد show() استفاده کرد .این متد دارای دو آرگومان به شرح زیر می باشد. Container شامل تمام کارت ها.در صورتی که Container مذکور Applet باشد می توان از کلمه کلیدی this استفاده کرد. نام کارت

247 مثال import java.awt.*; public class BurmaShave extends java.applet.Applet implements Runnable { CardLayout card = new CardLayout(); Label[] lab = new Label[6]; int current = 0; Thread runner; public void start() { if (runner == null) { runner = new Thread(this); runner.start(); } public void stop() { runner = null;

248 public void init() { lab[0] = new Label("Grandpa's beard"); lab[1] = new Label("Was stiff and coarse."); lab[2] = new Label("And that's what caused"); lab[3] = new Label("His fifth"); lab[4] = new Label("Divorce."); lab[5] = new Label("Burma Shave."); setLayout(card); for (int i = 0; i < 6; i++) add("Card " + i, lab[i]); }

249 public void run() { Thread thisThread = Thread.currentThread(); while (runner == thisThread) { card.show(this, "Card " + current); current++; if (current > 5) current = 0; repaint(); try { Thread.sleep(5000); } catch (InterruptedException e) { } }

250 GridBagLayout تفاوت این GridLayout Layout به شرح زیر است :
یک Component می تواند بیش از یک سلول درونGrid را اشغال کند. فاصله بین خطوط یا Componentها می تواند متفاوت باشد. Componentها را می توان به طرق مختلف درون Grid قرار داد. برای ایجاد GridBagLayout از کلاسهای GridBagConstraintو GridBagLayout استفاده می شود. کلاس GridBagConstraint برای تعیین مشخصات Componentهای درون Grid استفاده می شود. در حالت کلی ایجاد Grid Bag Layout شامل مراحل زیر است: ایجاد شیء GridBagLayout و تعیین آن به عنوان Layout جاری سیستم. ایجاد شیء GridBagConstraint تعیین constraintهای هر Component اعمال constraintهای هر Component به Layout افزودن Component به Constraint

251 قدم اول: طراحی Grid قبل از شروع کد نویسی Grid مورد نظر خود را روی کاغذ ترسیم کنید. قدم دوم: ایجاد Grid برای ایجاد Grid ابتدا متد buildConstraint فراخوانی می شود، این متد دارای هفت آرگومان می باشد عملکرد این متد به صورت زیر است. void buildConstraints(GridBagConstraints gbc, int gx, int gy, int gw, int gh, int wx, int wy) { gbc.gridx = gx; gbc.gridy = gy; gbc.gridwidth = gw; gbc.gridheight = gh; gbc.weightx = wx; gbc.weighty = wy; }

252 متد init() اپلت را به صورت زیر override می کنیم.
public void init() { GridBagLayout gridbag = new GridBagLayout(); GridBagConstraints constraints = new GridBagConstraints(); setLayout(gridbag); // Name label buildConstraints(constraints, 0, 0, 1, 1, 100, 100); constraints.fill = GridBagConstraints.BOTH; Button label1 = new Button("Name:"); gridbag.setConstraints(label1, constraints); add(label1); }

253 بعد از اختصاص Constraints به یک Component می توان از شیء GridBagConstraints برای اختصاص Constraintsهای Componentهای دیگر استفاده کرد. در مجموع باید 4 بار دیگر از متد buildConstraint( ) به صورت زیر استفاده کنیم buildConstraints(constraints, 1, 0, 1, 1, 100, 100); buildConstraints)constraints,0, 1, 1, 1, 100, 100); buildConstraints)constraints, 1, 1, 1, 1, 100, 100); buildConstraints)constraints, 0, 2, 2, 1, 100, 100); قدم سوم: تعیین ابعاد قدم بعدی تعیین ابعاد سطرها وستونها می باشد. برای مثل ممکن است بخواهید قسمت Password, user name ابعاد کمتری نسبت به textbox داشته باشند و دکمه ok ارتفاع کمتری نسبت به textbox ها داشته باشد تععن ابعاد به کمک مشخصه های weighty, weightx انجام می شود.

254 نکته مجموع مشخصه هایweightx وweighty باید 100 شود.
به متد های buildConstraints ( ) که قبلاٌ ایجاد کردیم، توجه کنید. buildConstraints(constraints, 0, 0, 1, 1, 100, 100); buildConstraints(constraints, 1, 0, 1, 1, 100, 100); buildConstraints)constraints, 0, 1, 1, 1, 100, 100); buildConstraints)constraints, 1, 1, 1, 1, 100, 100); buildConstraints)constraints, 0, 2, 2, 1, 100, 100); حال تغییرات لازم را به مشخصه weightx اعمال می کنیم BuildConstraints(constraints, 0, 0, 1, 1, 10, 100);//name BuildConstraints(constraints, 1, 0, 1, 1, 90, 100);//nameText به دلیل اینکه سهم هر Component مشخص شد در متدهای بعدی جای تعیین سهم عدد صفر منظور می شود .

255 قدم جهارم: افزودن وتنظیم Componentها
برای انجام این عمل یکی از چهار مقدار زیر را به کلاس fill نسبت داده می شود. Component :GridBagConstraints.BOTH رادرهردوجهت(ارتفاع وعرض) گسترش می دهد، تا تمام سلول ها را پر نماید. GridBagConstraints.NONE: باعث می شود تا Component با کوچکترین اندازه ممکن نشان داده شود. GridBagConstraints.HORIZONTAL: گسترش Componentدر امتداد افقی انجام می شود. GridBagConstraints.VERTICAL : گسترش Componentدر امتداد عمودی انجام می شود.

256 نکته مقدار پیش فرض این مشخصه GridBagConstraints.NONE می باشد.
برایComponent هایی که تمام سلول را اشغال نکرده مقادیر دیگری به شرح زیر موجوداست .این مقادیر مشخصه anchorنسبت داده می شوند. این مقادیر موقعیت قرار گرفتن Componentرا درون سلول مشخص می کند. GridBagConstraints.NORTH GridBagConstraints.NORTHEAST GridBagConstraints.SOUTH GridBagConstraints.SOUTHEAST GridBagConstraints.EAST GridBagConstraints.NORTHWEST GridBagConstraints.WEST GridBagConstraints.SOUTHWEST مقدار پیش فرض این مشخصه GridBagConstraint.CENTER می باشد.

257 اعمال تنظیمات import java.awt.*;
public class NamePass extends java.applet.Applet { void buildConstraints(GridBagConstraints gbc, int gx, int gy, int gw, int gh, int wx, int wy) { gbc.gridx = gx; gbc.gridy = gy; gbc.gridwidth = gw; gbc.gridheight = gh; gbc.weightx = wx; gbc.weighty = wy; }

258 public void init() { GridBagLayout gridbag = new GridBagLayout(); GridBagConstraints constraints = new GridBagConstraints(); setLayout(gridbag); // Name label buildConstraints(constraints, 0, 0, 1, 1, 10, 40); constraints.fill = GridBagConstraints.NONE; constraints.anchor = GridBagConstraints.EAST; Label label1 = new Label("Name:", Label.LEFT); gridbag.setConstraints(label1, constraints); add(label1); // Name text field buildConstraints(constraints, 1, 0, 1, 1, 90, 0); constraints.fill = GridBagConstraints.HORIZONTAL; TextField tfname = new TextField();

259 gridbag.setConstraints(tfname, constraints);
add(tfname); // password label buildConstraints(constraints, 0, 1, 1, 1, 0, 40); constraints.fill = GridBagConstraints.NONE; constraints.anchor = GridBagConstraints.EAST; Label label2 = new Label("Password:", Label.LEFT); gridbag.setConstraints(label2, constraints); add(label2); // password text field buildConstraints(constraints, 1, 1, 1, 1, 0, 0); constraints.fill = GridBagConstraints.HORIZONTAL; TextField tfpass = new TextField();

260 tfpass.setEchoCharacter('*');
gridbag.setConstraints(tfpass, constraints); add(tfpass); // OK Button buildConstraints(constraints, 0, 2, 2, 1, 0, 20); constraints.fill = GridBagConstraints.NONE; constraints.anchor = GridBagConstraints.CENTER; Button okb = new Button("OK"); gridbag.setConstraints(okb, constraints); add(okb); }

261 مدیریت رویداد : Event Handing
برای تعامل با واسط کاربر باید رویدادهارا به دسترسی مدیریت نماییم.رویداد ها بسته به عمل کاربر سیستم تولید می شوند.

262 انواع رویداد : Types of Events
رویداد کلیک Mouse: این رویداد به نوع خود شامل انواع MouseDown(فشردن دکمه mouse)، MouseUp(رها کردن دکمه mouse) MouseClicked(فشردن ورها کردن دکمه mouse) می باشد. رویداد حرکت (Mouse Movement)Mouse: این رویداد به نوبه خود شامل انواع ورود و خروج مکان نمای mouse به واسط Component و mouse dard می باشد. فشردن دکمه های صفحه کلید(Keypresses): این رویداد به نوبه خود شامل فشردن دکمه های صفحه کلید، رها کردن دکمه های صفحه کلید و فشردن و رها کردن دکمه های صفحه کلید می باشد. رویدادهای واسط کاربر (User Interface Events): این رویداد به نوبه خود شامل کلیک دکمه(Button Click)، تغییر وضعیت (Scrollbar Up and Down)Scrollbar ظاهر شدن منوی (popup menuts) popup و ... می باشد .

263 مدیریت رویداد کلیک Mouse
1 ) رویداد MouseDown و MouseUp: وقتی کاربر روی mouse کلیک می کند، دو رویداد به وقوع می پیوندد. این دو رویداد عبارتند از:mouseDown (وقتی دکمه فشرده می شود) و mouseUp(زمانی که دکمه رها می شود) مدیریت رویدادها از طریق override کردن متدهای مربوط به رخدادها انجام می شود. برای مثال به متد زیر توجه کنید. public boolean mouseDown(Event evt, int x, int y){ //Method’s Core Comes here } همان طور که ملاحظه می کنید متدهای mouseDown() و mouseUp() دارای سه آرگومان به شرح زیر می باشد. Event eve: این آرگومان شیء از کلاس Event است که حاوی رویداد مربوطه است. int x و int y: این دو آرگومان مختصات نقطه وقوع رویداد را در خود نگه می دارند.

264 مثال public boolean mouseDown(Event evt, int x, int y){
System.out.println(“Mouse down at” + x + “,” + y); }

265 2 ) رویداد MouseUp: نیمه دیگر کلیک متد mouseUp() می باشد این متد زمانی که دکمه mouse رها می شود، فراخوانی می گردد. برای مدیریت رویداد mouseUp باید متد mouseUp() را override کنیم. public boolean mouseUp(Event evt, int x, int y){ //Method’s Core Comes here }

266 مثال import java.awt.Graphics; import java.awt.Color;
import java.awt.Event; public class Spots extends java.applet.Applet { final int MAXSPOTS = 10; int xspots[] = new int[MAXSPOTS]; int yspots[] = new int[MAXSPOTS]; int currspots = 0; public void init() { setBackground(Color.white); }

267 public boolean mouseDown(Event evt, int x, int y) {
if (currspots < MAXSPOTS) { addspot(x,y); return true; } else { System.out.println("Too many spots."); return false; void addspot(int x,int y) { xspots[currspots] = x; yspots[currspots] = y; currspots++; repaint();

268 public void paint(Graphics g) {
g.setColor(Color.blue); for (int i = 0; i < currspots; i++) { g.fillOval(xspots[i] - 10, yspots[i] - 10, 20, 20); }

269 مدیریت رویداد Double Click
برای کنترل تعداد کلیک mouse به این صورت عمل می کنیم. public boolean mouseDown(Event evt, int x, int y) { switch(evt.clickCount){ case1://Single click case2://Double click case3://Triple click //… } مثال: public boolean mouseDown(Event evt, int x, int y){ System.out.println(“Click count:” + evt.clickCount);

270 مدیریت رویداد جابجایی Mouse
MouseDrag: جابجایی mouse در حالتی که دکمه mouse فشرده شده است. public boolean mouseDrag(Event evt, int x, int y){ //Method’s Core Comes Here } mouseMove: جابجایی mouse بدون اینکه دکنه آن فشرده شده باشد. public boolean mouseMove(Event evt, int x, int y){ توجه داشته باشید که آرگومانهای x و y متدهای mouseMove و mouseDrag مختصات موقعیت نهایی مکان نمایmouse را در خود نگه می دارند.

271 public boolean mouseExit(Event evt, int x, int y){
MouseEnter: با ورود مکان نمای mouse به پنجره ی اپلت متد مربوط به این رویداد فراخوانی می شود. public boolean mouseEnter(Event evt, int x, int y){ //Method’s Core Comes Here } MouseExit : با ورود مکان نمای mouse به پنجره ی اپلت متد مربوط به این رویداد فراخوانی می شود. public boolean mouseExit(Event evt, int x, int y){

272 مثال import java.awt.Graphics; import java.awt.Color;
import java.awt.Event; import java.awt.Point; public class Lines extends java.applet.Applet { final int MAXLINES = 10; Point starts[] = new Point[MAXLINES]; // starting points Point ends[] = new Point[MAXLINES]; // ending points Point anchor; // start of current line Point currentpoint; // current end of line int currline = 0; // number of lines public void init() { setBackground(Color.white); }

273 public boolean mouseDown(Event evt, int x, int y) {
if (currline < MAXLINES) { anchor = new Point(x,y); return true; } else { System.out.println("Too many lines."); return false; public boolean mouseUp(Event evt, int x, int y) { addline(x,y); else return false;

274 public boolean mouseDrag(Event evt, int x, int y) {
if (currline < MAXLINES) { currentpoint = new Point(x,y); repaint(); return true; } else return false; void addline(int x,int y) { starts[currline] = anchor; ends[currline] = new Point(x,y); currline++; currentpoint = null; anchor = null;

275 public void paint(Graphics g) {
// Draw existing lines for (int i = 0; i < currline; i++) { g.drawLine(starts[i].x, starts[i].y, ends[i].x, ends[i].y); } // draw current line g.setColor(Color.blue); if (currentpoint != null) g.drawLine(anchor.x,anchor.y, currentpoint.x,currentpoint.y);

276 مدیریت رویدادهای صفحه کلید
برای اینکه یک Component بتواند رویدادهای صفحه کلید را دریافت کند، باید getFocus شده باشد. به عبارت دیگر Component مذکور باید Componentی باشد که برای دریافت وروردی انتخاب شده است. نکته: برای تعیین Componentی که focus را در اختیار دارد، از متد زیر استفاده می کنیم. Component.requestFocus();

277 رویدادهای keyDown و keyUp
برای مدیریت این رویدادها از متدهای زیر استفاده می کنیم. public boolean keyDown(Event evt, int key){ //Method’s Core Comes Here } آرگومان دوم متد فوق(key) عدد صحیح حاوی مقادیر کاراکتری یونیکد می باشد. برای استفاده از آنها به عنوان کاراکتر به صورت زیر عمل می کنیم. currentChar = (char)key;

278 نکات و مثال public boolean keyDown(Event evt, int key){
System.out.println(“Ascii Value: ” + key); System.out.println(“Character:” + (char)key); return true; } نکته: برخی از کلیدهای غیر کاراکتری نظیر کلیدهای جهت دارای نام می باشند که می توان برای دسترسی به آنها از این نامها استفاده کرد. if(key == Event.UP){ //If Core Comes Here

279 مثال import java.awt.Graphics; import java.awt.Event;
import java.awt.Font; import java.awt.Color; public class Keys extends java.applet.Applet { char currkey; int currx; int curry; public void init() { currx = (size().width / 2) -8; // default curry = (size().height / 2) -16; setBackground(Color.white); setFont(new Font("Helvetica",Font.BOLD,36)); requestFocus(); }

280 public boolean keyDown(Event evt, int key) {
switch (key) { case Event.DOWN: curry += 5; break; case Event.UP: curry -= 5; case Event.LEFT: currx -= 5; case Event.RIGHT: currx += 5;

281 default: currkey = (char)key; } repaint(); return true; public void paint(Graphics g) { if (currkey != 0) { g.drawString(String.valueOf(currkey), currx,curry);

282 نکاتی دیگر در مورد زبان برنامه نویسی Java

283

284

285

286

287

288

289

290

291


Download ppt "مقدمه اي بر Java : جاوا ثمره 15 سال تلاش جهت ایجاد زبان برنامه نویسی بهتر و محیط ساده تر برای ساخت برنامه های مطمئن تر می باشد."

Similar presentations


Ads by Google