Графические интерфейсы пользователя Java - Тимур Сергеевич Машнин
Шрифт:
Интервал:
Закладка:

Класс PathElement имеет свойство absolute – если true, тогда координаты элемента пути абсолютные, если false – тогда координаты указываются относительно предыдущего элемента пути.
Класс ArcTo обеспечивает формирование дуги от текущих координат к указанным координатам и имеет, помимо унаследованных от класса PathElement, собственные свойства: radiusX, radiusY, xAxisRotation, largeArcFlag, sweepFlag, x, y.
Класс ClosePath завершает фигуру Path, соединяя ее концы.
Класс CubicCurveTo обеспечивает формирование кубической кривой от текущих координат к указанным координатам и имеет, помимо унаследованных от класса PathElement, собственные свойства: controlX1, controlY1, controlX2, controlY2, x, y.
Класс HLineTo обеспечивает формирование горизонтальной линии от текущих координат к указанным координатам и имеет, помимо унаследованных от класса PathElement, собственное свойство x.
Класс LineTo обеспечивает формирование прямой линии от текущих координат к указанным координатам и имеет, помимо унаследованных от класса PathElement, собственные свойства х и у.
Класс MoveTo обеспечивает установку начальной позиции пути формирования фигуры Path и имеет, помимо унаследованных от класса PathElement, собственные свойства х и у.
Класс QuadCurveTo обеспечивает формирование квадратичной кривой от текущих координат к указанным координатам и имеет, помимо унаследованных от класса PathElement, собственные свойства: controlX, controlY, x, y.
Класс VLineTo обеспечивает формирование вертикальной линии от текущих координат к указанным координатам и имеет, помимо унаследованных от класса PathElement, собственное свойство у.
Кроме формирования из элементов PathElement фигура Path может быть создана с помощью статических методов intersect, subtract и union класса Path.
Приведенный здесь код демонстрирует пример создания фигуры Path.

Класс SVGPath представляет фигуру, созданную на основе SVG-пути языка разметки, и имеет, помимо унаследованных от класса Shape, собственные свойства: fillRule – определяет как области пересечения геометрических форм комбинируются для образования фигуры, также как и для пути Path, и свойство content – строка SVG-пути, состоящая из букв, определяющих команды, и чисел – параметров команд.

Стандартные команды SVG-пути это:
M (moveto) – переместить позицию (x,y).
L (lineto) – провести линию от текущей точки до указанной точки (x,y).
H – провести горизонтальную линию от текущей точки до указанной точки (x).
V – провести вертикальную линию от текущей точки до указанной точки (y).
Z – замкнуть фигуру.
C (curveto) – провести кривую Безье (x1 y1 x2 y2 x y).
Приведенный здесь код демонстрирует пример создания фигуры SVGPath.

Класс Text обеспечивает отображение текста.

Свойство text определяет отображаемый узлом Text текст,
свойство font – шрифт текста, свойства x и y – координаты текста,
свойство textAlignment – выравнивание текста по горизонтали.
С помощью свойств strikethrough и underline устанавливается перечеркивание и подчеркивание текста,
с помощью свойства wrappingWidth – ширина строки текста для его переноса на следующую строку.
Свойства boundsType и textOrigin определяют способ вычисления границ текста для его компоновки и начало системы координат текста в узле,
свойство baselineOffset возвращает смещение базовой линии текста по вертикали.
Приведенный здесь демонстрирует пример создания узла Text.

Узел Canvas позволяет вызывать операции рисования для отображения пользовательских фигур на экране.

Узел Canvas определяется шириной и высотой, которые определяют размер изображения, в рамках которого визуализируются команды рисования холста.
Все операции рисования привязаны к границам этого изображения.
Для рисования с помощью холста, сначала создается узел Canvas с шириной и высотой, а затем из него получается графический контекст, для которого вызываются различные команды рисования.
Здесь показана лишь небольшая часть этих команд.

Видно, что эти команды во многом дублируют возможности уже рассмотренных классов JavaFX 2D графики.
Преимущество здесь в том, что все эти возможности можно реализовать в пределах одного узла Canvas.
Кроме того, присоединяя слушателя курсора мыши к холсту, можно создать, например, редактор 2D графики.
Задание
Создать холст, на котором пользователь может рисовать различные фигуры.
Узел изображения ImageView
Класс ImageView представляет узел изображения.


Объект ImageView создается на основе объекта изображения, представленного классом Image, экземпляр которого может быть создан с помощью конструкторов.
Здесь видно, что изображение Image может быть загружено на основе входящего потока InputStream или URL адреса изображения.
Загрузка изображения также может быть выполнена с учетом параметров – это размеры изображения и его сглаживание при масштабировании.
Класс Image используется для загрузки изображения и имеет свойства для чтения: error, exception, height, progress, и width.
Свойства error и exception позволяют обработать ошибку загрузки изображения.
Свойства height и width позволяют получить размер загруженного изображения.
А свойство progress позволяет отследить процесс загрузки изображения.
Здесь показан пример обработки ошибки загрузки изображения и прогресса загрузки.

Мы присоединяем слушателя изменения соответствующего свойства, в обработчике которого получаем новое значение свойства.
Для свойства progress, мы связываем его значение со значением свойства progress индикатора загрузки.
После загрузки изображения мы устанавливаем его в узел ImageView методом setImage.
Свойства узла ImageView fitHeight и fitWidth позволяют подогнать загруженное изображение под указанные размеры, а свойство preserveRatio – сохранить при этом его пропорции.

Свойство smooth обеспечивает сглаживание при трансформации изображения,
свойство viewport дает возможность выделить в загруженном изображении его часть в виде прямоугольника и дальше работать в узле ImageView только с этой частью исходного изображения.
В отличие от свойства viewport, которое маскирует исходное изображение, свойство clip класса Node определяет маску самого узла ImageView.
При одновременном определении свойств x, y со свойствами layoutX, layoutY их значения складываются в конечные координаты узла ImageView в родительском узле Node.
Здесь показан пример создания узла ImageView.

Методами setFitHeight и setFitWidth мы подгоняем размеры изображения под указанные, при этом методом setPreserveRatio сохраняем исходные пропорции изображения.
Теперь, предположим у нас стоит задача загрузить изображение в узел ImageView.
Затем применить к этому узлу различные трансформации и эффекты.
И мы хотим сохранить этот узел обратно как изображение.
Как нам это сделать?
Первый способ сделать это – это использовать класс Robot пакета java.awt.
В этом случае создается скриншот участка экрана компьютера, который сохраняется в объект BufferedImage пакета java.awt.image.
В этом коде мы вычисляем координаты контейнера, в котором находится узел ImageView.

И на основе этих координат создаем прямоугольник.
Затем методом createScreenCapture класса Robot создаем скриншот экрана внутри этого прямоугольника.
И сохраняем этот скриншот в файл.
Однако при таком способе, если изображение большое и содержится, например, в панели ScrollPane, сохраняться будет только та часть изображения, которая фактически видна на экране компьютера.
Другой способ сохранения изображения – это применить к узлу графа сцены метод snapshot класса Node, возвращающий объект WritableImage пакета scene.image, который можно конвертировать в объект BufferedImage пакета awt.image методом fromFXImage класса SwingFXUtils.

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