Работа с графикой на Java

Простейшее рисование на формах и апплетах выполняют методы класса Graphics. В апплете имеется стандартный метод paint() (Graphics д),который использует переменную графического контекста g для рисования простейших фигур и вывода текста. Например, вывод текстовой строки выполняется таким образом:

g.drawString(str,x,у);

Здесь str — строковая переменная, а x, у — координаты первого символа строки. Достаточно часто, однако, возникает необходимость выполнить вывод строки или нарисовать фигуру не в методе paint о, а в любом другом методе. В этом случае нужно создать объектную графическую переменную и затем использовать ее методы рисования. Для создания объектной графической переменной z используем команду следующего вида:

Graphics z = getGraphics();

Приведем пример, в котором на форме выполняется вывод строки при нажатии на программную кнопку (листинг 1.10).

Листинг 1.10. Графический вывод вне метода paint ()

import java.awt.*; import java.awt.event.*;

public class painting extends Frame implements ActionListener private String strl;

Button print=new Button("Print"); // Кнопка для вывода строки Button clear=new Button("Clear"); // Кнопка для очистки

// области экрана Button exit=new Button("Exit"); // Кнопка для выхода из

// приложения painting() // Конструктор класса painting

setLayout(null); // Размещение элементов выполняется вручную

strl="Hello from Frame !";

add(print); // Добавление кнопки

add (clear) ;

add(exit);

print.addActionListener(this); // Добавление прослушивателя

clear.addActionListener(this) ;

exit.addActionListener(this);

print.setBounds(10,20,100, 20) ;

clear.setBounds(10,50,100,20);

exit.setBounds(10,80,100, 20) ;

}

public void actionPerformed(ActionEvent e) // Обработчик

// событий // от кнопок

{

if(e.getSource()==exit)

System.exit(0); //Завершение приложения else

if (e.getSource()==print)

{

Graphics z=getGraphics(); // Создаем объектную

// графическую переменную z z.drawString(strl,10,120); // Вывод строки strl

}

else

if(e.getSource()==clear)

{

Graphics z=getGraphics();

z.clearRect(8,110,110,35); // Очистка и заливка цветом

// фона прямоугольной области

}

painting pt= new painting(); // Создаем форму pt.resize(400,400); // Задаем размеры формы pt.setBackground(newColor(120,100,180)); // Устанавливаем

// цвет формы

pt.show();

В этом примере используем графическую объектную переменную для вывода строки, очистки прямоугольной области экрана и заливки ее цветом фона:

if(e.getSource()==clear)

Graphics z=getGraphics ();

z.clearRect(8,110,110,35); // Очистка и заливка цветом фона

// прямоугольной области

В цикле практических занятий будем рассматривать различные графические методы класса Graphics. Заметим, что класс Graphics не позволяет "удерживать" изображение (например, рисунок). Полезен и другой класс — canvas. Объект этого класса можно перемещать по форме (апплету) или панели (panei). Можно управлять его размерами, создавать на его основе дочерние классы и пр. Предыдущее приложение незначительно изменено (листинг 1.11) таким образом, что по нажатию на кнопку Print строка выводилась в случайной позиции экрана.

Листинг 1.11. Графический вывод на основе класса Canvas

import java.awt.*; import java.awt.event.*;

public class painting extends Frame implements ActionListener

private String strl;

// Построена классовая переменная на базе Canvas: private Canvas cs=new Canvas();

Button print=new Button("Print");

Button clear=new Button("Clear");

Button exit=new Button("Exit");

painting()

{

setLayout(null);

strl="Hello from Frame !";

add(print);

add (clear) ;

add(exit);

add(cs) ;

print.addActionListener(this); clear.addActionListener(this) ; exit.addActionListener(this); print.setBounds(10,20,100, 20) ; clear.setBounds(10,50,100, 20); exit.setBounds(10,80,100, 20) ; cs.setBounds(10,110,180,150);

// Объект Canvas можно размещать в произвольном месте формы cs.setBackground(Color.yellow); // Объект Canvas можно

// раскрашивать

}

public void actionPerformed(ActionEvent e)

{

if(e.getSource()==exit)

System.exit(0) ; else

if (e.getSource()==print)

{

int x=(int) Math.round(( Math.random()*20+10));

//x,y — случайные координаты для вывода объекта Canvas int y=(int) Math.round((Math.random()*100+110)); cs.move(x,y); // Перемещаем объект Canvas в новую позицию // Выводим строку в объекте Canvas: cs.getGraphics().drawString(strl,10,10);

}

else

if(e.getSource()==clear)

{

cs.getGraphics().clearRect(0,0,170,135); // Очищаем

// область // объекта Canvas

}

}

public static void main(String[] args)

{

painting pt= new painting(); pt. resize (400, 400) ;

pt.setBackground(new Color(120,100,180)); pt.show();

}

}

Рассмотрим теперь, как получить картинку. Держателем картинки является класс image. Поэтому первоначально следует сделать объявление наподобие следующего:

Image img;

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

String s="c:/work/l.gif";

Java не всегда отображает файлы с расширением .bmp (используем при работе с графикой файлы .gif и .jpg). После этого нужно инициализировать переменную img:

img=getToolkit().getImage(s);

И, наконец, рисуем картинку:

Graphics g= getGraphics(); g.drawImage(img,20,150,this);

Заметим, что рисование картинки следует предварить операцией ее подготовки:

prepareImage(img,this);

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

Следующее небольшое приложение (листинг 1.12) объединяет все сказанное ранее.

Листинг1.12. Рисование картинки на форме

import java.awt.*; import java.awt.event.*;

class Pic extends Frame implements ActionListener // Приложение создается на основе Frame

private Image img; // Объявляем картинку Button exit=new Button("Exit");

Button pict=new Button("Picture"); // По нажатию на эту

// кнопку картинка // отображается на форме

Pic()

setLayout(null) ; add(exit); add(pict);

exit.addActionListener(this) ; pict.addActionListener(this); exit.setBounds(10,20,100, 20) ; pict.setBounds(10,50,100,20);

String s="C:/work/l.gif"; // Формируем строку с адресом

// картинки

img= getToolkit().getImage(s); // Создаем переменную класса

// Image для хранения // картинки

prepareImage(img,this); // Переменная img заранее

// инициализируется, но еще не // отображается

}

public void actionPerformed(ActionEvent e)

{

if(e.getSource()==exit)

System.exit(0); // выход из приложения else

if(e.getSource()==pict)

{

Graphics g =getGraphics(); // Создаем переменную

// графического контекста // для рисования картинки g.drawImage(img,10,80,this); // Рисуемкартинку

g.                             drawLine(10,200,200,200); // Рисуем линию

g.                        setColor(Color.blue); // Изменяем цвет пера

g.                             drawLine(10,210,200,210); // Рисуем линию голубым

// цветом

}

}

public static void main(String[] args)

{

Pic fr=new Pic(); // Создаем объект класса приложения fr.resize(400,400); // Устанавливаем размеры формы // в пикселах

fr.setVisible(true); // делаем форму приложения видимой

}

В приведенном листинге следует обратить внимание на оператор:

img= getToolkit().getImage(s);

который присваивает переменной img битовый образ, хранимый в файле с адресом s.

Отметим, что в апплете для этих целей используется команда

img=getImage(URL u, "name.gif");

Здесь первый операнд задает URL-адрес картинки в сети Интернет, второй — имя картинки.

Результат работы приложения приведен на рис. 1.10. В прилагаемом к книге CD нужно предварительно подготовить файл с картинкой с именем l.gif и разместить его в каталоге c:\work.

Рис. 1.10. Рисование картинки и линий

Более продвинутые возможности для рисования предоставляет пакет Graphics2D. Например, средствами этого пакета можно выполнять градиентную заливку фигур, управлять шириной пера, поворачивать фигуры и пр. В качестве иллюстрации приведем приложение, демонстрирующее некоторые возможности пакета Graphics2D (листинг 1.13).

Листинг1.13. Рисование с градиентной заливкой на базе пакета Graphics2D

import java.awt.*; import java.awt.geom.*;

public class Picl extends Frame

private Ellipse2D.Double circle= new

Ellipse2D.Double(20,30,100,100); // создаем переменную circle

// класса Ellipse2D.Double

Picl()

resize(300,300); setBackground(Color.yellow);

public void paint(Graphics g)

Graphics2D g2=(Graphics2D) g; // Преобразуем к классу

// Graphics2D переменную // Graphics

//Устанавливаем режим градиентной заливки

g2.setPaint(new GradientPaint(0,0,Color.red,110,110,Color.green,true));

g2.fill(circle); // Заливаемокружность

g2.setPaint(Color.white); // Устанавливаем цвет пера

// в значение Color.white

g2.drawString("JAVA+",30,60); // Выводим строку

public static void main(String [] args)

Picl fr=new Picl(); fr. resize (400, 400) ;

Результат работы программы из листинга 1.13 приведен на рис. 1.11.

Рис. 1.11. Градиентная заливка Подключаем пакет Graphics2D командой:

import java.awt.geom.*;

Объявление переменной типа эллипса ясно из листинга 1.13. Важно обратить внимание на способ получения графического контекста Graphics2D, выполненный на основе преобразования типов:

Graphics2D g2=(Graphics2D) g;

Рисование окружности (эллипса) с заливкойрешизует команда:

g2 . fill (circle);

При этом заранее устанавливается режим градиентной заливки:

g2.setPaint(new GradientPaint (0,0,Color.red,110,110,Color.green,true));

В этой команде указаны два цвета — Color.red, Color.green и координаты области, в которой выполняется заливка (в той части

этой области, где содержится замкнутая часть рисуемой фигуры). Красный цвет начинается с точки с координатами (0,0), зеленый — с точки с координатами (110,110).

В этом же листинге осуществлен вывод строки с предварительной установкой цвета пера:

g2.setPaint(Color.white); // Устанавливаем цвет пера

// в значение Color.white g2.drawString("JAVA+",30,60); // Выводим строку

Более интересные подробности, касающиеся Graphics2D, можно найти в [13].

Наше предварительное введение в язык Java завершено. Основные концепции этого языка, необходимые для успешного и быстрого старта, изложены.

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

Источник: Герман О. B., Герман Ю. О., Программирование на Java и C# для студента. — СПб.: БХВ-Петербург, 2005. — 512 c.: ил.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100