JavaFX в действии

Продолжим знакомство с платформой JavaFX, предназначенной для создания RIA (Rich Internet Applications). Платформа эта, напомню, позиционируется корпорацией Sun Microsystems как альтернатива таким общепризнанным мэтрам, как Adobe Flash и Microsoft Silverlight.


Краткое содержание первой серии

В прошлый раз, если помните, мы с вами обсуждали преимущественно языковые особенности платформы, а именно - JavaFX Script, тот самый язык, который предлагается компанией Sun для написания RIA-приложений для этой платформы. Хотя язык этот мы обсудили в достаточно общих чертах, тем не менее, думаю, всё было достаточно понятно - ведь JavaFX Script довольно прост и весьма схож с Java.

Сейчас обсудим ещё некоторые особенности этого языка, а затем приступим непосредственно к тому, ради чего вообще за него взялись - то есть, к написанию наших с вами RIA-приложений.


Последовательности

 

В любом языке так или иначе приходится работать с наборами однотипных объектов. Их можно называть по-разному: коллекции, последовательности, множества, массивы... В разных языках программирования используются разные термины, и массив, пожалуй, самый широко используемый из них. Под массивом обычно понимают неиерархическую коллекцию объектов, расположенных рядом в памяти и доступных по индексу - номеру элемента в массиве. В JavaFX Script такая коллекция называется последовательностью.

Записать последовательность в этом языке программирования очень просто. Можно, например, сделать это следующим образом: "var weekDays: String[] = ["Mon","Tue","Wed", "Thu","Fri"];" (естественно, окружающие кавычки не нужны). Можно воспользоваться сокращённым синтаксисом объявления последовательности: "var days = ["Mon","Tue","Wed", "Thu","Fri","Sat","Sun"];". В первом объявлении мы указываем тип данных массива явно, во втором предоставляем возможность определить его компилятору. Для перечислимых типов данных синтаксис может быть ещё более простым: "var nums = [1...5];". Обращаться к элементам нужно так: "nums[0]".

Последовательности - довольно интересный тип данных в плане обращения с ними в программном коде. Две различные последовательности можно сравнивать обычным оператором "=", который вернёт истину только в том случае, если количество элементов в последовательностях одинаково, и элементы под одинаковыми номерами равны. Для манипуляций элементами есть специальные операторы, применяемые к последовательностям - sizeof, insert, delete, reverse. Нужны они, соответственно, для того, чтобы узнавать количество элементов в последовательности, вставлять в неё элементы, удалять их из неё и менять их порядок на обратный. Первый и последний операторы применяются ко всей последовательности, а второй и третий - к отдельным её элементам.


Привязка данных

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

В чём состоит суть привязки данных в этом языке программирования? В том, что когда вы меняете значение одного объекта, то меняется и значение привязанного объекта - автоматом, безо всяких дополнительных усилий с вашей стороны. Под объектом здесь понимается не только экземпляр какого-то класса, но и другая сущность в программе - переменная, функция, последовательность... В JavaFX Script'е для привязки используется оператор bind, а выглядит сама она так (без кавычек): "def y = bind x;". Заметьте, что хотя ключевым словом def мы определяем константы - переменные, которые нельзя изменить программно простым присвоением значения, мы можем менять их, если осуществим привязку к какой-либо переменной.

В общем-то, вполне очевидно, для чего именно была задумана привязка - она очень удобна тогда, когда нам нужно визуализировать значения каких-то переменных. Это очень простой и элегантный способ привязки внутренней логики приложения к его пользовательскому интерфейсу.

Думаю, простая привязка данных - вещь вполне очевидная. Давайте посмотрим на то, как можно осуществить привязку к функциям. Это продемонстрировано в листинге.

bound function makePoint(xPos : Number, yPos : Number) : Point {
 Point {
  x: xPos * 2
  y: yPos * 2
 }
}
class Point {
 var x : Number;
 var y : Number;
}
var myX = 2.0;
var myY = 4.0;
def pt = bind makePoint(myX, myY);
println(pt.x);
println(pt.y);

Первая часть листинга - та самая связанная функция, к которой и осуществляется потом привязка. Вторая часть - класс, экземпляр которого мы будем привязывать. Дальше идёт код, который демонстрирует привязку данных. Меняя значения myX и myY, вы сами легко сможете убедиться в том, что привязка данных действительно работает.


Триггеры

Раз уж мы поговорили о привязке данных, то стоит сказать, пожалуй, пару слов и о такой возможности, как триггеры - в практике программирования на JavaFX Script'е они явно будут не лишними.

