Курсовая работа: Разработка собственного графического редактора для рисования двумерной графики, используя язык программирования Java и интерфейсы прикладного программирования Java 2D

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

СКРИНЫ ВСТАВИТЬ

Графические примитивы

При создании компонента, т. е. объекта класса 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");