Sdscompany.ru

Компьютерный журнал
9 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Java построение графиков

График в реальном времени на Java

У меня есть приложение, которое обновляет переменную от 5 до 50 раз в секунду, и я ищу какой-то способ рисования непрерывного XY-графика этого изменения в режиме реального времени.

хотя JFreeChart не рекомендуется для такой высокой скорости обновления, многие пользователи по-прежнему говорят, что он работает для них. Я пробовал использовать этой demo и изменил его для отображения случайной величины, но, похоже, все время использует 100% использование процессора. Даже если я проигнорирую это, я не хочу быть ограничен классом пользовательского интерфейса JFreeChart для построения форм (хотя я не уверен, каковы его возможности). Можно ли интегрировать его с «формами» и раскрывающимися меню Java? (как доступны в VB) в противном случае, есть ли какие-либо альтернативы, которые я мог бы изучить?

EDIT: Я новичок в Swing, поэтому я собрал код, чтобы проверить функциональность JFreeChart с ним (избегая при этом использования класса ApplicationFrame JFree, так как я не уверен как это будет работать с комбо-боксами и кнопками Swing). Сейчас график будет немедленно обновлена и ЦП. Можно ли буферизировать значение с помощью new Millisecond () и обновлять его, возможно, дважды в секунду? Кроме того, могу ли я добавить другие компоненты к остальной части JFrame без нарушения JFreeChart? Как мне это сделать? рамка.getContentPane ().добавить (новая кнопка («Click»)), кажется, перезаписывает график.

8 ответов

Если ваша переменная обновляется так быстро, нет смысла обновлять диаграмму каждый раз.

вы думали о буферизации изменений переменных и обновлении диаграммы в другом потоке, скажем, каждые 5s ? Вы должны обнаружить, что JFreeChart может хорошо обрабатывать такие скорости обновления.

поскольку JFreeChart является обычной настольной библиотекой, вы можете легко интегрировать ее со стандартным приложением Swing. Или вы можете использовать его для диаграммы через веб-приложение (путем рендеринга к JPEG / PNG и т. д. JFreeChart также может автоматически создавать карты изображений, поэтому вы можете использовать mouseovers и т. д.)

согласно этому сообщению в блоге:

его можно реализовать «в режиме реального времени» отображения звуковых спектров с помощью библиотеки KJ DSP:

поэтому, если вы можете обойтись довольно простыми диаграммами, это может быть альтернативой JFreeChart.

Если данные обновляются чаще, чем вы можете создать диаграмму, то у вас должна быть задача в отдельном потоке, который восстанавливает диаграмму и запускает другую регенерацию, когда это будет сделано. Нет смысла запускать его чаще, чем это, но если он окажется слишком большой нагрузкой на процессор, вы можете задушить частоту, с которой он перезапускается. Если обновления не поступают, вы не запускаете повторную генерацию. Я сделал что-то подобное в моем проект Zocalo недавно. Он делает все, кроме дросселирования.

отвечал здесь. Ваша переменная изменяется до 50 раз в секунду, но в большинстве случаев вам не нужно будет обновлять каждый раз при внесении изменений. Вместо этого вы можете обновлять график через регулярные промежутки времени (например, каждые 100 мс).

Ну, я также использую JFreechart для высоких обновлений. Jfreechart обновляет до 10 до 15 кадров в секунду, но с использованием 100% процессора. Но если я хочу обновить ее на более высокой частоте он не будет обновляться. Если вы найдете любую библиотеку, которая может быть обновлена на abt 20 fps и может быть использована для разработки приложения на Java, пожалуйста, предложите мне также. Я видел много библиотек JFreeChart ответы но я не уверен, что кто-то может использоваться для обновлений примерно на 20 fps.

вы должны попробовать диаграммы из VisualVM (часть JDK). Вступление:http://java.dzone.com/news/real-time-charts-java-desktop

