Използване на Обекти

,
Този урок предвижда запознаване с обектите. Той описва, на по-високо ниво, това, което е обекта, а след това се въвеждат литералите инстанция на променлива и инстанция на функция. Този урок предлага Address и Customer примери , които показват как обектите се използват и прилагат.

Съдържание:

1. Какво е Обект?
2. Деклариране на Обектни литерали
3. Синтаксис на обектните литерали
4. Извикване на обект функции



Какво е Обект?
JavaFX Script езика за програмиране е обектно-ориентиран.
Но какво означава това?
Какво точно е обект?
Просто казано, обект е дискретен софтуерен пакет, който има определено съдържание и поведение. За да разберем по-добре софтуерните обекти, нека излезем навън от софтуера за минутка и си помислим за понятията, с който вече сте запознати.
Вашият телевизор например е обект. Има и двете: състояние (текущ канал, ниво на звук, включен или изключен) и поведение (промяна на канали, регулирате нивото на звука, включване или изключване). Склонни сме да мислим за телевизора като един предмет, но в действителност е един телевизор, съставен от много други обекти (бутоните по лицето, както и различните компоненти-обекти вътре в самия телевизор). В много случаи тези малки обекти също са съставени от други обекти.
Ние можем да разглобим телевизора на компоненти, докато не достигне до точката, където можем да отидем (винт, например наистина е само една единствена цел, той не е съставен от нещо друго). Ако някога сте си купували някакъв комплект за сглобяване, който съдържа диаграма за сглобяването му и съответните изисквания , вие вероятно сте виждали в документацията са показани всеки един обект съдържащ се в конструкцията. С един поглед можете да разберете колко обекти съществуват, и как тези обекти работят всички заедно. Същото важи и за .fx сорс файловете, вие можете лесно да видите как скрипт обектите работят всички заедно, за да образуват пълното програмно приложение.

Деклариране на обектни литерали
Как действително софтуерният обект изглежда по отношение на кода? В JavaFX скрипт език за програмиране, обекта е създаден с обектен литерал (object literal):

Address {
street: "1 Main Street";
city: "Santa Clara";
state: "CA";
zip: "95050";
}


Това създава Address обекта, за използване в хипотетична адресна книга. В обекта се инициализират с конкретни стойности неговите променливи street, city, state, zip. В реално приложение, можете да си представите, че в адресната книга GUI компонентите ще бъдат синхронизирани с данните на Address обекта, така че това, което се появява на екрана, е отражение на реалните данни, които се съхраняват от програмата.
Но преди да се опитате да компилирате този код, трябва да знаете още нещо: компилатора има нужда от специално "описание" (наречено „class“), което описва точно какви данни Address обекта ще съдържа. (В този пример, ние казваме, че Address има street, city, state,zip, но компилатора няма да знае това, докато не се представи class файла, който предоставя тази информацията.) Ние няма да обсъждаме писането на ваши собствени класове до края на ръководството, защото JavaFX (API) съдържа голяма библиотека от вградения класове, които са готови да се използват в собствените ви програми. Освен това, тъй като JavaFX програмния език е изградена на основа на Java платформата, можете да получите достъп до езика за програмиране Java и неговото API.
Можем да компилираме Address примера чрез сваляне на файла Address.fx (който осигурява дефиницията на Address класа) и да го поставите в същата директория като примереният код показан по-горе. (Само не забравяйте да запазите примерен код във файл с друго име, като например AddressTest.fx). Нищо в този код не произвежда някакъв изход, но факта, че се компилира правилно е доказателство, че обекта е създаден успешно.

Забележка: Address обект променливите (уstreet, city, state, zip) в този пример са технически известни, като instance variables. Вие можете да мислите за instance variables, като множество от вградени атрибути, които всеки обект е гарантирано, че съдържат. Всъщност, терминът "атрибут" е използван в ранните версии на JavaFX (може да го срещнете в по-стари документации и демонстрации.) В света на обектно-ориентирано програмиране, думите "instance" и "object "са синоними, това е мястото, от където това понятие идва.


