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

Операторы

Операторы, используемые в языке JavaFX, знакомы тем, кто владеет другими языками программирования.

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

В JavaFX последовательности закрывают в квадратные скобки и пишут через запятую (вы уже сталкивались с ними при построении точек в Polyline) либо имеют вид [1..100], что означает все цифры от 1 до 100.

Выражение if

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

if (условие) then {событие1} else {событие2}.

В объяснении она не нуждается. Особенностью языка является то, что then можно не использовать.

Выражение for

Выражение for, использующееся для работы с последовательностями, имеет конструкцию: - for(последовательность) {событие}
Событие будет выполнено столько раз, сколько элементов содержится в последовательности. А теперь можно вернуться к написанию программы.

Когда плеер обрел видимую форму, нужно добавить к ней соответствующее содержание, т. е. мультимедийную часть.
Медийная система в JavaFX состоит из двух частей:

  1. Платформонезависимый слой как часть JavaFX SDK, на который не влияет операционная система; он важен для вас, поскольку непосредственно с ним вы и будете работать.
  2. Платформозависимый нижний слой, на котором происходит «общение» виртуальной машины с кодеками вашей операционной системы.

Из-за лицензионных и других ограничений далеко не все аудио- и видеофайлы будут проигрываться на поддерживаемых JavaFX операционных системах. Полностью поддерживаются только видеоформат FLV и всем известный аудиоформат MP3.

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

  • Media — сам мультимедиа­файл. В этом классе хранится информация об имени файла, его длине и разрешении видео.
  • MediaPlayer — промежуточный класс. У него нет никаких визуальных компонентов, но есть все функции для перемотки и регулирования звука и т.д.
  • MediaView предназначен лишь для вывода медиафайла на экран монитора. Можно накладывать на этот класс все эффекты, вращать его и сворачивать в трубочку, но вам это не потребуется.

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

Полностью готовый интерфейс нашего плеера

Система проигрывания музыки уже есть, но не хватает плейлиста. Для этого подойдет и обычный класс ListView (листинг 2), но вам понадобится переменная, в которой будет храниться список песен, — var fileList: String[].

Параметры, описывающие размеры компонента и его положение, были рассмотрены в предыдущей части данной статьи. А вот переменная items привязывается к списку песен и изменяется вместе с ним при добавлении либо удалении элементов последовательности.
Посмотрите на вашу форму. Красиво? Очень, но чего-то не хватает. Если поразмыслить, то поймете, что забыли добавить кнопку выключения вашего устройства. Начинайте с листинга (листинг 3).

Как видите, все очень просто. Вы создаете группу, в которую входят прямоугольник (в данном случае — квадрат) и две пересекающиеся линии, четко дающие представление о том, что эта кнопка делает. Но вы можете возразить, что ваши кнопки пока еще ничего не выполняют.

Именно так. До этого мы рассматривали исключительно визуальную форму плеера, но теперь уже видим полностью функционирующий элемент системы. Произошло это благодаря новой конструкции языка — событию. В JavaFX есть несколько видов событий, но вас в данном случае должны интересовать возникшие по вине пользователя. Он может нажать кнопку мыши и отпустить ее, покрутить колесико, а также нажать кнопку на клавиатуре. И сделать еще пару действий, но их мы обсудим ниже. Что же происходит в тот момент, когда осуществляется действие? Виртуальная машина Java перехватывает событие и делает то, что было заложено программистом.

Стоит упомянуть, что у JavaFX есть одна особенность, о которой необходимо знать любому программисту, — событие исполняется одновременно для всех слоев интерфейса. Что это значит? Примерно следующее: когда вы нажимаете на кнопку, то нажимаете и на ту форму, где она находится. В случае с кнопкой выключения плеера вас это должно мало волновать или даже скорее нисколько не волновать, но данное знание еще пригодится, когда вы запустите ваш плеер и решите, что было бы неплохо иметь возможность перемотать песню вперед/назад. Но обо всем по порядку.

В первом случае рассматриваем событие onMouseEvent, имеющее тип function(evt: MouseEvent): Void {}, где вас больше всего должен интересовать параметр evt типа MouseEvent.

Тип MouseEvent описывает все события, которые может произвести пользователь с мышью, а также все необходимые для этого параметры. Их достаточно много, и потому ограничимся лишь наиболее важными:

  • clickCount — количество нажатий на клавишу мыши;
  • button — кнопка мыши, изменившая свое состояние;
  • altDown, controlDown и shiftDown — нажаты ли соответствующие кнопки на клавиатуре;
  • primaryButtonDown, secondaryButtonDown, middleButtonDown — нажаты ли левая, правая или средняя кнопки мыши;
  • sceneX, sceneY — координаты события в сцене;
  • screenX, screenY — координаты события на всем экране;
  • x, y — координаты события внутри node;
  • wheelRotation — количество событий вращения колеса мыши.

Это все базовые переменные. Теперь рассмотрим конкретный пример:

onMouseClicked: function(evt: MouseEvent): Void {
    if ((evt.clickCount == 1) and (evt.button == MouseButton.PRIMARY)) then {
        FX.exit();
    }
}

Уже после одного взгляда на список приведенных выше переменных все становится предельно ясно — событие после then вызывается в том случае, если вы единожды (evt.clickCount == 1) нажали левую кнопку мыши (evt.button == MouseButton.PRIMARY). Что же происходит потом? Метод FX.exit() закрывает приложение. Вот и все. Основные функции ваше приложение выполняет — оно умеет запускаться и выключаться.

Теперь вы реализуете возможность убрать ваш плеер с экрана. Для этого создайте кнопку и поместите ее на сцену. Выглядеть она будет примерно так же, как и предыдущая, и потому весь текст приводить не стоит — он есть в архиве исходных текстов приложения на «Мир ПК-диске». Ниже лишь представлено, как подключить такую функцию в JavaFX (листинг 4).

 Переменная iconified, принимая значение true, сворачивает окно в Панель задач. Параметр Stage также позволяет задавать значки для программы с помощью переменной icons.

Теперь можно убрать плеер с глаз долой — в Панель задач, но разве такое положение устроит настоящего программиста? Этого определенно мало. А если захочется полюбоваться на свое детище, но при условии, чтобы оно не загораживало весь остальной экран? Правильно, для этого его нужно аккуратно отодвинуть в сторону. Все, что от вас требуется, — добавить следующие несколько строк в код оператор case (листинг 5).
Также допишите две строки в список переменных:

var beginPointX: Number;
var beginPointY: Number;

События onMouseEntered и onMouseExited выполняются тогда, когда мышь попадает в площадь формы или выходит из нее соответственно. Эти функции убирают список воспроизведения с экрана в том случае, если на плеер не наведен курсор мыши. Посмотрите на фрагмент программы (на «Мир ПК-диске»), описывающий список воспроизведения, и вы увидите то же самое (ListView не должен исчезать при наведении на него).

Так выглядит окно списка воспроизведения

Событие OnMousePressed вызывается при нажатии на элемент кнопкой мыши и в данном примере запоминает положение stage. Нажав кнопку, вы можете перетащить плеер в любую точку экрана посредством функции onMouseDragged. Понять принцип ее работы просто: координатам сцены присваиваются значения, соответствующие разнице между новым положением мыши и начальными координатами. На такой оптимистичной ноте закончим часть 2 статьи цикла, добавив, что исходники программы для нее имеются на «Мир ПК-диске».

Операторы языка JavaFX
Листинг 1, 2
Листинг 3
Листинг 4, 5