Продолжим знакомство с платформой 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
Горячие темы