Синтаксис на обектните литерали
Синтаксиса на обектните литерали е едновременно лесен за учене и интуитивен за използване. От нашия пример, първата дума (Address) определя вида на обекта, който създавате. Скобите определят тялото на обекта. Всичко останало (street, city, state, zip) инициализира инстанциите на променливите на обекта.



Имайте предвид, че при обявяване на обект променливите те могат да бъдат разделени със запетаи, шпация или точка и запетая. Можете да използвате и другите, но по принцип се придържаме към точка и запетая в този урок. За по-формално описание на този синтаксис, вижте Figure 6.38 в JavaFX Script Programming Language Reference.

Можете също така да декларирате новосъздадения обект на променлива за по-късен достъп:

def myAddress = Address {
street: "1 Main Street";
city: "Santa Clara";
state: "CA";
zip: "95050";
}


Или да го вложите един обект вътре в друг:

def customer = Customer {
firstName: "John";
lastName: "Doe";
phoneNum: "(408) 555-1212";
address: Address {
street: "1 Main Street";
city: "Santa Clara";
state: "CA";
zip: "95050";
}
}

В последния пример, Customer обекта въвежда няколко нови променливи, след което декларира оригиналния Address обект в променлива наречена address. Забележете как е вложен кода на обекта. Реалните приложения обикновено съдържат много вложени обекти, този вложен модел помага лесено да се види с един поглед какви обекти принадлежат къде. За да компилирате този пример, ще трябва да добавите Customer.fx към вашата текуща директория.

Пример от реалния свят: Video Puzzle





Този видео пъзел заема стрийминг видеото разделя го на пасажи за да може да се сглоби на пъзел. Тук имаме подчертан участък от кода, който използва обект литерали. Би трябвало да разпознаете синтаксиса, дори ако не сте запознати с дадения клас. В този откъс от код, visible и content инстанция променливите принадлежат към Group обекта. x, y, width, height, arcWidth, arcHeight, fill, blockMouse инстанциите променливи принадлежат към Rectangle обект. Group обект се съхранява в променлива наречена previewDimOverlay за по-късно достъп.


Извикване на обект функции
Както променливи, обекта може да съдържа и функции.Вие може да извиквате обект функциите като напишете името на променливата ( customer в следния пример), следван от точка ("."), следвана от функцията, която искате да извикате:

def customer = Customer {
firstName: "John";
lastName: "Doe";
phoneNum: "(408) 555-1212"
address: Address {
street: "1 Main Street";
city: "Santa Clara";
state: "CA";
zip: "95050";
}
}

customer.printName();
customer.printPhoneNum();
customer.printAddress();


Това води до следния изход:

Name: John Doe
Phone: (408) 555-1212
Street: 1 Main Street
City: Santa Clara
State: CA
Zip: 95050


Обект функциите могат също да приемат параметри и да връщат стойности, както научихте в предишния урок.

Писане на JavaFX Script

,
Този урок е въведение в JavaFX Script. В него ще научите основите на променливите и функциите, чрез написване на прост калкулатор, който работи от команден ред. Всяка точка ще въведежда по една нова основна концепция. Предоставен е примерен код, който можете да компилирате и стартирате. Урока също съдържа "real world" код, откъсите показват как се използват функциите и променливите в реални JavaFX SDK приложения. Следвайки линка за всяко демо ще ви отведе до javafx.com сайта, където можете да получите пълния код, плюс допълнителните бележки от разработчика, които в по-късен етап може да бъдат преведени и публикувани на страницата на блога.

Съдържание
1.Деклариране на променливи
2.Дефиниране и извикване на скрипта
3.Функции
4.Подаване на аргументи към функциите
5.Връщане на резулатати от скрипт функциите
6.Достъп до аргументи от командния ред


Деклариране на променливи


В предишния урок се запознахмe със средата за разработка; тук ще погледнем по-отблизо в изходният код на calculator.fx. Кодът в червено по-долу декларира променливите. Променливите се декларират използвайки ключовите думи var или def . Разликата между двете е, че на var променливите могат да бъдат инициализирани нови стойности по време на жизнения цикъл на скрипта, докато def променливите остават с постоянни стойности след първата им инициализация. В долния код декларираме променливите numOne и numTwo, като им задаваме съответните стойности, а променливата result оставяме неинициализирана, защото в нея ще записваме резултата на нашия калкулатор:

