Разработка собственного графического редактора для рисования двумерной графики, используя язык программирования Java и интерфейсы прикладного программирования Java 2D
Обзор средств программирования трехмерной и двухмерной графики на Java. Ключевые особенности редактора The GIMP. Анализ функциональной панели управления редактора. Изучение понятия графического интерфейса пользователя. Основные методы класса Graphics.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 11.09.2019 |
Размер файла | 726,4 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Содержание
Введение
1. Постановка задачи
1.1 Входные и выходные данные
2. Проектирование приложения
2.1 Обоснование и выбор средств разработки
2.2 Разработки 2D Paint
Заключение
Список используемой литературы
Приложение
Введение
В последнее время ни одна электронная технология не развивалась так стремительно, как компьютерная графика. Благодаря ей художники сменили мольберт на экран компьютера, фотографы получили удобные инструменты для повышения качества снимков и лучшего их оформления. А о дизайнерах и говорить не приходится -- ведь какую бы область дизайна мы ни взяли, для каждой сегодня существуют специализированные графические приложения, позволяющие разработать все что угодно, начиная от простенькой визитки и заканчивая дизайном автомобиля или коттеджа. Правда, последнее относится уже к области 3D и потому выходит за рамки данного проекта.
Что же касается двумерной графики, то и ее возможности почти безграничны. Возьмем любой полиграфический продукт: и на упаковке стирального порошка, и на обложке модного журнала, и на коробке компакт-диска, и на огромном рекламном плакате у дороги -- изображения, которые разрабатывались или обрабатывались на компьютере. Разработка офисного стиля -- визиток, бланков и т.п. -- также ведется методами двумерной графики. Сюда же можно отнести и создание Web-сайта организации, правда это уже особое дизайнерское направление. Перед началом работы над проектом были рассмотрены несколько известных графических редакторов.
The GIMP - бесплатный графический редактор для фотографий и других растровых изображений, а также векторной графики. Программа успешно применяется в производстве логотипов, для цветовой корректировки фотоснимка, дизайна с использованием наслоения графических изображений. Программное обеспечение может удалять участки рисунка и производить конвертацию между разными типами файлов с графикой в палитрах rgb cmyk. Кроме того, редактор картинок обладает открытым исходым кодом, благодаря чему многие пользователи со знанием основ программирования адаптируют программу для собственных нужд.
Ключевые особенности редактора The GIMP:
· Комплексный набор инструментов для рисования (карандаш, кисть, клоны и пр.);
· Параллельная обработка нескольких открытых цифровых изображений;
· Средства трансформации (вращение, наклон, масштаб, отражение);
· Текстовое редактирование слоев за счет альфа-каналов;
· Пакетная обработка, фильтры, экспозиция;
· Анимационная графика в формате MNG;
· Сохранение истории цифровых изображений.
Графический редактор GIMP - программа для графического дизайна, достойная альтернатива редактору Аdobe Рhotoshop. Несколько запутанный интерфейс множеством окон может дезориентировать новичка, но привыкнув к системе, пользователь обязательно оценит огромный потенциал программы растровой и векторной графики. Если же привыкнуть не получилось, всегда можно скачать Фотошоп и платить за него ежемесячно.
Movavi Photo Editor - пожалуй, лучший полупрофессиональный растровый редактор. Он не поддерживает работу со слоями, не позволяет рисовать заурядную графику специальными кистями и не адаптирован для графического планшета. Но средство полностью отвечает требованиям рядового пользователя, любителя фотографии, до неприличия простое в управлении, приобретается один раз и навсегда, в отличие от «подписного» софта. Приложение уникальное в своем сегменте. С ним редактировать изображения могут даже новички.
Ключевые особенности Movavi Photo Editor:
· Высокое качество обработки в сумме с простым интерфейсом;
· Анимированные подсказки для сложных операций с примерами;
· Ручная и автоматическая коррекция на выбор пользователя;
· Обилие тонких настроек изображения;
· Десятки фильтров, эффектов и профилей;
· Продуманный инструмент ретуши вплоть до мельчайших элементов внешности.
Paint.NET - редактор фотографий для корректировки растровых и векторных изображений с высокой четкостью, доступный для бесплатной установки. Удобство работы с камерой и сканером делают бесплатный графический редактор картинок для Виндовс универсальным помощником квалифицированным фотографам. Также в сети вы найдете большое количество дополнительных плагинов для просмотра и редактирования снимков.
Ключевые особенности программы Paint.NET:
· Поддержка форматов svg, bmp, png, gif, tif, jpeg и pdn;
· Внешний вид понятный неопытному пользователю;
· Обработка изображений с наложением слоев;
· Инструменты для векторной графики (клонирование рисунков, «волшебная палочка», масштабирование, замена цвета);
· Длинная история графического редактора, ограниченная объемами диска;
· Вспомогательные эффекты (контраст, яркость, насыщенность, оттенок и 3D-вращение);
· Плагины расширяют возможности графического редактора и насыщают его спецэффектами;
· Слабое потребление ресурсов железа ПК;
· Поддержка режима 256 цветов - 8 бит.
Inkscape -- векторный графический редактор с развитыми функциональными возможностями, используемый для создания логотипов, визиток, плакатов и презентаций. Поддерживает большинство современных форматов файлов, умеет работать со слоями, обладает широким набором эффектов и фильтров.
Возможности Inkscape
· Векторизация растровой графики;
· Интегрированный редактор шрифтов;
· Позволяет устанавливать горячие клавиши;
· Встроенная опция коллективного рисования;
· Возможность применять фильтры и эффекты;
· Функция высококачественной печати проектов;
· Выделение, масштабирование, поворот объектов;
· Регулировка яркости, насыщенности, контрастности;
· Работа с контурами, фигурами, текстом и маркерами;
· Редактирование изображений в сжатом виде в формате gZip;
· Большое количество инструментов для создания векторной графики;
· Различные примеры и уроки по использованию Inkscape на сайте разработчика;
· Импорт файлов в формате JPEG, PNG, TIFF, GIF, BMP, RAS, TGA, WBMP, XBM, XPM, POV, DXF и т.д.
1. Постановка задачи
Целью моего курсового проекта является разработка собственного графического редактора для рисования двумерной графики, используя язык программирования Java и интерфейсы прикладного программирования Java 2D.
В настоящее время существуют множество программ для рисования двумерной графики , написанных для OC windows, с применением различных технологий программирования и разной степени сложности.
Поэтому моей основной задачей при разработке приложения является повышение навыков программирования на языке Java и приобретение практического опыта.
Данное приложение можно использовать как альтернативу стандартного windows приложения для создания графических изображений.
При разработке данной программы предполагается использование уже готовых компонентов и библиотек классов, так что в данной работе будет написан функционал приложения, а вся логика работы с графическими файлами уже написана. Последние несколько лет разработчики прилагали массу усилий, чтобы интегрировать графику и анимацию в свои апплеты и приложения Java. Однако первоначально включенные в Java графические пакеты AWT Java имели ограниченные средства для решения таких задач. Теперь же, используя интерфейсы прикладного программирования Java 2D, разработчики могут реализовывать гораздо более сложные графические приложения, включая игры, хранители экрана, экранные заставки . Программное обеспечение я назвал 2D Paint.
1.1 Входные и выходные данные
Для написания курсовой работы использовались следующие программы:
1. Язык программирования Java с версией jdk1.6.0.
2. Платформа, интегрированная под Java - NetBeans IDE 6.0.
Приложение разрабатываемые в данном курсовом проекте должно уметь создавать графические объекты и иметь следующие функции:
- создание изображения;
- редактирование изображения;
- сохранение изображения;
-загрузка изображения из файла.
Функциональная панель управления редактора предполагает наличие следующих кнопок:
-«карандаш»
-«ластик»
-«прямоугольник»
-«овал»
-«текст»
2. Проектирование приложения
2.1 Обоснование и выбор средств разработки
Программы, тесно взаимодействующие с пользователем, воспринимающие сигналы от клавиатуры и мыши, работают в графической среде. Каждое приложение, предназначенное для работы в графической среде, должно создать хотя бы одно окно, в котором будет происходить его работа, и зарегистрировать его в графической оболочке операционной системы, чтобы окно могло взаимодействовать с операционной системой и другими окнами: перекрываться, перемещаться, менять размеры, сворачиваться в ярлык.
В технологии Java графика осложняется тем, что приложения Java должны работать в любой или хотя бы во многих графических средах. Нужна библиотека классов, независимая от конкретной графической системы. В первой версии JDK задачу решили следующим образом: были разработаны интерфейсы, содержащие методы работы с графическими объектами. Классы библиотеки AWT реализуют эти интерфейсы для создания приложений. Приложения Java используют данные методы для размещения и перемещения графических объектов, изменения их размеров, взаимодействия объектов.
Библиотека классов Java, основанных на peer-интерфейсах, получила название AWT (Abstract Window Toolkit). При выводе объекта, созданного в приложении Java и основанного на peer-интерфейсе, на экран создается парный ему (peer-to-peer) объект графической подсистемы операционной системы, который и отображается на экране.
В версии JDK 1.1 библиотека AWT была переработана. В нее добавлена возможность создания компонентов, полностью написанных на Java и не зависящих от peer-интерфейсов. Такие компоненты стали называть "легкими" (lightweight) в отличие от компонентов, реализованных через peer-интерфейсы, названных "тяжелыми" (heavy).
Была создана обширная библиотека "легких" компонентов Java, названная Swing. В ней были переписаны все компоненты библиотеки AWT, так что библиотека Swing может использоваться самостоятельно, несмотря на то, что все классы из нее расширяют классы библиотеки AWT.
Библиотека классов Swing поставлялась как дополнение к JDK 1.1. В состав Java 2 SDK она включена как основная графическая библиотека классов, реализующая идею "100% Pure Java", наряду с AWT.
В Java 2 библиотека AWT значительно расширена добавлением новых средств рисования, вывода текстов и изображений, получивших название Java 2D, и средств, реализующих перемещение текста методом DnD (Drag and Drop).
Кроме того, в Java 2 включены новые методы ввода/вывода Input Method Framework и средства связи с дополнительными устройствами ввода/вывода, такими как световое перо или клавиатура Бройля, названные Accessibility.
Все эти средства Java 2: AWT, Swing, Java 2D, DnD, Input Method Framework и Accessibility составили библиотеку графических средств Java, названную JFC (Java Foundation Classes).
Компонент и контейнер
Основное понятие графического интерфейса пользователя (ГИП) -- компонент (component) графической системы. В русском языке это слово подразумевает просто составную часть, элемент чего-нибудь, но в графическом интерфейсе это понятие гораздо конкретнее. Оно означает отдельный, полностью определенный элемент, который можно использовать в графическом интерфейсе независимо от других элементов. Например, это поле ввода, кнопка, строка меню, полоса прокрутки, радиокнопка. Само окно приложения -- тоже его компонент. Компоненты могут быть и невидимыми, например, панель, объединяющая компоненты, тоже является компонентом.
В AWT компонентом считается объект класса Component или объект всякого класса, расширяющего класс component. В классе Component собраны общие методы работы с любым компонентом графического интерфейса пользователя. Этот класс -- центр библиотеки AWT.
Каждый компонент перед выводом на экран помещается в контейнер (Container). Контейнер "знает", как разместить компоненты на экране. Разумеется, в языке Java контейнер -- это объект класса Container или всякого его расширения. Прямой наследник этого класса -- класс JСomponent -- вершина иерархии многих классов библиотеки Swing.
Создав компонент -- объект класса Component или его расширения, следует добавить его к предварительно созданному объекту класса Container или его расширения одним из методов add ().
Класс Container сам является невидимым компонентом, он расширяет класс Component. Таким образом, в контейнер наряду с компонентами можно помещать контейнеры, в которых находятся какие-то другие компоненты, достигая тем самым большой гибкости расположения компонентов.
Иерархия классов AWT
Иерархию основных классов AWT составляют готовые компоненты: Button, Canvas, Checkbox, Choice, Container, Label, List, Scrollbar, TextArea, TextField, Menubar, Menu, PopupMenu, Menultem, CheckboxMenuItem. Если этого набора не хватает, то от класса Canvas можно породить собственные "тяжелые" компоненты, а от класса Component -- "легкие" компоненты (используемые в библиотеке Swing).
Основные контейнеры - это классы Panel, ScrollPane, Window, Frame, Dialog, FileDialog. Свои "тяжелые" контейнеры можно породить от класса Panel, а "легкие" -- от класса Container.
Целый набор классов помогает размещать компоненты, задавать цвет, шрифт, рисунки и изображения, реагировать на сигналы от мыши и клавиатуры.
СКРИНЫ ВСТАВИТЬ
Графические примитивы
При создании компонента, т. е. объекта класса Component, автоматически формируется его графический контекст (graphics context). В контексте размещается область рисования и вывода текста и изображений. Контекст содержит текущий и альтернативный цвет рисования и цвет фона -- объекты класса Color, текущий шрифт для вывода текста -- объект класса Font.
В контексте определена система координат, начало которой с координатами (0, 0) расположено в верхнем левом углу области рисования, ось Ох направлена вправо, ось Оу -- вниз. Точки координат находятся между пикселями.
Управляет контекстом класс Graphics или новый класс Graphics2D, введенный в Java 2. Поскольку графический контекст сильно зависит от конкретной графической платформы, эти классы сделаны абстрактными. Поэтому нельзя непосредственно создать экземпляры класса Graphics или Graphics2D. трехмерный графика редактор интерфейс
Однако каждая виртуальная машина Java реализует методы этих классов, создает их экземпляры для компонента и предоставляет объект класса Graphics методом getGraphics() класса Component или как аргумент методов paint() и update().
Методы класса Graphics
В следующей таблице приведены некоторые методы класса Graphics:
Таблица 1. Основные методы класса Graphics
Метод |
Описание |
|
Работа с цветом |
||
setColor (Color newColor) |
изменить текущий цвет |
|
getColor () |
получить текущий цвет |
|
Color(int red, int green, int blue) |
создает цвет, получающийся как смесь красной red, зеленой green и синей blue составляющих. Эта цветовая модель называется RGB. Каждая составляющая меняется от 0 (отсутствие составляющей) до 255 (полная интенсивность этой составляющей). |
|
Color(float red, float green, float blue) |
интенсивность составляющих можно изменять более гладко вещественными числами от 0.0 (отсутствие составляющей) до 1.0 (полная интенсивность составляющей) |
|
Color(int rgb) |
задает все три составляющие в одном целом числе. В битах 16--23 записывается красная составляющая, в битах 8--15 -- зеленая, а в битах 0--7 -- синяя составляющая цвета. |
|
Работа с чертежами |
||
drawLine(int xl, int yl, int х2, int y2) |
вычерчивает текущим цветом отрезок прямой между точками с координатами (xl, yl) и (х2, у2). |
|
drawRect(int x, int у, int width, int height) |
чертит прямоугольник со сторонами, параллельными краям экрана, задаваемый координатами верхнего левого угла (х, у), шириной width пикселей и высотой height пикселей |
|
drawOval(int x, int у, int width, int height) |
чертит овал, вписанный в прямоугольник, заданный аргументами метода. Если width = height, то получится окружность |
|
drawArc(int x, int у, int width, int height, int startAngle, int arc) |
чертит дугу овала, вписанного в прямоугольник, заданный первыми четырьмя аргументами. |
|
drawRoundRect (int x, int у, int width, int height, int arcWidth, int arcHeight) |
чертит прямоугольник с закругленными краями. Закругления вычерчиваются четвертинками овалов, вписанных в прямоугольники шириной arcWidth и высотой arcHeight, построенные в углах основного прямоугольника |
|
drawPolyline(int[] xPoints, int[] yPoints, int nPoints) |
чертит ломаную с вершинами в точках (xPoints[i], ypoints[i]) и числом вершин nPoints |
|
Работа с текстом |
||
drawstring (String s, int x, int y) |
выводит строку s |
|
drawBytes(byte[] b, int offset, int length, int x, int у) |
выводит length элементов массива байтов, начиная с индекса offset |
|
drawChars(chart] ch, int offset, int length, int x, int у) |
выводит length элементов массива символов ch, начиная с индекса offset |
|
Работа со шрифтами |
||
setFont(Font newFont) |
устанавливает текущий шрифт для вывода текста |
|
getFont () |
возвращает текущий шрифт |
|
Font (String name, int style, int size) |
задает Шрифт ПО имени name, со стилем style и размером size типографских пунктов. |
Возможности Java 2D
В системе пакетов и классов Java 2D, основа, которой-- класс Graphics2D пакета java.awt, имеется несколько принципиально новых положений.
§ Кроме координатной системы, принятой в классе Graphics и названной координатным пространством пользователя (User Space), введена еще система координат устройства вывода (Device Space): экрана монитора, принтера. Методы класса Graphics2D автоматически переводят (transform) систему координат пользователя в систему координат устройства при выводе графики.
§ Преобразование координат пользователя в координаты устройства можно задать "вручную", причем преобразованием способно служить любое аффинное преобразование плоскости, в частности, поворот на любой угол и/или сжатие/растяжение. Оно определяется как объект класса AffineTransform. Его можно установить как преобразование по умолчанию методом setTransform(). Возможно выполнять преобразование "на лету" методами transform и translate и делать композицию преобразований методом concatenate().
§ Поскольку аффинное преобразование вещественно, координаты задаются вещественными, а не целыми числами.
§ Графические примитивы: прямоугольник, овал, дуга и др., реализуют теперь новый интерфейс shape пакета java.awt. Для их вычерчивания можно использовать новый единый для всех фигур метод draw, аргументом которого способен служить любой объект, реализовавший интерфейс shape. Введен метод fill, заполняющий фигуры-- объекты класса, реализовавшего интерфейс shape.
§ Для вычерчивания (stroke) линий введено понятие пера (реп). Свойства пера описывает интерфейс stroke. Класс Basicstroke реализует этот интерфейс. Перо обладает четырьмя характеристиками:
Ш оно имеет толщину (width) в один (по умолчанию) или несколько пикселей;
Ш оно может закончить линию (end cap) закруглением -- статическая константа CAP_ROUND, прямым обрезом -- CAP_SQUARE (по умолчанию), или не фиксировать определенный способ окончания -- CAP_BUTT;
Ш оно может сопрягать линии (line joins) закруглением -- статическая константа JOIN_ROOND, отрезком прямой -- JOIN_BEVEL, или просто состыковывать -- JOIN_MITER (по умолчанию);
Ш оно может чертить линию различными пунктирами (dash) и штрих-пунктирами, длины штрихов и промежутков задаются в массиве, элементы массива с четными индексами задают длину штриха, с нечетными индексами -- длину промежутка между штрихами.
§ Методы заполнения фигур описаны в интерфейсе Paint. Три класса реализуют этот интерфейс. Класс color реализует его сплошной (solid) заливкой, класс GradientPaint -- градиентным (gradient) заполнением, при котором цвет плавно меняется от одной заданной точки к другой заданной точке, класс Texturepaint -- заполнением по предварительно заданному образцу (pattern fill).
§ Буквы текста понимаются как фигуры, т. е. объекты, реализующие интерфейс shape, и могут вычерчиваться методом draw с использованием всех возможностей этого метода. При их вычерчивании применяется перо, все методы заполнения и преобразования.
§ Кроме имени, стиля и размера, шрифт получил много дополнительных атрибутов, например, преобразование координат, подчеркивание или перечеркивание текста, вывод текста справа налево. Цвет текста и его фона являются теперь атрибутами самого текста, а не графического контекста. Можно задать разную ширину символов шрифта, надстрочные и подстрочные индексы. Атрибуты устанавливаются константами класса TextAttribute.
§ Процесс визуализации (rendering) регулируется правилами (hints), определенными Константами класса RenderingHints.
С такими возможностями Java 2D стала полноценной системой рисования, вывода текста и изображений.
2.2 Разработки 2D Paint
В данной работе я создал графический редактор 2D Paint.
Идеей моего проекта является использование двухмерной графики на Java для создания удобного и многофункционального графического редактора.
Для реализации проекта мне потребовалась изучить подробно графику на Java и разработки вышеперечисленных программных интерфейсов Java 2D.
На первом этапе я создал саму визуальную оболочку (каркас графического редактора);
На втором этапе я планирую создать панель с двухмерной графикой, которая будет рисовать: линии, прямоугольники, треугольники и другие элементы, с возможностью изменения цвета, затирания, трансформации.
В начала проекта, используя программное обеспечение NetBeans IDE 6.0, я создал так называемый каркас приложения (Рис 1). Все кнопки и панели (меню, управления) находятся в пакетах SWING и AWT.
СКРИНЫ
Рис 1. Графический редактор 3D Paint заменить
На левой панели приложения располагаются кнопки с инструментами, на верхней панели панели кнопки управления выбора цвета и ********* Панели расположены при помощи раскладчика BorderLayout (раскладчик по сторонам света). А кнопки на этих панелях располагаются при помощи раскладчика FreeDesignLayout.
СКРИНЫ СКРИНЫ
Также в программе есть возможность управления цветом. Можно менять как цвет фона, так и цвет самого объекта. Управление цветом осуществляется при помощи класса ColorChooser из пакета javax.swing. Цвет можно менять с помощью разных систем задания цвета. ColorChooser содержит три системы RGB, HSB и Swatches.
Рисунок 6. Окно приложения после запуска.
Для удобства в программе создана панель меню, содержащая меню-бар «Файл» и «Справка» из класса JMenyBar. А меню-бар содержит вкладки «Выход» и «О 3DPaint» из класса JMeny.
При нажатии на вкладку в меню «О 3DPaint» выходит диалоговая панель, принадлежащая пакету javax.swing, содержащая информацию о программном обеспечении, версии и создателе.
СКРИНЫ
Руководство пользователя
(ЗАМЕНИТЬ НА СВОЕ)
Окно программного средства после запуска выглядит следующим образам :
Как видно на рисунке 6, программа имеет простой интерфейс и достаточно простое управление. Приведем краткое описание основных функций:
Кнопка на рисунке 7 предназначена для начала записи звуковой информации. Если запись звуковой информации уже происходит то эта кнопка поставит запись на паузу.
Рисунок 7. Кнопка начла записи и паузы.
На рисунке 8 мы видим приложение во время записи звуковой информации.
Рисунок 8. Окно приложения во время записи.
Кнопка на рисунке 9 предназначена для остановки записи. При ее нажатии появится диалоговое окно которое будет предлагать внести имя записи и сохранить ее.
Рисунок 9. Кнопка окончания записи.
На рисунке 10 представлено окно программы после окончания записи звуковой информации.
Рисунок 10. Окно приложения после нажатия кнопки окончания записи.
Рисунок 11. Кнопка начала проигрывания записи.
Кнопка на рисунке 1 предназначена для начала воспроизведения аудиофайла. Также для воспроизведения аудиофайла можно кликнуть два раза по соответствующему файлу в списке.
Кнопка на рисунке 12 предназначена для остановки аудиопотока.
Рисунок 12. Кнопка ”Стоп”.
Кнопка на рисунке 13 предназначена для приостановки аудиопотока (паузы). Чтоб возобновить воспроизведение нужно нажать кнопку начала проигрывания записи.
Рисунок 13. Кнопка ”Пауза”.
Чтоб получить информацию о файле нужно один раз кликнуть левой кнопкой мыши по соответствующему файлу в списке.
Для изменения громкости звука аудиопотока имеется ползунок отображенный на рисунке 14.
Рисунок 14. Ползунок регулировки громкости.
Чтобы изменить качество звука нужно выбрать соответствующий элемент управления рисунок 15.
Рисунок 15. Окно настройки качества записи.
Для удаления записи из списка нужно кликнуть правой кнопкой по соответствующей записи и выбрать пункт “Удалить”.
Заключение
Этим завершается наше рассмотрение графики на Java. В этой работе мы представили краткий обзор средств программирования трехмерной и двухмерной графики на Java. Мы показали, что эффективность, расширяемость и простота Java 2D делает этот интерфейс прикладного программирования отличным выбором для разработчиков, стремящихся встроить в свои приложения трехмерную графику. Мы представили приложение, которое демонстрируют использование геометрических фигур, текстур, освещения и поведений в Java 2D.
Мы обсудили некоторые графические возможности Java. Мы начали с краткого знакомства с фундаментальными основами графики, такими как системы координат и графические контексты. Затем мы обсудили средства Java 2D. Мы также вкратце рассказали, как использовать графические эффекты.
Используя классы Java 2D мы создали простой графический редактор 2D Paint, который дает возможность пользователю ******
Список используемой литературы
1. Х. М. Дейтел, П.Дж. Дейтел, С.И. Сантри - Технологии программирования на Java, книга 1 (графика, JAVABEANS, интерфейс пользователя)
2. Джуди Бишоп - Эффективная работа Java
3. James Gosling, Bill Joy, Guy Steele, Gilad Bracha - The Java Language Specification, Second Edition.
4. Tim Lindholm, Frank Yellin - The Java Virtual Machine Specification, Second Edition.
5. Гослинг Дж., Арнольд К. - Язык программирования Java
Приложение
Исходный код программы
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.image.*;
import javax.imageio.*;
import javax.swing.filechooser.FileFilter;
public class ImageEdit
{
// Режим рисования
int rezhim=0;
int xPad;
int xf;
int yf;
int yPad;
int thickness;
boolean pressed=false;
// текущий цвет
Color maincolor;
MyFrame f;
MyPanel japan;
JButton colorbutton;
JColorChooser tcc;
// поверхность рисования
BufferedImage imag;
// если мы загружаем картинку
boolean loading=false;
String fileName;
public ImageEdit()
{
f=new MyFrame("Графический редактор");
f.setSize(350,350);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
maincolor=Color.black;
JMenuBar menuBar = new JMenuBar();
f.setJMenuBar(menuBar);
menuBar.setBounds(0,0,350,30);
JMenu fileMenu = new JMenu("Файл");
menuBar.add(fileMenu);
Action loadAction = new AbstractAction("Загрузить")
{
public void actionPerformed(ActionEvent event)
{
JFileChooser jf= new JFileChooser();
int result = jf.showOpenDialog(null);
if(result==JFileChooser.APPROVE_OPTION)
{
try
{
// при выборе изображения подстраиваем размеры формы
// и панели под размеры данного изображения
fileName = jf.getSelectedFile().getAbsolutePath();
File iF= new File(fileName);
jf.addChoosableFileFilter(new TextFileFilter(".png"));
jf.addChoosableFileFilter(new TextFileFilter(".jpg"));
imag = ImageIO.read(iF);
loading=true;
f.setSize(imag.getWidth()+40, imag.getWidth()+80);
japan.setSize(imag.getWidth(), imag.getWidth());
japan.repaint();
} catch (FileNotFoundException ex) {
JOptionPane.showMessageDialog(f, "Такого файла не существует");
}
catch (IOException ex) {
JOptionPane.showMessageDialog(f, "Исключение ввода-вывода");
}
catch (Exception ex) {
}
}
}
};
JMenuItem loadMenu = new JMenuItem(loadAction);
fileMenu.add(loadMenu);
Action saveAction = new AbstractAction("Сохранить")
{
public void actionPerformed(ActionEvent event)
{
try
{
JFileChooser jf= new JFileChooser();
// Создаем фильтры файлов
TextFileFilter pngFilter = new TextFileFilter(".png");
TextFileFilter jpgFilter = new TextFileFilter(".jpg");
if(fileName==null)
{
// Добавляем фильтры
jf.addChoosableFileFilter(pngFilter);
jf.addChoosableFileFilter(jpgFilter);
int result = jf.showSaveDialog(null);
if(result==JFileChooser.APPROVE_OPTION)
{
fileName = jf.getSelectedFile().getAbsolutePath();
}
}
// Смотрим какой фильтр выбран
if(jf.getFileFilter()==pngFilter)
{
ImageIO.write(imag, "png", new File(fileName+".png"));
}
else
{
ImageIO.write(imag, "jpeg", new File(fileName+".jpg"));
}
}
catch(IOException ex)
{
JOptionPane.showMessageDialog(f, "Ошибка ввода-вывода");
}
}
};
JMenuItem saveMenu = new JMenuItem(saveAction);
fileMenu.add(saveMenu);
Action saveasAction = new AbstractAction("Сохранить как...")
{
public void actionPerformed(ActionEvent event)
{
try
{
JFileChooser jf= new JFileChooser();
// Создаем фильтры для файлов
TextFileFilter pngFilter = new TextFileFilter(".png");
TextFileFilter jpgFilter = new TextFileFilter(".jpg");
// Добавляем фильтры
jf.addChoosableFileFilter(pngFilter);
jf.addChoosableFileFilter(jpgFilter);
int result = jf.showSaveDialog(null);
if(result==JFileChooser.APPROVE_OPTION)
{
fileName = jf.getSelectedFile().getAbsolutePath();
}
// Смотрим какой фильтр выбран
if(jf.getFileFilter()==pngFilter)
{
ImageIO.write(imag, "png", new File(fileName+".png"));
}
else
{
ImageIO.write(imag, "jpeg", new File(fileName+".jpg"));
}
}
catch(IOException ex)
{
JOptionPane.showMessageDialog(f, "Ошибка ввода-вывода");
}
}
};
JMenuItem saveasMenu = new JMenuItem(saveasAction);
fileMenu.add(saveasMenu);
japan = new MyPanel();
japan.setBounds(30,30,260,260);
japan.setBackground(Color.white);
japan.setOpaque(true);
f.add(japan);
JToolBar toolbar = new JToolBar("Toolbar", JToolBar.VERTICAL);
JButton penbutton = new JButton(new ImageIcon("pen.png"));
penbutton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
rezhim=0;
}
});
toolbar.add(penbutton);
JButton brushbutton = new JButton(new ImageIcon("brush.png"));
brushbutton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
rezhim=1;
}
});
toolbar.add(brushbutton);
JButton lasticbutton = new JButton(new ImageIcon("lastic.png"));
lasticbutton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
rezhim=2;
}
});
toolbar.add(lasticbutton);
JButton textbutton = new JButton(new ImageIcon("text.png"));
textbutton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
rezhim=3;
}
});
toolbar.add(textbutton);
JButton linebutton = new JButton(new ImageIcon("line.png"));
linebutton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
rezhim=4;
}
});
toolbar.add(linebutton);
JButton elipsbutton = new JButton(new ImageIcon("elips.png"));
elipsbutton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event)
{
rezhim=5;
}
});
toolbar.add(elipsbutton);
JButton rectbutton = new JButton(new ImageIcon("rect.png"));
rectbutton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
rezhim=6;
}
});
toolbar.add(rectbutton);
toolbar.setBounds(0, 0, 30, 300);
f.add(toolbar);
// Тулбар для кнопок
JToolBar colorbar = new JToolBar("Colorbar", JToolBar.HORIZONTAL);
colorbar.setBounds(30, 0, 260, 30);
colorbutton = new JButton();
colorbutton.setBackground(maincolor);
colorbutton.setBounds(15, 5, 20, 20);
colorbutton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
ColorDialog coldi = new ColorDialog(f,"Выбор цвета");
coldi.setVisible(true);
}
});
colorbar.add(colorbutton);
JButton redbutton = new JButton();
redbutton.setBackground(Color.red);
redbutton.setBounds(40, 5, 15, 15);
redbutton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
maincolor = Color.red;
colorbutton.setBackground(maincolor);
}
});
colorbar.add(redbutton);
JButton orangebutton = new JButton();
orangebutton.setBackground(Color.orange);
orangebutton.setBounds(60, 5, 15, 15);
orangebutton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
maincolor = Color.orange;
colorbutton.setBackground(maincolor);
}
});
colorbar.add(orangebutton);
JButton yellowbutton = new JButton();
yellowbutton.setBackground(Color.yellow);
yellowbutton.setBounds(80, 5, 15, 15);
yellowbutton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
maincolor = Color.yellow;
colorbutton.setBackground(maincolor);
}
});
colorbar.add(yellowbutton);
JButton greenbutton = new JButton();
greenbutton.setBackground(Color.green);
greenbutton.setBounds(100, 5, 15, 15);
greenbutton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
maincolor = Color.green;
colorbutton.setBackground(maincolor);
}
});
colorbar.add(greenbutton);
JButton bluebutton = new JButton();
bluebutton.setBackground(Color.blue);
bluebutton.setBounds(120, 5, 15, 15);
bluebutton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
maincolor = Color.blue;
colorbutton.setBackground(maincolor);
}
});
colorbar.add(bluebutton);
JButton cyanbutton = new JButton();
cyanbutton.setBackground(Color.cyan);
cyanbutton.setBounds(140, 5, 15, 15);
cyanbutton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
maincolor = Color.cyan;
colorbutton.setBackground(maincolor);
}
});
colorbar.add(cyanbutton);
JButton magentabutton = new JButton();
magentabutton.setBackground(Color.magenta);
magentabutton.setBounds(160, 5, 15, 15);
magentabutton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
maincolor = Color.magenta;
colorbutton.setBackground(maincolor);
}
});
colorbar.add(magentabutton);
JButton whitebutton = new JButton();
whitebutton.setBackground(Color.white);
whitebutton.setBounds(180, 5, 15, 15);
whitebutton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
maincolor = Color.white;
colorbutton.setBackground(maincolor);
}
});
colorbar.add(whitebutton);
JButton blackbutton = new JButton();
blackbutton.setBackground(Color.black);
blackbutton.setBounds(200, 5, 15, 15);
blackbutton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
maincolor = Color.black;
colorbutton.setBackground(maincolor);
}
});
colorbar.add(blackbutton);
colorbar.setLayout(null);
f.add(colorbar);
tcc = new JColorChooser(maincolor);
tcc.getSelectionModel().addChangeListener(new ChangeListener()
{
public void stateChanged(ChangeEvent e)
{
maincolor = tcc.getColor();
colorbutton.setBackground(maincolor);
}
});
japan.addMouseMotionListener(new MouseMotionAdapter()
{
public void mouseDragged(MouseEvent e)
{
if (pressed==true)
{
Graphics g = imag.getGraphics();
Graphics2D g2 = (Graphics2D)g;
// установка цвета
g2.setColor(maincolor);
switch (rezhim)
{
// карандаш
case 0:
g2.drawLine(xPad, yPad, e.getX(), e.getY());
break;
// кисть
case 1:
g2.setStroke(new BasicStroke(3.0f));
g2.drawLine(xPad, yPad, e.getX(), e.getY());
break;
// ластик
case 2:
g2.setStroke(new BasicStroke(3.0f));
g2.setColor(Color.WHITE);
g2.drawLine(xPad, yPad, e.getX(), e.getY());
break;
}
xPad=e.getX();
yPad=e.getY();
}
japan.repaint();
}
});
japan.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e) {
Graphics g = imag.getGraphics();
Graphics2D g2 = (Graphics2D)g;
// установка цвета
g2.setColor(maincolor);
switch (rezhim)
{
// карандаш
case 0:
g2.drawLine(xPad, yPad, xPad+1, yPad+1);
break;
// кисть
case 1:
g2.setStroke(new BasicStroke(3.0f));
g2.drawLine(xPad, yPad, xPad+1, yPad+1);
break;
// ластик
case 2:
g2.setStroke(new BasicStroke(3.0f));
g2.setColor(Color.WHITE);
g2.drawLine(xPad, yPad, xPad+1, yPad+1);
break;
// текст
case 3:
// устанавливаем фокус для панели,
// чтобы печатать на ней текст
japan.requestFocus();
break;
}
xPad=e.getX();
yPad=e.getY();
pressed=true;
japan.repaint();
}
public void mousePressed(MouseEvent e) {
xPad=e.getX();
yPad=e.getY();
xf=e.getX();
yf=e.getY();
pressed=true;
}
public void mouseReleased(MouseEvent e) {
Graphics g = imag.getGraphics();
Graphics2D g2 = (Graphics2D)g;
// установка цвета
g2.setColor(maincolor);
// Общие рассчеты для овала и прямоугольника
int x1=xf, x2=xPad, y1=yf, y2=yPad;
if(xf>xPad)
{
x2=xf; x1=xPad;
}
if(yf>yPad)
{
y2=yf; y1=yPad;
}
switch(rezhim)
{
// линия
case 4:
g.drawLine(xf, yf, e.getX(), e.getY());
break;
// круг
case 5:
g.drawOval(x1, y1, (x2-x1), (y2-y1));
break;
// прямоугольник
case 6:
g.drawRect(x1, y1, (x2-x1), (y2-y1));
break;
}
xf=0; yf=0;
pressed=false;
japan.repaint();
}
});
japan.addKeyListener(new KeyAdapter()
{
public void keyReleased(KeyEvent e)
{
// устанавливаем фокус для панели,
// чтобы печатать на ней текст
japan.requestFocus();
}
public void keyTyped(KeyEvent e)
{
if(rezhim==3){
Graphics g = imag.getGraphics();
Graphics2D g2 = (Graphics2D)g;
// установка цвета
g2.setColor(maincolor);
g2.setStroke(new BasicStroke(2.0f));
String str = new String("");
str+=e.getKeyChar();
g2.setFont(new Font("Arial", 0, 15));
g2.drawString(str, xPad, yPad);
xPad+=10;
// устанавливаем фокус для панели,
// чтобы печатать на ней текст
japan.requestFocus();
japan.repaint();
}
}
});
f.addComponentListener(new ComponentAdapter() {
public void componentResized(java.awt.event.ComponentEvent evt) {
// если делаем загрузку, то изменение размеров формы
// отрабатываем в коде загрузки
if(loading==false)
{
japan.setSize(f.getWidth()-40, f.getHeight()-80);
BufferedImage tempImage = new BufferedImage(japan.getWidth(), japan.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D d2 = (Graphics2D) tempImage.createGraphics();
d2.setColor(Color.white);
d2.fillRect(0, 0, japan.getWidth(), japan.getHeight());
tempImage.setData(imag.getRaster());
imag=tempImage;
japan.repaint();
}
loading=false;
}
});
f.setLayout(null);
f.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new ImageEdit();
}
});
}
class ColorDialog extends JDialog
{
public ColorDialog(JFrame owner, String title)
{
super(owner, title, true);
add(tcc);
setSize(200, 200);
}
}
class MyFrame extends JFrame
{
public void paint(Graphics g)
{
super.paint(g);
}
public MyFrame(String title)
{
super(title);
}
}
class MyPanel extends JPanel
{
public MyPanel()
{ }
public void paintComponent (Graphics g)
{
if(imag==null)
{
imag = new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D d2 = (Graphics2D) imag.createGraphics();
d2.setColor(Color.white);
d2.fillRect(0, 0, this.getWidth(), this.getHeight());
}
super.paintComponent(g);
g.drawImage(imag, 0, 0,this);
}
}
// Фильтр картинок
class TextFileFilter extends FileFilter
{
private String ext;
public TextFileFilter(String ext)
{
this.ext=ext;
}
public boolean accept(java.io.File file)
{
if (file.isDirectory()) return true;
return (file.getName().endsWith(ext));
}
public String getDescription()
{
return "*"+ext;
}
}
}
Размещено на Allbest.ru
...Подобные документы
Разработка графического редактора для рисования двухмерной и трехмерной графики, используя язык программирования Java и интерфейсы прикладного программирования Java 2D и Java 3D. Создание графического редактора 3D Paint. Основные методы класса Graphics.
курсовая работа [197,5 K], добавлен 19.11.2009Изучение особенностей растровых и векторных графических редакторов. Создание графического редактора: выбор языка программирования, разработка структуры программы и алгоритма работы. Описание интерфейса программы. Руководство программиста и пользователя.
курсовая работа [1,3 M], добавлен 28.07.2013История создания языка Java. Основные принципы объектно-ориентированного программирования. Структура, особенности синтаксиса и примеры прикладных возможностей использования языка Java, его преимущества. Перспективы работы программистом на языке Java.
курсовая работа [795,9 K], добавлен 14.12.2012Создание языка программирования с помощью приложения "Java". История названия и эмблемы Java. Обзор многообразия современных текстовых редакторов. Обработка строки. Методы в классе String. Java: задачи по обработке текста. Примеры программирования.
курсовая работа [276,1 K], добавлен 19.07.2014Этапы развития, особенности и возможности языка программирования Java; происхождение названия. Приложения Sun Microsystems: идеи, примитивные типы. Python - высокоуровневый язык программирования общего назначения: структуры данных, синтаксис и семантика.
реферат [79,0 K], добавлен 23.06.2012История развития языка программирования Java. История тетриса - культовой компьютерной игры, изобретённой в СССР. Правила проведения игры, особенности начисления очков. Создание интерфейса программы, ее реализация в среде Java, кодирование, тестирование.
курсовая работа [168,1 K], добавлен 27.09.2013Изучение основных алгоритмов генерации различных видов фракталов. Выбор языка и среды программирования. Характеристика структурных элементов растрового графического редактора фракталов. Описание интерфейса приложения, порядок редактирования изображений.
курсовая работа [1,2 M], добавлен 04.04.2014Изучение объектно-ориентированного языка программирования Java, его функциональные возможности. Создание программного кода. Описание классов и методов, использованных в программе. Руководство пользователя, запуск сервера и клиентского приложения.
курсовая работа [1,8 M], добавлен 16.09.2015Язык Java как простой, обьектно-ориентированный, многопоточный язык программирования, разработанный компанией Sun Microsystems для расширения возможностей сети Internet. Типы данных, лексика и управляющие структуры данного языка программирования.
презентация [46,1 K], добавлен 25.04.2014Методология объектно-ориентированного программирования в Java. Понятия класса, объекта и объектной переменной. Динамическая и статическая объектные модели. Логическое структурирование приложения. Наследование в Java. Отличия интерфейсов от классов.
курс лекций [547,2 K], добавлен 01.05.2014Сетевые возможности языков программирования. Преимущества использования Java-апплетов. Классы, входящие в состав библиотеки java.awt. Создание пользовательского интерфейса. Сокетное соединение с сервером. Графика в Java. Значения составляющих цвета.
курсовая работа [508,1 K], добавлен 10.11.2014- Создание базы данных автомобилестроительного предприятия в виде настольного приложения на языке Java
Разработка логической схемы базы данных автомобилестроительного предприятия. Инфологическое моделирование системы. Создание графического интерфейса пользователя для базы данных средствами языка программирования Java. Тестирование программных средств.
курсовая работа [2,3 M], добавлен 16.12.2013 Язык программирования Java, история и предпосылки его создания. Переменные, именованные константы, массивы, перечисления. Интерфейсы и обратные вызовы в Java. Удаленный вызов процедуры: общие сведения. Передача параметров при удаленном вызове процедур.
курс лекций [526,7 K], добавлен 24.06.2009Особенности архитектуры Java. Технология Java Database Connectivity. Кроссплатформенность Java-приложений. Преимущества языка программирования. Логическая структура базы данных. Структура программного комплекса. Верификация программных средств.
курсовая работа [962,8 K], добавлен 13.01.2016Сущность, задачи и особенности объектно-ориентированного программирования. Создание и редактирование графических файлов при помощи различных инструментов рисования. Основные требования к аппаратному и программному обеспечению. Руководство пользователя.
курсовая работа [270,9 K], добавлен 09.03.2009Понятие пакета как объединения классов (java.awt, java.lang). Способы импорта, проблема конфликта (пакеты содержат классы с одинаковым именем). Особенности реализации интерфейса, его поля. Понятие наследования интерфейса. Общие методы классов-оболочек.
презентация [140,1 K], добавлен 21.06.2014Основа пользовательского интерфейса. Возможности пакетов java.awt.geom, java.awt, классов java.awt.Graphics и java.awt.Graphics2D. Основные графические примитивы и работа с потоками. Листинг программы и составление композиции аффинных преобразований.
методичка [525,3 K], добавлен 30.06.2009Анализ возможных подходов к созданию web-приложения с использованием программирования Java и CGI. Разработка структуры базы данных и реализация полученной модели в рамках СУБД. Обеспечение диалога CGI-программы с пользователем, используя браузер.
курсовая работа [310,9 K], добавлен 07.08.2011Понятие и общая характеристика языка программирования РНР, принципы и этапы его работы, синтаксис и ассоциируемые массивы. Обработка исключений в языке Java. Работа с базами данных с помощью JDBC. Изучение порядка разработки графического интерфейса.
презентация [192,3 K], добавлен 13.06.2014Общая характеристика и оценка возможностей языка программирования си-шарп, его сходные и отличительные черты от С++ и Java. Разработка с помощью данного языка программирования лексического и синтаксического анализатора. Составление таблиц разбора.
курсовая работа [111,6 K], добавлен 11.06.2010