среда, 4 марта 2009 г.

JavaFX -Reach Internet Application от Sun


Прощай унылый Swing?

Если вспомнить историю создания Интернет приложений, пройдется признать за компанией Sun первенство в де создания Rich Internet Application. Первые Java аплеты, продемонстрированные Гослингом при презентации браузера WebRunner в далёком 1994-м году. С тех пор прошло много всяких событий, Интернет приложения росли и изменялись, появилась технология Flash, использование клиентских возможностей браузера (Javascript, DOM), вылилось в термин WEB-2, а аплеты, как технология, в общем, не сильно изменились. Заняв прочное положение на мобильных устройствах, на десктопах они так и не получили заметного распространения. Положение осложнилось с появлением таких мощных конкурентных технологий, как Adobe Flex/Air, Microsoft Silverlight.
С другой стороны имело место Недовольство потребителей возможностями средств Java (Swing, Java2D), для разработки графического пользовательского интерфейса. Особенность ситуации была в том, что эти средства вполне позволяли, в теории создавать GUI любой сложности и «красивости», но процесс этот никак нельзя было назвать лёгким и эфективным. Возникла необходимость в простом средстве проектирования интерфейсов, котором может быть скриптовый декларативный язык.

Явление JavaFX


Впервые технология была представлена на конференции JavaOne в мае 2007. В декабре 2008-го вышла JavaFX 1.0, включающая в себя средства разработки - JavaFX 1.0 SDK, плагин для NetBeans IDE 6.5 и JavaFX 1.0 Production Suite— набор инструментов для экспорта графических объектов в приложения JavaFX. Была представлена также бета версия эмулятора JavaFX 1.0 Mobile, для разработки JavaFX приложений для мобильных платформ. JavaFX TV - среда для запуска приложений на телевизионной платформе, планируется к запуску в начале 2010 года.
На настоящий момент (апрель 2009-го) Вышла версия JavaFX 1.1
включающая мобильный профайл, позволяющий запускать JavaFX приложения на мобильных устройствах.
На недавно открытом официальном сайте (JavaFX.com) можно видеть примеры готовых приложений, на основе новой технологии, предоставленных с исходным кодом.
JavaFX потихоньку входит в нашу жизнь.




Что это?

Что конкретно представляет собой JavaFX приложение? Оно вполне может работать как продукт Java web start, но основная его роль, декларируемая Sun — «аплет нового образца», основное отличие которого от обычных аплетов — возможность самостоятельного существования. В самом деле, JavaFX программа вполне может быть оформлена в качестве обычного аплета, но этот аплет можно вытащить из содержащей его страницу, закрыть побледнею и продолжить работу (Drag-to-Install). В общем, такой продукт является «Интернет» приложением, только потому, что через глобальную сеть происходит доставка его потребителю, а также по причине наличия возможности активного взаимодействия через Интернет с сервером. Ну а в обычной, несетевой ипостаси эти приложения мало, чем уступают обычным настольным.
Приложение JavaFX, естественно использует для работы Java машину (см рис 1). 

 Рис. 1
Архитектура JavaFX

Как следствие оно может использовать классы и объекты Java, импортировав соответствующие пакеты.
Технология, позволяет легко встраивать в приложение мультимедиа данные, анимацию и различные визуальные эффекты. Связывание данных облегчает построение эффективных интерактивных интерфейсов.
Используемый скриптовый язык JavaFX Script, понятен и прост в освоении (см приложение). Он обладает обширными средствами для декларативного описания, имеет необходимые встроенные объекты.
Впрочем, не особенно хочется превращать обзор в рекламную листовку, луче давайте попробуем возможности JavaFX на практике.

Начинаем работу

Для разработки на JavaFX существуют такие инструменты как, но сначала попробуем написать тестовое приложение, воспользовавшись текстовым редактором.
Прежде всего, на вашей системе должен быть установлен пакет JDK (Java Development Kit) версии 5 или 6 (последняя по многим причинам предпочтительнее). Если это не сделано, скачиваем пакет по адресу http://java.sun.com/javase/downloads/index.jsp и устанавливаем его. Теперь скачиваем и устанавливаем JavaFX SDK (http://java.sun.com/javafx/downloads/). Инсталляция не должна вызвать особых вопросов.
Для проверки работоспособности среды. В консоли выполним команду javafxc, без параметров:


C:\Sun>javafxc
javafxc: no source files
Usage: javafxc




















use -help for a list of possible options

C:\Sun>

Если результат отличается, в первую очередь следует проверить, добавлен ли путь к JavaFX SDK в переменную окружения PATH.
Теперь напишем нашу первую программу. Создадим файл testfx.fx, следующего содержания:

import javafx.stage.*;
import javafx.scene.*;
import javafx.scene.text.*;
import javafx.scene.paint.*;
import javafx.scene.effect.*;



Stage {
title: "Hello FX"
width: 250
height: 80
scene: Scene {
        content: Text {
          x: 10 y: 30
          font: Font { size: 24 }
          fill: Color.GREEN
          effect: DropShadow{ offsetX: 3 offsetY: 3}
          content: "Hello FX!"
          }
    }
}

скомпилируем этот класс командой javafxc:


C:\Sun>javafxc testfx.fx
C:\Sun>


и запустим, соответственно командой javafx:


C:\Sun>javafx testfx




Результат можно наблюдать на рис. 2

Рис. 2
Зелёный хеллоу ворд.

Теперь давайте разберёмся, что мы тут натворили. С командами компиляции и запуска всё ясно — это прямые аналоги утилиты javac и команды java. Первые строчки кода также хорошо знакомы любому java программисту — это импорт необходимых классов из соответствующих пакетов.
Далее идёт то, что называется «декларативным синтаксисом». Что это такое? Если очень коротко, то особенность заключается в том, что программа не задаёт пошаговую инструкцию реализации алгоритма работы, а описывает объекты, полученные в виде конечного результата. При этом описываются свойства и поведение объектов, в том числе и интерактивное. Впрочем, об этом далее, в более сложных примерах. Пока всё просто: объект Stage представляет собой окно приложения, с соответствующими свойствами (title, width, height), значения которых определяется в последующих строчках. Далее внутри его описывается объект Stage — своего рода фрейм, содержащий другие объекты. Вернее в данном случае один визуальный объект — Text, который также снабжен описанием своих свойств (положение, шрифт, цвет). Помимо их описания к тексту применён эффект тени, причём как шрифт так и эффект также имеют свои описания.
Как видим тут всё очень просто и интуитивно понятно. Впрочем, все эти "хеллоуворды" уже давно в печёнках, давайте попробуем написать маленькое, но действительно полезное (ну допустим) приложение. Что нам нахватает в мире ERP систем и SOA приложений? Разумеется красивого калькулятора!

Вооружимся описанием языка и вперёд.
Сначала опишем сам калькулятор с индикатором:

import javafx.stage.*;
import javafx.scene.*;
import javafx.scene.text.*;
import javafx.scene.paint.*;
import javafx.scene.effect.*;
import javafx.scene.shape.*;

Stage {
    title: "JavaFX калькулятор"
    width: 300
    height: 500
    scene: Scene {
        content:[ Text {
                    x: 20 y: 60
                    font: Font { size: 36}
                    fill: Color.GREEN
                    effect: DropShadow{ offsetX: 3 offsetY: 6}
                    content: "2 * 2 = 4"
                  }
                ]
            }
} 

похоже на предыдущий пример. Мы импортировали необходимые классы, создали окно приложения, описали основной фрейм создали там пока единственный элемент (в терминах JavaFX — нод) — Text. после текста добавим описание кнопки, используя встроенный объект Rectangle:

Rectangle {
fill: Color.SILVER
x: 10
y: 80
width:60
height: 40
arcWidth: 20
arcHeight: 20
} 

и надписи на ней:


Text {
x: 35
y: 110
font: Font { size: 24}
fill: Color.GREEN
content: "1"
}

Попробуем скомпилировать и запустить результат приведёнными выше командами, и полюбуемся чудным однокнопочным калькулятором. (рис 3)