def numOne = 100;
def numTwo = 2;
var result;

add();
subtract();
multiply();
divide();

function add() {
result = numOne + numTwo;
println("{numOne} + {numTwo} = {result}");
}

function subtract() {
result = numOne - numTwo;
println("{numOne} - {numTwo} = {result}");
}

function multiply() {
result = numOne * numTwo;
println("{numOne} * {numTwo} = {result}");

}

function divide() {
result = numOne / numTwo;
println("{numOne} / {numTwo} = {result}");
}

Може да сте забелязали, че ние не специфицирахме типа на променливите (като низ, целочиселн, реален и т.н). Компилаторът е достатъчно умен да разбере Вашето намерение базирано на контекста, в който се използва променливата. Това е известно като тип по подразбиране (type inference). Типовете по подразбирене прави живота Ви като програмист малко по-лесен, тъй като Ви освобождава от бремето на обявяване на типовете данни за Вашите променливи.

Пример от реалнния свят: Effects Playground



Картинката по-горе "Effects Playground" показва едно примерно приложение. Откъса от код от дясно показва няколко от неговите скрипт променливи. Вие няма да разберете цялата част от кода показана - все още - но подчертаната част трябва да има смисъл на базата на това, което току-що научихте. Имайте в предвид, че тези уроци са фокусирани върху не-графични приложения, тук дискутираме само ядрото на писане на JavaFX Script, в последствиe вие ще използвате тези знания за писане на вашите собствени GUI-базирани приложения.



Дефиниране и извикване на функции

Нашият пример Калкулатор определя някои скрипт функции, като добавяне, изваждане, умножаване и делене на две числа. Функция е изпълним блок код, който изпълнява определена задача. Червеният код по-долу определя четири функции. Всяка от тях изпълнява прости математически изчисления и след това отпечатва резултата в командния ред (конзолата).

Организирането на кода е обща практика, която прави програмите Ви лесни за четене, по-лесни за употреба и по-лесни за дебъгване.

def numOne = 100;
def numTwo = 2;
var result;

add();
subtract();
multiply();
divide();

function add() {
result = numOne + numTwo;
println("{numOne} + {numTwo} = {result}");
}

function subtract() {
result = numOne - numTwo;
println("{numOne} - {numTwo} = {result}");
}

function multiply() {
result = numOne * numTwo;
println("{numOne} * {numTwo} = {result}");
}

function divide() {
result = numOne / numTwo;
println("{numOne} / {numTwo} = {result}");
}

Трябва да знаете, че кода на функцията не се изпълнява докато не бъде изрично извикан. Това дава възможност да стартирате функцията от всяко място във вашия код. Няма значение дали функцията е извикана преди или след нейната дефиниция. (в нашият пример ще се извикат функциите по-рано в изходния файл, отколкото, когато те действително са дефинирани):

def numOne = 100;
def numTwo = 2;
var result;

add();
subtract();
multiply();
divide();

function add() {
result = numOne + numTwo;
println("{numOne} + {numTwo} = {result}");
}

function subtract() {
result = numOne - numTwo;
println("{numOne} - {numTwo} = {result}");
}

function multiply() {
result = numOne * numTwo;
println("{numOne} * {numTwo} = {result}");
}

function divide() {
result = numOne / numTwo;
println("{numOne} / {numTwo} = {result}");
}


Пример от реалнния свят : Draggable MP3 Player




В "Draggable MP3 Player" демото, програмиста е дефинирал функциите за спиране или пускане на текущата песен. За именуване на тези функции са избрани stopCurrentSong и playCurrentSong, това прави кода самостоятелно документиран и следователно много по-лесен за анализиране. Когато именувате вашите променливи и функции, опитайте се да използвате винаги смислени думи. Конвенцията е първата дума да се пише само с малки букви, а всяка следваща дума в името с главна първа буква.

Подаване на аргументи към функциите