для того, чтобы получить ваш процессор намного ниже 100% и позволить вашему GUI оставаться отзывчивым, вы должны дросселировать скорость обновления диаграммы. Максимальная скорость обновления около 24 кадров в секунду имеет смысл для графика в реальном времени; любой быстрее более или менее неразличим в любом случае. Если ваши данные поступают быстрее, чем эта скорость, вам просто нужно буферизировать их в фоновом режиме и обновить диаграмму на переднем плане с требуемой скоростью обновления. В следующем примере я использую XChart вместе с SwingWorker фоновый поток. Захват данных моделируется со скоростью один на каждые 5 мс, а график обновляется со скоростью 24 кадров в секунду. Эта концепция должна работать с jfreecharts или любой другой библиотекой диаграмм, а также с небольшими изменениями. Отказ от ответственности: я ведущий разработчик XChart.

может быть, вы можете использовать два потока. Один для обновления вашего переменного приоритета ведьмы равен 10. И второй поток, который рисует так быстро, как приоритет posible witch равен 5.

Мне пришлось сделать то же самое в игре, которую я пишу.

Устанавливаем SceneBuilder

В отличие от Swing где можно править код прямо в среде. Для JavaFX надо установить отдельное приложение где можно будет редактировать интерфейс.

Для этого идем сюда https://gluonhq.com/products/scene-builder/#download и скачиваем версию под свою систему.

Там кстати версии под разные java, желательно выбрать соответствующую вашей. Например, у нас в компьютерном классе всюду java 8, следовательно выбираем SceneBuidler под 8 версию.

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

по завершению установки SceneBuilder запустится

но он нам пока не нужен, так что можно его закрыть.

Создаем JavaFX приложение

Делаем новый проект типа JavaFX

назову его ExperimentCharts

получаем такую структуру проекта:

Принцип организации javafx интерфейса

Кликнем дважды на файлик sample.fxml чтобы открыть его и увидим там что-то такое:

fxml – это такой аналог java кода для разметки, как видите тут тоже есть всякие импорты. И есть тэги, определяющие что будет отображаться. В настоящий момент тут имеется один тэг GridPane, которые используется для выравнивания разных объектов по сетке.

Так как пока выравнивать нечего он используется тут своего рода в холостую.

Особо стоит обратить внимание на атрибут fx:controller в нем указан класс вместе с полным путем, в котором мы будем писать код для интерфейса.

Давайте теперь запустим приложение. Откроется такое окно:

на самом деле код, как и в любом другом приложении запустился из файла Main. Который выглядит так

Добавляем кнопку

Вернемся к файлу sample.fxml. Теперь запустим SceneBuidler, выбираем Open Project

и открываем наш файлик. Увидим что-то такое

Перетянем теперь кнопку на форму. Так как пока у нас пустой GridPane наша форма выглядит как пустота. Но тянуть можно:

Сохраним перетянутое Ctrl+S и переключимся обратно в Idea. И глянем что у нас выросло с файлике sample.fxml. Там у нас будет такое:

Тут видно, что выросла наша кнопка. И еще всякие Constraints появились, но на них можно не обращать внимание.

Читать еще:  Работа с базами данных java

Добавляем реакцию на нажатие

Теперь нам надо добавить реакцию на нажатие кнопки. Переключимся на файл Controller.java, там у нас пока пустота

Этот файл уже привязан к нашему sample.fxml, через атрибут fx:controller=”sample.Controller”. Поэтому мы можем сделать тут какую-нибудь функцию и привязать ее к кнопке.

Добавим функцию, которая выводит сообщение в консоль

запустим теперь приложение и кликнем на кнопку.

очевидно ничего не произойдет. Оно и понятно, ведь мы кнопке функцию не привязали.

Переключимся на SceneBuilder и привяжем кнопку к функции

не забудем сохранить, и запустим проект по-новому

Ура, реакция привязалась.

Читаем значение из текстового поля

Умение добавить реакцию это конечно важно, но не менее важно уметь считать значение из другого поля. Для этого мы будем использовать так называемые декораторы.

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

Прежде чем добавить элемент в SceneBuilder я создам в классе поле через которое образуется связь

теперь переключимся на SceneBuilder и добавим txtField, плюс привяжем его к нашему классу, делается это путем указания свойства fx:id:

если по какой-то причине у вас в этом поле ничего не высветилось, то можете смело вписать туда вручную txtInput.

Сохраним то что наделали в SceneBuilder и вернемся обратно в Idea. Если глянуть в файлик fxml то увидим

теперь вернемся в наш Controller и подправим метод showMessage:

В принципе вот и вся наука. Добавил поле в контроллер, добавил объект в SceneBuilder. Связал через fx:id, либо связал с методом. Можно теперь пилить что-нибудь посложнее.

Создаем приложение с графиками

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

В общем, идем в SceneBuilder и добавляем компоненты.

Мне не очень нравится GridPane так что я хочу заменить его на комбинацию HBox и VBox. Это контейнеры, которые позволяют выводить компоненты в виде строки либо в виде колонки. Комбинируя их можно получить больше свободы чем дает тот же GridPane.

Удаляем кнопки и поля для ввода

так как у формы может быть только один главный контейнер поэтому если мы хотим заменить GridPane на VBox, надо обернуть GridPane в VBox, делается это так:

а затем удаляем GridPane, получим в результате такое:

добавляем Label и ComboBox

кликаем дважды на Label чтобы переименовать его и пишем в нем Y

теперь добавляем график:

Отлично, теперь все сохраняем. И идем в IDEA.

Подключаем интерфейс к коду

Для начала, можно сразу заглянуть в sample.fxml, там будет такое:

сразу обратим на AreaChart

тут видим, что определены две оси. По X и по Y.

  • CategoryAxis – означает что в качестве координат оси X будут использоваться строки.
  • NumberAxis – ясно море, числовая ось.

Так как я собираюсь выводить зависимость одного числа от другого. То я поменяю CategoryAxis на NumberAxis.

Да-да, править разметку можно прямо в файле fxml. Часто, это весьма удобно.

переключаемся в наш Controller, и создаем поля чтобы привязать компоненты на форме к коду.

идем в sample.fxml и там указывем fx:id прямо в коде разметки, вот так

Заполняем ComboBox

По X я буду выводить количество продуктов, а для Y хочу давать возможность выбирать рассчитанный коэффициент из эксперимента.

Соответственно это самый ComboBox, он же выпадающий список надо заполнить возможными значениями.

Для этого в JavaFX предусмотрен интерфейс Initializable, который позволяет определить метод, который будет запускаться при инициализации формы. Делается это так:

правим метод initialize

запускаем main и тыкаем в выпадающий список, он должен быть заполнен

Пробуем вывести график

Для начала не будем сразу выводить данные из файла. Попробуем просто что-нибудь вывести. Сделаем это в методе initialize, чтобы сразу по запуску программы у нас рисовался график.

И так, правим метод initialize

Класс! Кстати там внизу ось подписана нулем, это можно поменять на что-то более осознанное

Подключаем данные экспериментов

Берем файлик с экспериментами из прошлой программы, и копируем себе в корень проекта

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

Теперь берем класс эксперимента их прошлой программы и тоже копируем себе.

Важно, чтобы путь к файлу Experiment.java совпадал с путем в исходном проекте, то есть вот так:

так как нас по сути интересуют только данные, можно удалить метод run чтобы не было всяких красных названий, типа

в итоге останется примерно такой класс:

чего вполне достаточно для построения графиков.

Выводим данные на графике

Сделаем так, чтобы данные с графика подкачались в момент загрузки формы, для этого подправим метод initialize

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

кстати вы возможно заметили, что размер открываемой формы не соответствует размеру формы в SceneBuilder, это потому что в классе main мы явно указываем размеры, давай их уберем:

а если вас раздражает что label с “X” уж как-то сильно зажат в левом верхнем углу, то можете добавить отступы:

не забываем сохранить (Ctrl+S)

Теперь если запустить будет хорошо:

Добавляем реакцию на выбор в ComboBox

Я хочу, чтобы, переключая опцию в выпадающем списке, у меня перерисовывался график. То есть по сути формировался новый набор данных и передавался графику на отрисовку.