Рис. 3
 Для калькулятора маловато кнопок

Ну дальше всё просто — описываем одну за другой все остальные кнопки... Что? Объекты? Массивы? Всё так, и хоть мне и платят за количество печатных знаков, я всё-таки программист и не могу не унифицировать процесс. Для начала создадим следующий класс:

class CalcBatton{
var cx: Number;
var cy: Number ;
var ctext: String;
var group= Group{
content: [
Rectangle {
fill: Color.SILVER
x: cx
y: cy
width:60
height: 40
arcWidth: 20
arcHeight: 20
cursor: HAND
effect: DropShadow{ offsetX: 3 offsetY: 6}
},
Text {
x: cx + 25
y: cy + 30
font: Font { size: 24}
fill: Color.GREEN
content: ctext
}]}
}


В данном случае мы объединили в одну группу кнопку и надпись на ней, создав класс, экземплярами которого будут кнопки калькулятора. Переменные класса устанавливают надпись на кнопке и её абсолютное расположение (вообще говоря в JavaFX присутствуют менеджеры размещения, но для простого приложения с фиксированным числом компонентов можно ограничится и абсолютным позиционированием.)

Теперь создадим массив кнопок:


def bt1=CalcBatton{ cx: 10, cy: 80,ctext: "1"}
def bt2=CalcBatton{ cx: 80, cy: 80,ctext: "2"}
def bt3=CalcBatton{ cx: 150, cy: 80,ctext: "3"}
...
def bt9=CalcBatton{ cx: 10, cy: 180,ctext: "9"}
def bt0=CalcBatton{ cx: 80, cy: 180,ctext: "0"}
def bt_add = CalcBatton{ cx: 150, cy: 180,ctext: "+"}
def bt_sub = CalcBatton{ cx: 220, cy: 180,ctext: "-"}
def bt_mul=CalcBatton{ cx: 10, cy: 230,ctext: "*"}
def bt_div = CalcBatton{ cx: 80, cy: 230,ctext: "/"}
def bt_res = CalcBatton{ cx: 150, cy: 230,ctext: "="}
def bt_del = CalcBatton{ cx: 220, cy: 230,ctext: "C"}
var buttons = [bt1.group,bt2.group,bt3.group,
bt4.group,bt5.group,bt6.group,
bt7.group,bt8.group,bt9.group,
bt0.group,bt_add.group,bt_sub.group,
bt_mul.group,bt_div.group,bt_res.group,bt_del.group];

И разместим этот массив на «сцене» приложения:

Stage {
...
  scene: Scene {
   content:[ Text {
    ...
      },buttons
   ]}
}

После компиляции должна получиться картинка, сходная с рис. 4.
Рис. 4
Теперь достаточно
Не останавливаемся. Нам нужно рабочее приложение, следовательно после нажатия на клавиши текст в индикаторе должен меняться. Для этого сначала введём глобальную переменную, которая содержит текст индикатора, и немного изменим его код:


var cont="";
class CalcBatton{
  ...................................
  effect: DropShadow{ offsetX: 3 offsetY: 6}
  content: bind cont
}


В данном случае мы воспользовались ключевой возможностью JavaFX Script — связыванием данных (data binding). Теперь любое изменение переменной cont, сразу же будет отображено на индикаторе калькулятора. Теперь внесём изменения в код кнопки, дабы описать её реакцию на клик мышкой:


effect: DropShadow{ offsetX: 3 offsetY: 6}
onMouseClicked: function(evt: MouseEvent):Void {
  but="{but}{ctext}";
  if({ctext}=="C"){
    but="";
    }
  } 
}


Как видно из кода, при нажатии на клавишу "C" происходит очистка индикатора. Конечно, следует, также прописать реакцию на нажатие “=”, вызывающее вычисление результата, но это я предоставляю для реализации читателю. Сама по себе задача вполне ординарная. Мы же тут заняты другим – стараемся “сделать красиво”. Продолжая действовать в этом направлении,