JavaFX Script функциите могат също да бъдат дефинирани да приемат аргументи. Аргументите са специфични променливи, които се предават по време на извикване на дадената функция. По този начин може нашето приложение калкулатор да извършва изчисления на всеки две числа, а не само на стойности, които са твърдо кодирани в numOne и numTwo променливите. В действителност в тази версия ние премахнахме numOne и numTwo изцяло, оставихме само result като единствена скрипт променлива:

var result;

add(
100,10);
subtract(
50,5);
multiply(
25,4);
divide(
500,2);

function add(
argOne: Integer, argTwo: Integer) {
result = argOne + argTwo;
println("{argOne} + {argTwo} = {result}");
}

function subtract(
argOne: Integer, argTwo: Integer) {
result = argOne - argTwo;
println("{argOne} - {argTwo} = {result}");
}

function multiply(
argOne: Integer, argTwo: Integer) {
result = argOne * argTwo;
println("{argOne} * {argTwo} = {result}");
}

function divide(
argOne: Integer, argTwo: Integer) {
result = argOne / argTwo;
println("{argOne} / {argTwo} = {result}");
}

Изходът от кода е следният:

100 + 10 = 110
50 - 5 = 45
25 * 4 = 100

500 / 2 = 250


Пример от реалнния свят : Interesting Photos


В този откъс от код "Interesting Photos", ние виждаме скрипт функция, наречена loadImage да приема списък от аргументи. Отново избора на имена на функции и аргументи прави кода леснен за разбиране. Разбирането на пълното изпълнение на тази функция не е важно в този момент. Какво е важно обаче, че функцията приема два аргумента. Когато започнете да пишете собствени приложения, вероятно ще разчитате на примерен код, като този за правилния синтаксис.


Връщане на резулатати от скрипт функциите

Функциите също така могат да връщат стойност на кода, който я извиква. Например, ние можем да променим, функцията add на нашето приложение калкулатор, така че тя да връща резултат на всяко изчисление:


function add(argOne: Integer, argTwo: Integer) : Integer {
 result = argOne + argTwo;
println("{argOne} + {argTwo} = {result}");
return result;
}

В първият код в червено се посочва, че функцията връща Integer, а вторият код в червено всъщност връща стойността.

Функцията add може да бъде извикана и по този начин:

var total;

total = add(1,300) + add(23,52);

Ако не е посочен типа на върнатата стойност, функция връща Void по подразбиране.


Пример от реалнния свят: Animating Photos from Flickr


В този откъс от код "Animating Photos from Flickr", ние виждаме връщаните стойности по време на работа в три различни функции. Върнатите стойности са малко по-сложни от това, което сте виждали досега, но основната концепция е една и съща: всяка функция изпълнява някои специфични изчисления, след което се връща резултат. В първите две функции се извиква едина математическа функция (за да се изчисли квадратен корен) и връща резултата. Третата функция връща нов Vector2D обект. Тъй като този код не е пълен, целта му е само да видите как точно се връщат стойности, но с пълния изходен код той ще има смисъл.


Достъп до аргументи от командния ред

Скриптовете съшо така могат да приемат аргументите от командния ред. В нашият пример Калкулатор, това ще даде възможност на крайните потребители да зададат числата, които да бъдат изчислени в Runtime на скрипта.

var result;

function run(args : String[]) {

// Convert Strings to Integers
def numOne = java.lang.Integer.parseInt(args[0]);
def numTwo = java.lang.Integer.parseInt(args[1]);

// Invoke Functions
add(numOne,numTwo);
subtract(numOne,numTwo);
multiply(numOne,numTwo);
divide(numOne,numTwo);
}


function add(argOne: Integer, argTwo: Integer) {
result = argOne + argTwo;
println("{argOne} + {argTwo} = {result}");
}

function subtract(argOne: Integer, argTwo: Integer) {
result = argOne - argTwo;
println("{argOne} - {argTwo} = {result}");
}

function multiply(argOne: Integer, argTwo: Integer) {
result = argOne * argTwo;
println("{argOne} * {argTwo} = {result}");
}