Добавим метод в класс Controller, назовем его updateChart:

привяжем теперь этот метод к реакции на изменение значения в выпадающем списке:

сохраняем (Ctrl+S) и запускаем приложение

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

Оно и понятно, это потому что мы в нашем методе updateChart ни учитываем выбранное значение.

Доработаем наш код.

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

теперь подправим метод updateChart, будем смотреть какой пункт меню выбран и в зависимости от него строить выбранную зависимость:

запускаем и проверяем:

Добавляем кластерную гистограмму

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

Например, если по ходу эксперимента количество продуктов варьировалось от 10 до 510, то мы сделаем пять групп:

и соответственно получим график на которой будет видно, как много экспериментов попало в ту или иную группу

Правим код Controller

привязываем его к Controller:

не забываем сохранится, и правим метод updateBarChart

хм, а черт! Мы ж забыли вызывать метод updateBarChart, чтобы график рисовался. Добавим вызов его в initialize:

Читать еще:  Unable to minify javascript

Графика в Java. Graphics

Графический контекст компонентов

Графику в Java обслуживают классы Graphics и Graphics2D.

Работа с графикой осуществляется в графическом контексте элементов, унаследованных от класса Component. Понимать это можно так: на элементах управления, например, JFrame, JPanel, JButton и других, есть возможность рисовать. Такие элементы обладают графическим контекстом, в этом контескте мы и рисуем. Всё, что нарисуем в контексте будет показано на элементе. Классы Graphics и Graphics2D нужны для работы с графическим контекстом. Мы должны получить экземпляр такого класса и, используя его методы, рисовать. Получить экземпляр контекста можно в методе paint:

этот метод наследуется из класса Component. Аргумент Graphics g создаётся системой, а мы берём его в готовом виде и используем для рисования. При создании элемента метод paint будет вызван автоматически.

Начнём изучать работу с графикой в Java с класса Graphics.

Graphics

Рассмотрим простой пример использования методов класса Graphics в Java:

Получаем:

Ниже разбираются все методы, использованные в примере.

Как начертить прямую линию?

Метод drawLine класса Graphics начертит прямую линию:

здесь 20, 30 — это координаты x, y начала линии,
360, 30 — координаты конца линии.

Как задать цвет?

Метод setColor класса Graphics сделает текущим новый цвет:

Аргументы конструктора new Color(0, 0, 255) — это красный, зелёный и синий цвета соответственно (rgb).

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

А это чисто зеленый цвет:

Значения составляющих цвета изменяются от 0 до 255.

Светло-синий цвет, который мы использовали для заливки прямоугольника:

Как задать цвет фона?

Задать цвет фона можно методом setBackground:

Как нарисовать прямоугольник?

Методом drawRect класса Graphics:

20, 40 — это координаты верхнего левого угла прямоугольника;
340 — длина;
20 — высота прямоугольника.

Как залить прямоугольник цветом?

Методом fillRect класса Graphics:

Как нарисовать прямоугольник с закругленными углами?

Методом drawRoundRect класса Graphics.

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

первые 4 аргумента как у обычного прямоугольника. Пятый аргумент — 20 — это ширина прямоугольника, в который вписана часть овала сопряжения. Шестой аргумент — 15 — это высота прямоугольника, в который вписана часть овала сопряжения.

Как нарисовать овал?

Методом drawOval класса Graphics:

Аргументы определяют прямоугольник, в который вписан овал.

Как нарисовать окружность?

Методом drawOval класса Graphics:

Аргументы определяют прямоугольник, в который вписана окружность. Здесь рисуем овал, но длина и высота описанного прямоугольника равны, что и даёт окружность.

Как нарисовать дугу?

Методом drawArc класса Graphics:

первые 4 аргумента как у обычного прямоугольника. Пятый аргумент — 0 — это угол, от которого отсчитывается угол самой дуги. 180 — это угол дуги. Углы отсчитывают от горизонтальной оси: по часовой стрелке отрицательное направление, протв — положительное. В примере 180 градусов (величина дуги) отсчитываем от горизонтальной линии.