“оживим” кнопки, заставим их нажиматься. Для этого введём ещё два атрибута нашего класса:

var gradx= 3;
var grady= 6;
var group= Group{

Эти переменные будут отвечать за размеры эффект тени, при изменении которых и создаётся эффект нажатия:

cursor: HAND
effect: DropShadow{ offsetX: bind gradx offsetY: bind grady}

Как видите мы опять используем связывание. И связываем мы их с типичными действиями пользователя. Пишем в коде объекта Rectangle:

onMousePressed:    function(evt: MouseEvent):Void {
  gradx=0;
  grady=0;
  }
onMouseReleased:  function(evt: MouseEvent):Void {
                   gradx=3;
                   grady=6;
                   }
},

Осталось только навести ещё немного гламура (не забывая, кстати импортировать необходимые классы), и калькулятор готов. Полный код (без вычислительных функций, приведён ниже:

import javafx.stage.*;
import javafx.scene.*;
import javafx.scene.text.*;
import javafx.scene.paint.*;
import javafx.scene.effect.*;
import javafx.scene.paint.Color;
import javafx.scene.shape.*;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.Cursor.*;
import javafx.scene.Node.*;
import javafx.scene.input.MouseEvent;  

class Calc{
  // здесь «вычислительная» часть
}

def cl= Calc{};

def fil_bt=LinearGradient { 
  startX: 0.0, startY: 0.0, endX: 0.0, endY: 1.0, proportional: true
  stops: [ 
    Stop {offset: 0.0 color: Color.WHITE},
    Stop {offset: 1.0 color: Color.SILVER} 
    ]
  } 

var cont="";
var sum=0;

class CalcBatton{
  var cx: Number ;
  var cy: Number ;
  var ctext: String;
  var gradx= 3;
  var grady= 6;
  var group= Group{
    content: [
    Rectangle {
      fill: fil_bt
      x: cx    
      y: cy   
      width:60
      height: 40
      arcWidth: 20
      arcHeight: 20
      cursor: HAND
      effect: DropShadow{ offsetX: bind gradx offsetY: bind grady}
      onMouseClicked: function(evt: MouseEvent):Void {
        if({ctext}=="C"){
        but="";
        }
        else{
        but="{cont}{ctext}";
        } 
      }
      onMousePressed:  function(evt: MouseEvent):Void {
      gradx=0;
      grady=0;
      }
      onMouseReleased:  function(evt: MouseEvent):Void {
        gradx=3;
        grady=6;
        }
      },
      Text {
        x: cx + 25
        y: cy + 30
        font: Font { size: 24}
        fill: Color.GREEN
        content: ctext
        }
     ]
    }





}

def bt1=CalcBatton{ cx: 10, cy: 80,ctext: "1"}

def bt2=CalcBatton{ cx: 80, cy: 80,ctext: "2"}

def bt3=CalcBatton{ cx: 150, cy: 80,ctext: "3"}

def bt4=CalcBatton{ cx: 220, cy: 80,ctext: "4"}

def bt5=CalcBatton{ cx: 10, cy: 130,ctext: "5"}

def bt6=CalcBatton{ cx: 80, cy: 130,ctext: "6"} 

def bt7=CalcBatton{ cx: 150, cy: 130,ctext: "7"}

def bt8=CalcBatton{ cx: 220, cy: 130,ctext: "8"}

def bt9=CalcBatton{ cx: 10, cy: 180,ctext: "9"}

def bt0=CalcBatton{ cx: 80, cy: 180,ctext: "0"}

def bt_add = CalcBatton{ cx: 150, cy: 180,ctext: "+"}

def bt_sub = CalcBatton{ cx: 220, cy: 180,ctext: "-"}

def bt_mul=CalcBatton{ cx: 10, cy: 230,ctext: "*"}

def bt_div = CalcBatton{ cx: 80, cy: 230,ctext: "/"}

def bt_res = CalcBatton{ cx: 150, cy: 230,ctext: "="}

def bt_del = CalcBatton{ cx: 220, cy: 230,ctext: "C"}

var buttons = [bt1.group,bt2.group,bt3.group,

bt4.group,bt5.group,bt6.group,

bt7.group,bt8.group,bt9.group,

bt0.group,bt_add.group,bt_sub.group,

bt_mul.group,bt_div.group,bt_res.group,bt_del.group];

Stage {

title: "FX Калькулятор"

width: 300

height: 500

scene: Scene {

content:[ Text {

x: 20  y: 60

font: Font { size: 36}

fill: Color.GREEN

effect: DropShadow{ offsetX: 3 offsetY: 6}

content: bind cont

},buttons

]   

fill: LinearGradient { 

startX: 0.0, startY: 0.0, endX: 0.0, endY: 1.0, proportional: true

stops: [ 

Stop {offset: 0.0 color: Color.WHITE},

Stop {offset: 1.0 color: Color.LIGHTGREEN} 

]

} 

}

}
Результат — на рис 5

Рис 5
Приложение готово и даже работает


Что ещё?



Какие возможности JavaFX остались за рамками этого небольшого примера? Прямо скажем, немало. Начнём с того, что палитре среды присутствует множество графических примитивов. Это геометрические фигуры (вроде используемого нами Rectangle), градиенты (линейный градиент мы использовали для заливки калькулятора и кнопок), различные графические эффекты. JavaFX позволяет работать с готовыми изображениями, используя их в сценах и применяя к ним различные фотоэффекты, как-то затенение, смешение, размытость, трансформация и т.д., причём применять в любой комбинации.

Средствами JavaFX легко достигается анимация объектов (каюсь, хотел включить эту важную функциональность в наш калькулятор, но вовремя остановился.) и встраивается видео. Вот как просто это делается:



Stage {

title: "My Media Player"

scene: Scene{

content: MediaComponent {

mediaSourceURL: mediaUrl

volume: 0.5

visible:true

mediaPlayerAutoPlay: true

}

}

}



Поддерживаются все форматы, которые поддерживает платформа на котором исполняется приложение, при этом используются «родные» кодеки этой платформы. Если не находится нужного кодека, используется встроенный кроссплатформенный кодек On2 от компании On2 Technologies.

Разумеется всё вышеперечисленное можно применять в различных комбинациях. Примеры применения, с исходным кодом можно найти на сайте технологии JavaFX — http://www.javafx.com/samples. На рис 6 показан один из них - вращающийся трёхмерный куб, каждая грань которого работает как видеопроигрыватель, в котором можно открыть отдельный видеофрагмент.
Рис 6
В каждой грани независимый видеофрагмент (если хватит оперативки)

Разумеется у средства для создания RIA есть инструменты для построения именно Интернет приложений.

Прежде всего это объект javafx.io.http.HttpRequest, предоставляющий API для асинхронного взаимодействия с HTTP сервером (да, да, тот самый AJAX). Очень полезным представляется

javafx.data.pull.PullParser многопоточный парсер документов, с возможностью задания функции боратного вызова (callback) в качестве параметра. Ниже пример из руководства:


var total;
var title;

def parser = PullParser { 
  documentType: PullParser.XML; 
  input: anInputStreamThatContainsXML;
  onEvent: function(event: Event) {
  if (event.type == PullParser.START_ELEMENT) {
    if (event.qname.name == "ResultSet" and event.level == 0) {
      total = event.getAttributeValue(QName{name:"totalResultsAvailable"});
    }
  }else if (event.type == PullParser.END_ELEMENT) {
    if (event.qname.name == "Title" and event.level == 2) {
      title = event.text;
    }
   }
  }
}

parser.parse();
parser.input.close();
println("results: {total}, title: {title}");


Предусмотрена также работа с RESTFul Web Services (технология Representational State Transfer), встроенные парсеры XML и JSON, интеграция с JavaScript и технологией LiveConnect.



Среда разработки



такой пример как наш калькулятор вполне можно написать в простом текстовом редакторе, но современный процесс разработки (несмотря на мнение отдельных гиков) требует удобной и эффективной IDE, с возможностью отладки, профайлинга, рефакторинга и управления проектами, а также желательно с интеграцией с системой контроля версий контроля версий и многим другим.

И тут хорошие новости для программистов, привыкших работать в среде NetBeans. Начиная с версии 6.5, при установке соответствующего плагина теперь можно работать с JavaFX проектами с не меньшей эффективностью, что и с Java, используя дизайнер форм и прочие инструменты IDE.

Приверженцы другой популярной среды разработки, Eclipse, не остались обижены, плагин для работы с JavaFX доступен по адресу http://kenai.com/projects/eplugin/ .

Впрочем это всё для программистов, для дизайнеров же подготовлен набор инструментов под общим названием JavaFX Production Suite. Это плагины для пакетов

Adobe Photoshop и Adobe Illustrator позволяющие сохранять многослойные приложения в формате JavaFX (Save as JavaFX).

Он включает инструмент JavaFX Graphics Viewer, который позволяет графику без компиляции в байт код и SVG Converter, позволяющий сохранять графику в формате JavaFX и из этого него.



После знакомства с возможностями JavaFX естественно встаёт вопрос — каковы её перспективы? Какое место она может занять в быстро меняющемся IT мире? Сейчас на этот вопрос наверное никто ответить не может. Но в целом, платформа, имеющая все ключевые средства для построения RIA, с возможностью использования накопленных Java наработок, и уже сейчас имеющая вполне современные средства разработки, выглядит очень многообещающе.



Ссылки к статье:

Официальный сайт JavaFX - http://javafx.com/

Материалы по JavaFX на сайте российских разработчиков Sun Microsystems http://developers.sun.ru/javafx/

Русскоязычная wiki по JavaFX - http://ru.jfx.wikia.com/wiki/



Приложение



JavaFX Scripot — краткий обзор



В небольшом приложении я попытаюсь дать краткий обзор языку JavaFX Script, ровно до такой степени, чтобы читатель разобрался с кодом примера.

Следует сразу оговориться, что JavaFX Script это не Java, и вообще он имеет с Java довольно мало общего. Вторая оговорка — пусть вас не смущает слово Script в его названии. Он не является языком сценариев в том смысле, в котором им является, например JavaScript, ничего общего он не имеет с такими интерпретируемыми «скриптовыми» языками как PHP или Ruby. Прежде всего это декларативный язык. На практике это обозначает, что для построения приложения мы не описываем объекты и их методы, а определяем объекты сцены, определяем их атрибуты (в том числе поведение, реакцию на события). Но всё по порядку, сначала основы синтаксиса.



Основные типы данных



JavaFX имеет статическую типизация — тип переменной (они задаются с помощью ключевого слова var) определяется при её инициализации:



var name;

var age;

name=”John”;

age=35



Константы задаются с помощью ключевого слова def. Правила наименований переменных и констант схожи с языком Java.

Это же касается и наименований функций. Сами они задаются следующим образом:



function addTwo(a:Number):Number{

return a+2;

}



println(addTwo(4));



Как видим, разительное отличие синтаксиса java, заключается в указании типа возвращаемого значения не до а после объявления функции. Тоже и с её аргументами. Возможно причины такого синтаксического финта кроются в том, что продукт создавался с оглядкой на Adobe Flex. Впрочем, бог с ними, с грязными домыслами.

В языке присутствуют встроенные типы данных - String, Number, Integer, Boolean и Duration, которые также являются и объектами типов.

При определении типа String могут использоваться как двойные, так и одинарные кавычки. Для подстановки переменных или выражения внутри строки используются фигурные скобки:



var name='john';

println(«Hello {name}!»);



Типы Integer Number, предназначены для представления целочисленных значений и числа в плавающей точкой, соответственно. Boolean, как не сложно догадаться может принимать значения true или false. Он используется в управляющих конструкциях (if, else), которые имеют традиционный для java синтаксис.

Тип Duration используется для представления временных отрезков, пример:



var a = 10s; // 10 секунд



Имеется и знакомый по Java «пустой» тип Void (регистр - не опечатка), впрочем при объявлении функции, не возвращающей значение его можно опустить.

Для перечисляемых данных предусмотрен тип Последовательности (sequencesy), обладающий необходимыми методами:



var colors: String[] = ["Green","Red","Gray"];

insert "Black" into colors;

insert "Blue" after colors[1];



// теперь последовательность такая:

// ["Green","Red","Blue", "Gray","Black"];



delete "Gray" from colors;

delete colors[2];



// теперь:

// ["Green","Red",Black"];



var nums = [1..100];





В последнем случае генерируется последовательность из целых чисел, от о1 до 100.



Классы и объекты



классы в JavaFX определяются следующим образом:



class myObject{

var name: String;

var city: String;

var myRectangle: Rectangle;



function print_name() {

println("Name: {name}");

}

Вопросы тут может вызвать только тип данных Rectangle. Это один из многочисленных встроенных классов JavaXF, просмотреть его свойства и методы можно в документации по API JavaXF (http://java.sun.com/javafx/1.1/docs/api/).



Объекты описываются так:



def myObj = myObject {

name: "Vasya";

city: "Moscow";

number:5;

}

def myRectangle = Rectangle {

fill: Color.GREEN

width:60

height: 40

}



Первый из вышеприведённых объектов является экземпляром произвольного пользовательского класса, встрой — встроенного класса Rectangle. Вполне допустимы и композиции объектов:



def myObj=myObject {

name: "Vasya";

city: "Moscow";

number: "95050";

myRectangle: Rectangle {

fill: Color.GREEN

width:60

height: 40

}

}



Обращение к свойствам и методам объекта происходит посредством точечной нотации:



println( myObj.myRectangle.x);

println( myObj.=print_name());

Такие необходимые элементы ООП, как наследование и модификаторы доступа также наличествуют.



Связывание данных



Ключевой элемент языка JavaFX Script - возможность динамической привязки данных (data binding). Это возможность связать любой параметр с динамически изменяющейся переменной. Лучше всего применение связывания видно на примере видно, на примере:



var side= 15;



Scene {

content: [

SwingSlider {

minimum: 0

maximum: 50

value: side radius with inverse

vertical: false

},



Rectangle {

fill: Color.GREEN



width: bind side

height: bund side*2

}

]

}



В данном случае объект SwingSlider (стандартный скрол бар) определяет значение переменной side, с которой в свою очередь связаны размеры сторон объекта Rectangle (прямоугольник). Таким образом пользователь может менять размеры фигуры перемещая указатель скрола.

Ещё один интересный механизм JavaFX – триггеры, то есть конструкции представляющие собой блоки кода, исполняемые по какому-либо событию. Пример того как привязать блок кода к значению переменной:



var User = "Misha" on replace oldValue {

println("Пользователь изменился");

println("был: {oldValue}");

println("стал: {User}");

};



Такой код будет служить индикатором, печатая сообщения всякий раз при изменении значения переменной User.



На сцене



В основе любой программе на JavaFX, находиться объект Stage, представляющий собой древовидную структуру, содержащую в себе другие объекты приложения. Каждый узел такой системы, представляющий собой наследника от класса javafx.scene.Node,может также содержать в себе объекты.

Класс Node является полноценным контейнером, характеризующийся размерами, системой координат и реагирующим на события мыши. Объекты от него образованные можно трансформировать, объединять в группы, приметь к ним (как к отдельным, так и к группам) различные действия или графические эффекты.

Доступ к содержимому “Сцены” производиться через объект Scene , для добавления на необходимых объектов, следует импортировать соответствующие классы и описать объекты и их поведение внутри Scene.

Дальше – смотрите пример приведённый в статье.



Подробные уроки по языку JavaFX Script, на русском языке доступны на портале разработчиков Sun. По адресу http://developers.sun.ru/documents/javafx/FXTutorials/.



Подписи к рисункам:

1. Архитектура платформы JavaFX

2. Здраствуйте

3. Для калькулятора маловато кнопок

4. Теперь достаточно

5. Приложение готово и даже работает

Комментариев нет:

Отправить комментарий