function divide(argOne: Integer, argTwo: Integer) {
result = argOne / argTwo;
println("{argOne} / {argTwo} = {result}");

}

Тази промяна въвежда функция, на която се подават аргументи от командния ред. За разлика от другите функции, които сте видели, run е специална функция, която служи като основа входна точка на скрипта. Функцията run запазва всички аргументи от командния ред в args, което представлява поредица от String обекти.
За да стартирате този скрипт, трябва да посочите първото и второто число в Runtime:

javafx calculator 100 50

Изходът от кода е следният:

100 + 50 = 150
100 - 50 = 50
100 * 50 = 5000
100 / 50 = 2

Имайте предвид, че във всички предишни версии на калкулатор скрипта, ние не сме дефинирали run функция. Ние просто написахм код, който се изпълнява на Script ниво. В такива случаи, компилатора тихо генерира не-ARG run функция и поставя код, за да бъде изпълнен в рамките на скрипта. Когато посочвате своя собствена run функция, името args може да бъде всичко, което искате, ние използваме "args", но вие вероятно ще видите програмисти, който използват други варианти от него, като "ARG", "ARGS", "__ARGS__", "argv" и др. Също така имайте предвид, че в този вариант върнахме обратно numOne и numTwo променливите, които сега са дефинирани вътре в run функцията вместо в скрипт нивото. (Когато дадена променлива е дефинирана във функция, тя е известна като локална променлива, тъй като е видима само за кода в рамките на същата тази функция.) Нашият калкулатор-функция очаква числа, но аргументите от командния ред са Низ, затова ние трябва да конвертираме всеки аргумент идващ от командния ред от String в Integer, преди да можем да ги предадем към функцията:

// Convert Strings to Integers
def numOne = java.lang.Integer.parseInt(args[0]);
def numTwo = java.lang.Integer.parseInt(args[1]);

За тази цел идва помощта на Java, за да извърши конвентирането на типа. Писането на съществуващите Java функции в скрипта е необходимо за по-голяма мощност към този иначе прост скриптов език.


Пример от реалнния свят: Brick Breaker


Този откъс от "Brick Breaker" показва run функцията, която служи като главната входна точка на играта. Макар че този конкретен пример, действително не използва аргументи от командния ред, ние можем да видим, че run функцията инициализира основната рамка на приложението, като заглавието му, ширина, височина и др.


Първи стъпки с JavaFX Script

,
Статията е превод на оригиналните уроци от официалния сайт на SUN Microsystems
JavaFX Script Tutorial

Готови ли сте за JavaFX Script?
Този урок описва софтуерa, който трябва да бъде инсталиран на Вашата система, преди да можете да започнете. Той също така описва NetBeans IDE и инструкциите за командния ред, за да компилирате и стартирате първата си JavaFX програма.


Съдържание:
Стъпка 1. Изтегляне и инсталиране на JDK
Стъпка 2. Избиране на среда за програмиране
Стъпка 3. Изтегляне и инсталиране на JavaFX Compiler и Runtime

Стъпка 1. Изтегляне и инсталиране на JDK

JavaFX Script се базира на Java платформа и като такъв изисква JDK 5 или JDK 6 да бъдат инсталирани на вашата система. Ако не сте го направили вече, изтеглете и инсталирайте JDK 6 или JDK 5 , преди да продължите с този урок.
Не мисля да се впускам в подробности как се инсталира JDK.

Стъпка 2. Избиране на среда за програмиране

Когато става въпрос за избор на среда за разработка, Вие имате две широки категории за избор: използване на интегрирана среда за програмиране (IDE) или обикновен текстов редактор. Този избор е изцяло въпрос на личен вкус.

Oофициално поддържаната среда за разработка на JavaFX приложения е NetBeans IDE версия 6.5. В уебсайта на NetBeans са предоставени пълни инструкции за сваляне, инсталиране и конфигуриране на средата.

Стъпка 3. Изтегляне и инсталиране на JavaFX Compiler и Runtime