Как нарисовать многоугольник?

Методом drawPolygon класса Graphics:

Здесь создаём объект класса Polygon. arrayX — это х-координаты вершин многоугольника, arrayY — это y-координаты вершин многоугольника, 8 — число вершин многоугольника.

Как создать объект точки?

Для этого используем класс Point:

аргументы — это x, y координаты.

Как определить, что точка принадлежит многоугольнику?

Используем метод класса Polygon contains для определения лежит ли точка в многоугольнике.

Как вывести строку?

Методом drawString класса Graphics:

строка «Yes» будет выведена от точки с координатами 50, 190.

Как задать шрифт?

Для этого используем класс Font:

где «Tahoma» — название шрифта,
Font.BOLD|Font.ITALIC — жирный шрифт с наклоном,
40 — высота шрифта.

После задания шрифта мы делаем его текущим и выводим строку этим шрифтом:

Как задать цвет текста?

Чтоб задать цвет текста создадим и установим в графический контекст новый цвет:

Здесь мы создали чисто синий цвет. А теперь выводим строку синим цветом:

Как начертить график?

Как график функции начертить? Сначала начертим координатные оси:

А теперь построить график функции можно просто. Для этого используем метод drawPolyline класса Graphics:

График строим по точкам, xArray – это x-координаты точек, yArray – y-координаты точек графика, nPoint — это число точек.

Наш график являет собой кривую намагничивания. Но почему график такой угловатый (см. картинку выше)? Если взять больше точек, то график будет более плавным.

Построение графиков функций на основе визуального интерфейса апплетов Java

Дата добавления: 2015-06-12 ; просмотров: 4774 ; Нарушение авторских прав

Цель лабораторной работы: научиться строить графики функций, используя стандартные средства, предоставляемые библиотекой awt Java.

Попробуем научиться строить графики, используя апплеты Java. Сразу нужно оговориться, что существует множество платных и бесплатных библиотек, реализующих различные приемы построения графиков. Например, такая известная вещь, как jfreechart. Но наша задача – разобраться с принципами построения графиков с использованием стандартного инструментария.

Для рисования графика необходимо решить, где он будет в принципе располагаться. Не будем усложнять задачу и нарисуем наш график непосредственно на «поверхности» основного окна апплета. Для этого используем класса Graphics. При запуске апплета используем метод paint непосредственно для рисования графика. Наш начальный код будет выглядеть примерно так:

import java.applet.*;

import java.awt.*;

public class MyApplet extends Applet <

public void paint(Graphics g)

Этот код создаст пустое окно апплета. Теперь нужно нарисовать график. Сперва надо вспомнить принципы рисования на экране, которые в общих чертах практически одинаковы для любого языка программирования. Верхняя левая точка экрана (в нашем случае – окна апплета) является нулем декартовой двумерной системы координат. Отрицательные точки по умолчанию на экране не отображаются (что естественно), положительное направление по x – вправо, по y – вниз (рис.7). Это несколько не совпадает с привычным видом декартовой системы координат.

Для начала нужно решить, какого размера будет наш графический апплет. Пусть размер будет 800 на 800 точек. Сразу же нарисуем оси координат. Пусть ось абсцисс находится посередине (координата y = 400), а ось ординат- на 10 точек от левого края экрана (координата x = 10). Для рисования линий используем метод drawLine. Аргументы метода – 4 координаты (x0, y0, x1, y1), задающие две точки. Соответственно, на контейнере будет нарисован отрезок, проходящий через две точки. Код, задающий размер контейнера-апплета и оси координат, будет выглядеть следующим образом:

this.setSize(800, 800);

g.drawLine(10, 0, 10, 800);

g.drawLine(0, 400, 800, 400);