Триггер - это некоторый код, который привязан к переменной. Он будет выполняться всякий раз, когда меняется значение этой переменной. Зачем это может понадобиться? Это способ реагировать на какие-то действия пользователя, изменения в привязанных к GUI переменных и т.д., и т.п.

Синтаксис объявления триггера, как и многое другое в JavaFX Script'е, прост. Пример вы можете увидеть в листинге.

var someVariable = "KV Forever!" on replace oldValue {
 println("Old Value: {oldValue}");
 println("New Value: {someVariable }");
};

Как несложно догадаться, код в листинге занимается тем, что печатает в консоли старое значение переменной (oldValue - но вы можете поменять название), а затем - новое (имя самой переменной). Стоит заметить, что триггер срабатывает и тогда, когда переменная инициализируются, и это необходимо учитывать при программировании триггеров.


Packages - куда ж без них, родимых

Всё-таки JavaFX Script ближе к Java, чем JavaScript, хотя многие и говорят, что обоих с Java роднит только название. Почему ближе? Потому что и в JavaFX Script вы найдёте такие знакомые до боли пакеты, призванные устранить хаос в организации файлов проекта. И это очень хорошо, потому что пакеты - замечательное средство структурирования программного кода и естественный способ разграничения пространств имён.

Как ни удивительно, пакеты объявляются ключевым словом package. Не слишком оригинально, зато привычно и доходчиво. К пакетам, как и в случае с Java, можно применять модификаторы доступа, о которых мы с вами довольно обстоятельно успели поговорить в прошлый раз - только, если помните, в JavaFX Script этих самых модификаторов несколько больше, чем в Java.

Собственно, о пакетах, наверное, сказать больше нечего, поэтому перейдём ко второму пункту нашей сегодняшней программы - построению приложений с использованием бегло изученного нами языка программирования на платформе JavaFX.


Приложения собственной персоной

В прошлый раз мы условились о том, что будем использовать стандартную среду разработки, предлагаемую Sun Microsystems - сиречь, NetBeans. Думаю, если вы действительно заинтересовались JavaFX (а если вы читаете уже вторую статью подряд, то есть все основания для подобных мыслей), то у вас уже есть всё нужное - и JavaFX SDK, и JDK, и NetBeans IDE. Впрочем, если нет, то всё нужное, напоминаю, можно скачать с сайта javafx.com.

Итак, давайте приступим. Запускаем NetBeans, некоторое время наслаждаемся заставкой, а потом находим в меню "Project" пункт "New". Среди предложенных вариантов выбираем единственный, связанный с JavaFX, и в появившемся на экране мастере нового проекта указываем его название и местоположение. Нажимаем ещё один раз "ОК" и получаем в своё распоряжение автоматически сгенерированный код, который будет выглядеть точь-в-точь так, как код в листинге.

package javafxapplication1;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.text.Text;
import javafx.scene.text.Font;
/**
* @author Vadim
*/
Stage {
 title: "Application title"
 width: 250
 height: 80
 scene: Scene {
  content: Text {
   font : Font {
    size : 16
   }
   x: 10, y: 30
   content: "Application content"
  }
 }
}

Первая строчка здесь - это, как вы можете сами легко увидеть, объявление пакета, внутри которого находится главный класс нашего с вами приложения. Затем идёт несколько импортов других полезных пакетов, без которых наше приложение не сможет полноценно работать. Потом идёт комментарий, сообщающий о том, кто именно написал этот код (хотя написала его, конечно, среда NetBeans, но это всё мелочи). Самое интересное здесь - это, конечно, Stage. Это - окно нашего приложения. Внутри Stage самое интересное - это Scene. Это так называема сцена, на которой и будет происходить всё то, что мы пожелаем.

Если мы запустим на выполнение тот код, который нам сгенерировала среда NetBeans, то увидим простое белое окно с надписью "Application content" - точно такое же, как на иллюстрации к статье. Негусто, но, в принципе, мне кажется, ждать чего-то большего от болванки приложения было бы, по крайней мере, несколько наивно. Но мы с вами, конечно же, на этом не остановимся, пусть даже и статья уже подходит к своему логическому завершению. О том, как это окно сделать живее и разнообразнее, мы с вами поговорим в следующий раз - ведь разговор о JavaFX ещё далеко не закончен!

Вадим СТАНКЕВИЧ,
dreamdrusch@tut.by

Версия для печатиВерсия для печати

Номер: 

18 за 2009 год

Рубрика: 

Software
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!