В JavaFX Script е компилаторен език, което означава, че всеки код, който пишете трябва първо да се конвертира до Java bytecode, който впоследствие ще може да се изпълни от Java виртуалната машина. Това е така, независимо от метода Ви на разработка (било то от командния ред или IDE). След инсталирането на JDK и избора на среда за разработка, ще трябва да изтеглите и инсталирате JavaFX Script Compiler и Runtime. Най-лесният начин за получаване на този софтуер е да се изтегли целия JavaFX SDK, който ви дава NetBeans IDE (по избор), Compiler, Runtime, както и редица други инструменти.

Ако сте избрали NetBeans IDE 6.5 среда за разработка, можете да използвате следните инструкции, за да създадете проект за първия си сценарий: обикновен калкулатор.

Стъпка 1: Създаване на нов проект

Стартирайте NetBeans IDE 6.5 и изберете "File > New Project".

Когато помощника на "New Project" се появи на екрана, изберете JavaFX категорията и натиснете "Next" за да продължите.
Примерен екран: Нов проект в NetBeans - избор на типа на проекта

Стъпка 2: Изберете име на проекта и местонахождението му във вашата файлова система

Напишете "Calculator" като име на проекта. NetBeans предлага стандартно разположение на проекта във файловата система - обиковено това е специализирана поддиректория на домашната Ви директория. Можете по желание да го промените. Проверете дали "Empty Project" и "Set as Main Project" са избрани, но внимавайте да не е поставена отметка в "Create Main File". Натиснете "Finish" когато сте готови.

Примерен екран: Нов проект в NetBeans - избор на заглавие и местополжение на проекта

Стъпка 3: Добавяне на файла с код към проекта

Отляво в редактора има файлов и браузър на проектите, както е показано на фигурата по-долу. Както виждате Calculator проекта съществува, но все още не съдържа файл с код:

Примерен екран: Логическа структура на новия проект в NetBeans 

За да добавите файл с код, изберете "File > New File". Изберете JavaFX като категория и Empty JavaFX File като файлов тип:

Примерен екран: Добавяне на нов файл към проекта - избор на типа на файла

Напишете "Calculator" като име на файла, но оставете "Package" празно. В долния край на екрана ще прочетете съобщение за предупреждение, но за сега го пропуснете. През цялото време на тези уроци ние ще поставяме файловете в "default package". Натиснете "Finish" когато сте готови.

Примерен екран : Добавяне на нов файл към проекта - избор на име на файла

Стъпка 4: Напишете кода, компилирайте и стартирайте програмката!

Прояктния браузър сега ще ви покаже файла Caclulator.fx като част от стандартния пакет (default package). Редактора на код отдясно съдържа малко код по подразбиране, които Вие можете да изтриете безопасно за сега.

Примерен екран: Файлът с код в проектния браузър и редактора

На негово място напишете или копирайте следният код:
def numOne = 100;
def numTwo = 2;
var result;

add();
subtract();
multiply();
divide();

function add() {
result = numOne + numTwo;
println("{numOne} + {numTwo} = {result}");
}

function subtract() {
result = numOne - numTwo;
println("{numOne} - {numTwo} = {result}");
}

function multiply() {
result = numOne * numTwo;
println("{numOne} * {numTwo} = {result}");
}

function divide() {
result = numOne / numTwo;
println("{numOne} / {numTwo} = {result}");
}

След което ще забележите, че средата за разработка оцветява кода, което означава, че е разпознал синтаксиса на JavaFX Script:

Примерен екран: NetBeans редактора разпознава сиснтасиса на JavaFX Script

Сега обърнете внимание на тези бутони горе в лентата с инструменти на NetBeans:



Натиснете зеленият бутон за да се компилира и стартира приложението:

Примерен екран: Изход на приложението в системната конзола на средата

Ако получавате същия екран вашият код работи отлично :) !
Изход на програмата в терминала:
100 + 2 = 102
100 - 2 = 98
100 * 2 = 200
100 / 2 = 50



Това приложение може да е малко, но ви представя някои важни програмни конструкции за езика, които ще бъдат дискутирани в следващия урок. Научаването на тази конструкция е Вашата първа стъпка към програмирането с JavaFX Script.