Теперь перейдем непосредственно к рисованию графика. Пусть это будет график функции 350* cos (0.05*x). Для вызова математической функции используется класс Math. Поскольку он входит в стандартный пакет Java, то его не нужно подключать с помощью инструкции import. При вызове функции нужно внимательно смотреть на тип аргументов для нее и в случае необходимости приводить тип. Так, функция cos класса Math, как и большинство остальных функций, работают с аргументами типа double. Мы будем подставлять в качестве аргумента переменную цикла, однако она будет целочисленного типа (int). В этом случае нас выручает то, что мы умножаем аргумент на 0.05, что автоматически приведет результат к типу double. Однако рисовать график будем с помощью того же метода drawLine, а его аргументы должны быть целочисленными. Для этого придется приводить результат к типу int. Для перебора значений аргумента x организуем цикл с помощью инструкции for. Итак, код для построения собственно графика функции:

Читать еще:  Javascript в url

for (int i=1; i

Java Swing 2D. Введение

Обзор Java 2D API

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

основные классы графического интерфейса

  • Graphics2D (расширение Graphics) — контекст вывода. Определяет текущее графическое состояние, а также методы графического вывода. Для обратной совместимости другие классы в определении своих методов указывают Graphics, хотя реально используют Graphics2D;
  • Color — цвет;
  • Font — шрифт;
  • Point (расширение Point2D) — точка;
  • Rectangle — четырехугольник;
  • Polygon — многоугольник;
  • BasicStroke — контур сложной духмерной фигуры;
  • AffineTransform — матрица преобразования координат;
  • BufferedImage (расширение Image) — изображение, можно использовать также для вне экранного вывода совместо с Graphics2D;
  • TexturePaint — используется для заполнения фигуры текстурой;
  • GradientPaint — используется для градиентного заполнения фигуры.

Цвет реализуется классом Color. В нем также определены статические члены стандартных цветов, как Color.white. Ниже приведен список методов Graphics2D для работы с цветом:

  • getBackground — получить цвет очищения области;
  • setBackground — установить цвет очищения области;
  • clearRect — очистить область;
  • setColor — установить текущий цвет вывода;
  • getColor — получить текущий цвет вывода;

фигуры

Поддерживаются следующие классы фигур:

  • Arc2D — дуга;
  • Area — область, составная фигура (например, четырехугольник минус эллипс);
  • CubicCurve2D — сегмент кубической кривой (сплайн);
  • Ellipse2D — эллипс;
  • QuadCurve2D — сегмент квадратичной кривой (сплайн);
  • Line2D — линия;
  • Rectangle2D — четырехугольник;
  • RoundRectangle2D — четырехугольник с закругленными углами;
  • Rectangle — четырехугольник;
  • Polygon — многоугольник;
  • BasicStroke — контур сложной духмерной фигуры.

Все эти классы реализуют интерфейс Shape:

  • contains — методы определения содержится ли указанная точка или четырехугольник внутри сложной фигуры;
  • intersects — определяет, пересекается ли сложная фигура с четырехугольником;
  • getBounds — возвращает ограничивающий сложную фигуру четырехугольник;
  • getPathIterator — возвращает итератор по сегментам сложной фигуры.

Ниже приведен список методов Graphics2D для вывода фигур. Методы с префиксом draw выводят контур фигуры, а с префиксом fill закрашенную фигуру. Кроме цвета для закраски могут использоваться изображения или цветовые градиенты, реализуемые классами TexturePaint, GradientPaint.

  • draw — сложная фигура;
  • draw3DRect — трехмерный четырехугольник;
  • drawArc — дуга;
  • drawLine — линия, также используется для вывода точки;
  • drawPolyline — вывод последовательности линий;
  • drawOval — овал;
  • drawPolygon — многоугольник;
  • drawRect — четырехугольник;
  • drawRoundRect — четырехугольник с закругленными углами.
  • fill — сложная фигура;
  • fill3DRect — трехмерный четырехугольник;
  • fillArc — дуга;
  • fillOval — овал;
  • fillPolygon — многоугольник;
  • fillRect — четырехугольник;
  • fillRoundRect — четырехугольник с закругленными углами.

текст и изображения

Методы Graphics2D для вывода символов и изображения:

  • drawBytes, drawChars — вывод символов;
  • drawString — вывод строки;
  • drawImage — вывод изображения.

преобразование координат

Методы Graphics2D для преобразование координат:

  • getTransform — получить копию текущей матрицы преобразований;
  • setTransform — установить матрицу преобразований;
  • rotate — добавление вращения к текущей матрице;
  • scale — добавление масштабирования к текущей матрице;
  • shear — добавления скоса к текущей матрице;
  • translate — добавление сдвига к текущей матрице.

область отсечения

Методы Graphics2D для работы с областью отсечения:

  • setClip — установить текущую область отсечения;
  • getClip — получить текущую область отсечения;
  • getClipBounds — получить четырехугольник окружающий область отсечения;
  • clipRect — сделать пересечение с текущией областью отсечения новой областью;
  • clip — сделать пересечение сложной фигуры с текущей областью отсечения новой областью.

интерактивность

Методы Graphics2D для интерактивности с пользователем:

  • hit — есть ли пересечение между фигурой и четырехугольником;
  • hitClip — есть ли пересечение между областью отсечения и четырехугольником;
  • дополнительно см. методы интерфейса Shape.

Пример вывода графики с помощью Swing 2D

Контекст вывода Graphics или Graphics2D забирает много системных ресурсов. Поэтому если вы их создаете явно из другого Graphics, компонента, BufferedImage и т.п. (обычно это метод getGraphics), то рекомендуется освободить ресурсы явно вызовом метода dispose.

Для вывода пользовательской графики обычно создается отдельный элемент управления, который затем размещается на главное окно. В нем перегружается метод paintComponent для Swing элементов, или методы paint и update для awt элементов.
В этих случаях ресурсы контекста вывода освобождаются автоматически.

Для сохранения родительского облика в методе можно сделать вызов super.paintComponent(g);. И далее дорисовать поверх. Для примера в нижеследующем коде замените JComponent на JButton и удалите очищение фона.

Работа с изображениями в Swing 2D

Изображения в java описываются классом BufferedImage, который объединяет в себе объект растровых данных Raster и объект цветовой модели ColorModel.

В свою очередь объект растровых данных состоит из объекта DataBuffer, содержащего
четырехугольный массив значений пикселей, и объекта SampleModel, описывающего организацию данных в массиве: число банков в DataBuffer, ширину и высоту изображения, тип значений в DataBuffer (например, TYPE_INT).

Объект ColorModel нужен для преобразования данных пикселя в значения составляющих цвета.

вывод в изображение

Для вывода в изображение всего лишь надо получить контекст вывода изображения. Например, в следующем коде создается изображение белого многоугольника на сиреневом фоне.

вывод изображения

Для вывода изображения в объекте контекста вывода Graphics2d есть несколько методов. Для краткости я опущу типы аргументов:

  • drawImage(img, x, y, observer)
  • drawImage(img, x, y, bgcolor,observer)
  • drawImage(img, x, y, width, height, bgcolor, observer)
  • drawImage(img, x, y, width, height, observer)
  • drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, bgcolor, observer)
  • drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, observer)

Первый аргумент везде само изображение.

x, y, width, height — четырехугольная область вывода.

dx1, dy1, dx2, dy2 — координаты четырехугольной области вывода.

sx1, sy1, sx2, sy2 — координаты четырехугольной части изображения, которая будет выведена.

В качестве значения аргумента observer можно указывать null. Данный аргумент нужен только при асинхронной работе с изображением.

bgcolor — цвет заднего фона для прозрачных частей изображения.

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

Графические форматы файлов.

Для манипуляций с графическими файлами в Java определен класс ImageIO.
При чтении ImageIO сам определяет формат файла. Список поддерживаемых форматов зависит от реализации Java, однако гарантируется поддержка jpeg, png, gif, bmp и wbmp. Список поддерживаемых форматов можно получить вызовом ImageIO.getWriterFormatNames()

Для теста создадим компонент, который при создании будет загружать изображение с диска, тут же его запишет обратно на диск в другом формате. А само изображение будет использоваться для оформления компонента.

Ссылка на основную публикацию
ВсеИнструменты 220 Вольт
Adblock
detector
×
×