Java. Полное руководство. 8-е издание. С. Н. Тригуб Перевод с английского и редакция
Скачать 25.04 Mb.
|
public void paint(Graphics g) Это окно аплета", 10, Результат выполнения этого аплета показан на рис. Ш A p p je t V ie w e r: ^ A p p le tf f a m e v П X 1 рфрт ; 1 This is in a p p letw in d o w | ■Applet Щ F ra m e W in d o w W S fX - | П || X | This is in fram e w ind o Рис. 24.2. Создание дочернего окна из аплета Глава 24. Введение в библиотеку AW T: работа с окнами, графикой и текстом 7 5 Обработка событий в рамочном окне Поскольку класс Fram e — подкласс класса Com ponent, он наследует все, что определено в классе C om ponent. Это значит, что вы можете использовать рамочное окно и управлять им точно также, как делаете это с главным окном аплета. Например, вы можете переопределить метод p a i n t () для отображения вывода, вызвать метод r e p a i n t (), когда вам нужно восстановить окно, и добавить обработчики событий. Всякий раз, когда в окне происходят события, вызываются обработчики, определенные этим окном. Каждое окно обрабатывает свои собственные события. Например, следующая программа создает окно, реагирующее на события мыши. Главное окно аплета также реагирует на события мыши. Если вы поэкспериментируете с этой программой, то увидите, что события мыши посылаются окну, в котором они происходят Обработка событий мыши в дочернем окне и окне аплета, import j a v a .a w t .*; import j a v a .a w t .event.*; import java.applet.*; /* */ // Создание подкласса Frame, class SampleFrame extends Frame implements MouseListener, MouseMotionListener { String msg = ""; int mouseX=10, mouseY=40; int movX=0/ movY=0; SampleFrame(String title) { super(title); // зарегистрировать объект для получения его собственных событий мыши addMouseListener(this); addMouseMotionListener(this); // создать объект для обработки событий окна MyWindowAdapter adapter = new MyWindowAdapter(this); // зарегистрировать для получения этих событий addWindowListener(adapter); } // Обработка щелчка мыши void mouseClicked(MouseEvent me) { } // Обработка входа курсора мыши void mouseEntered(MouseEvent evtObj) { // сохранить координаты mouseX = 10; mouseY = 54; msg = "Mouse just entered child."; // msg = "Курсор мыши только что вошел в дочернее окно repaint(); } // Обработка выхода курсора мыши void mouseExited(MouseEvent evtObj) { // сохранить координаты mouseX = 10; mouseY = 54; 7 5 4 Часть II. Библиотека Java msg = "Mouse just left child window."; // msg = "Курсор мыши только что покинул дочернее окно repaint(); } // Обработка нажатия кнопки мыши void mousePressed(MouseEvent me) { // сохранить координаты mouseX = m e . g e t X O ; mouseY = m e . g e t Y O ; msg = "Down"; repaint(); } // Обработка отпускания кнопки мыши void mouseReleased(MouseEvent me) { // сохранить координаты mouseX = m e . g e t X O ; mouseY = m e . g e t Y O ; msg = "Up"; repaint(); } // Обработка перетаскивания мышью void mouseDragged(MouseEvent me) { // сохранить координаты mouseX = m e . g e t X O ; mouseY = m e . g e t Y O ; movX = m e . g e t X O ; movY = m e .g e t Y (); msg = "*"; repaint(); } // Обработка перемещения мыши void mouseMoved(MouseEvent me) { // сохранить координаты movX = m e .g e t X (); movY = m e .g e t Y (); repaint(0, 0, 100, 60); } public void paint(Graphics g) { g.drawstring(msg, mouseX, mouseY); g .drawstring("Mouse at " + movX + ", " + movY, 10, 40); // g Курсор мыши в " + movX + ", " + movY, 10, 40); } class MyWindowAdapter extends WindowAdapter { SampleFrame sampleFrame; public MyWindowAdapter(SampleFrame sampleFrame) { thi s .sampleFrame = sampleFrame; } public void windowClosing(WindowEvent we) { sampleFrame.setVisible(false); } // Окно аплета. public class WindowEvents extends Applet implements MouseListener, MouseMotionListener { SampleFrame f; Глава 24. Введение в библиотеку AWT: работа с окнами, графикой и текстом 7 5 5 String msg = "" ; int mouseX=0, mouseY=10; int movX=0, movY=0; // Создание рамочного окна public void i n i t () { f = new SampleFrame("Handle Mouse Events"); f . setSize(300, 200); f .setVisible(true); // зарегистрировать объект для получения его собственных // событий мыши addMouseListener(this); addMouseMotionListener(this); } // Удаление рамочного окна при останове аплета, public void s t o p () { f .setVisible(false) ; } // Показать рамочное окно при запуске аплета, public void start() { f .setVisible(true); } // Обработка щелчка мыши void mouseClicked(MouseEvent me) { } // Обработка входа мыши void mouseEntered(MouseEvent me) { // сохранить координаты mouseX = 0; mouseY = 24; msg = "Mouse just entered applet window."; // msg = "Курсор мыши только что вошел в окно аплета."; repaint(); } // Обработка выхода мыши void mouseExited(MouseEvent me) { // сохранить координаты mouseX = 0; mouseY = 24; msg = "Mouse just left applet window."; // msg = "Курсор мыши только что покинул окно аплета."; repaint(); } // Обработка нажатия кнопки мыши сохранить координаты mouseX = me.getX(.); mouseY = me.getY(); msg = "Down"; repaint(); } // Обработка отпускания кнопки мыши public void mouseReleased(MouseEvent me) { // сохранить координаты mouseX = me.getX(); mouseY = m e . g e t Y O ; 7 5 6 Часть II. Библиотека Java msg = "Up"; repaint(); } // Обработка перетаскивания мышью void mouseDragged(MouseEvent me) { // сохранить координаты mouseX = m e . g e t X O ; mouseY = m e . g e t Y O ; movX = m e .g e t X (); movY = m e .g e t Y () ; msg = "*"; // Обработка перемещения мыши public void mouseMoved(MouseEvent me) { // сохранить координаты movX = m e . g e t X O ; movY = m e .g e t Y (); repaint(0, 0, 100, 20); // Отображение сообщения в окне аплета public void paint(Graphics g) { g .drawString(msg, mouseX, mouseY); g .drawstring("Mouse at " + movX + ", " + movY, 0, 10); // g Курсор мыши в " + movX + ", " + movY, 0, Результат выполнения этого аплета показан на рис. Щ ouse at 2 3 2 ,3 7 M ouse ju st left applet w ind ow Applet started M ouse at 1 2 8 ,1 0 Рис. 24.3. Обработка событий мыши в дочернем окне и окне аплета Глава 24. Введение в библиотеку AWT: работа с окнами, графикой и текстом 7 5 Создание оконной программы Хотя создание аплетов — привычная задача для применения библиотеки AWT языка Java, на основе библиотеки AWT также можно создавать автономные приложения. Для этого просто создайте экземпляр нужного окна или окон внутри метода m ain (). Например, следующая программа создает рамочное окно, реагирующее на щелчки мыши и нажатия клавиш Создание приложения на базе AWT. import j a v a .a w t .*; import j a v a .a w t .event.*; import java.applet.*; // Создание рамочного окна class AppWindow extends Frame { String keymsg = "This is a test."; String mousemsg = ""; int mouseX=3 0 / mouseY=3 0; public AppWindow() { addKeyListener(new MyKeyAdapter(this)); addMouseListener(new MyMouseAdapter(this)); addWindowListener(new MyWindowAdapter()); } public void paint(Graphics g) { g .drawstring(keymsg, 10, 40); g .drawstring(mousemsg, mouseX, mouseY); } // Создание окна static void main(String a r g s []) { AppWindow appwin = new AppWindowO; appwin.setSize(new Dimension(300, 200)); appwin.setTitie("An AWT-Based Application"); // Приложение AWT"); appwin.setVisible(true); } } class MyKeyAdapter extends KeyAdapter { AppWindow appWindow; public MyKeyAdapter(AppWindow appWindow) { this.appWi ndow = appWi ndow; } public void keyTyped(KeyEvent ke) { appWindow.keymsg += k e .getKeyChar(); appWindow.repaint(); }; } class MyMouseAdapter extends MouseAdaptfer { AppWindow appWindow; public MyMouseAdapter(AppWindow appWindow) { this.appWindow = appWindow; } public void mousePressed(MouseEvent me) { appWindow. mouseX = m e . g e t X O ; appWindow. mouseY = m e . g e t Y O ; 7 5 Часть II. Библиотека Java appWindow.mousemsg = "Mouse Down at " + appWindow.mouseX + 11 appWindow.mousemsg = "Клавиша мыши нажата в " + // appWindow.mouseX + ", " + appWindow.mouseY; appWindow.repaint(); } class MyWindowAdapter extends WindowAdapter { public void windowClosing(WindowEvent we) { Результат выполнения этого аплета показан на рис. 24.4. An AWT-Based Application* This is a test. £ ouse Down at 81, Рис. 24.4. Пример приложения Однажды созданное рамочное окно начинает жить собственной жизнью. Обратите внимание на то, что метод main () завершается вызовом метода ар- pwin. s e t V i s i b l e ( t r u e ) . Однако программа продолжает выполняться до тех пор, пока вы не закроете окно. По сути, при создании оконного приложения вы используете метод main () для запуска окна верхнего уровня. После этого ваша программа функционирует как приложение на основе GUI, а не как консольное приложение вроде показанных ранее. Отображение информации внутри окна В наиболее общем случае окно является контейнером для информации. Хотя в предыдущих примерах мы уже выводили небольшие объемы текста в окно, все же до сих пор мы не использовали возможности окон представлять высококачественный текст и графику. На самом деле большая часть мощи библиотеки AWT проявляется именно благодаря такой поддержке. Поэтому далее в этой главе мы обсудим возможности языка Java по выводу текста, графики и управлению шрифтами. Как вы убедитесь, они обеспечивают как необходимую мощность, таки гибкость. Работа с графикой Библиотека AWT предоставляет богатый ассортимент графических методов. Весь графический вывод осуществляется относительно окна. Это может быть Глава 24. Введение в библиотеку AWT: работа с окнами, графикой и текстом 7 5 главное окно аплета, дочернее окно аплета или же окно автономного приложения. Начальная точка каждого окна находится в верхнем левом углу и имеет координаты 0,0. Координаты указываются в пикселях. Весь вывод в окно выполняется в конкретном графическом контексте. Графический контекст, инкапсулированный классом G r a p h i c s , получаем двумя способами: • передается в метод, такой как p a i n t () или u p d a t e ( ), как аргумент; • возвращается методом g e t G r a p h i c s () класса C o m pon Для обеспечения согласованности далее продемонстрирует графику в главном окне аплета. Однако те же приемы применимы к любому окну. Класс G r a p h i c s определяет множество функций рисования. Любая фигура может быть нарисована только контуром либо залита. Объекты рисуются и заливаются текущим выбранным цветом графики, которым по умолчанию является черный. При рисовании графического объекта, выходящего за пределы окна, его вывод автоматически усекается. Давайте рассмотрим несколько методов рисования. Рисование линий Линии рисуются с помощью метода d r a w L in e ( ) , показанного ниже o i d d r a w L in e ( i n t начало Хна ч а ло У , i n t конец Х , i n t конецУ) Метод d r a w L in e () отображает линию в текущем цвете рисования, начиная сточки начало Хна ч а ло У и заканчивая конец Х, конецУ. Следующий аплет рисует несколько линий Рисование линий import j a v a .a w t .*; import java.applet.*; /* */ public class Lines extends Applet { public void paint(Graphics g) { g.drawLine(0, 0, 10 0, 100); g .drawLine(0, 100, 100, 0); g .drawLine(40, 25, 250, 180); g.drawLine(75, 90, 400, 400); g .drawLine(20, 150, 400, 40); g .drawLine(5, 290, 80, Результат выполнения этого аплета показан на рис. Рисование прямоугольников Методы d r a w R e c t () и f i l l R e c t () отображают, соответственно, контурный и закрашенный прямоугольники. Выглядят они такс верху слева int ширина int высота) void fillRect(int сверху int слева int ширина int высота) Левый верхний угол прямоугольника расположен в сверху, слева Размеры прямоугольника задаются параметрами ширина и высота 7 6 0 Часть II. Библиотека Чтобы нарисовать прямоугольник со скругленными углами, используйте методы d r a w R o u n d R e c t ( ) и f i l l R o u n d R e c t (). void drawRoundRect(int сверху int слева int ширина int высота, int диаметрХ, int диаметру) void fillRoundRect(int сверху int слева int ширина int высота диамет рХ, int диаметру) Нарисованные этими методами прямоугольники будут иметь скругленные углы. Диаметр скругления по оси X указывается параметром диаметрХ. Диаметр скругления дуги по оси Y задается в диаметру. Приведенный ниже аплет рисует несколько прямоугольников Рисование прямоугольников import java.awt.*; import java.applet.*; /* */ public class Rectangles extends Applet { public void paint(Graphics g) { g .drawRect(10, 10, 60, 50); g.fillRect(100, 10, 60, 50); g .drawRoundRect(190, 10, 60, 50, 15, 15); g.fillRoundRect(70, 90, 140, 100, 30, Результат выполнения этого аплета показан на рис. 24.6. Глава 24. Введение в библиотеку AWT: работа с окнами, графикой и текстом 7 61 A p p le t V ie w e r: R ectan gles Applet Applet Рис. 24.6. Пример рисования прямоугольников Рисование эллипсов и окружностей Чтобы нарисовать эллипс, используйте метод d ra w O v a l (). Для его заливки применяйте метод f i l l O v a l ( ) . Эти методы выглядят следующим образом, v o i d d r a w O v a l ( i n t сверху n t слева n t ширина n t высота v o i d f i l l O v a l ( i n t сверху n t слева n t ширина n t высота Эллипс рисуется внутри описанного прямоугольника, верхний левый угол которого имеет координаты сверху, слева, а ширина и высота указаны в ширина и высота. Чтобы нарисовать круг, в качестве описанного прямоугольника задавайте квадрат. Следующая программа рисует несколько эллипсов Рисование эллипсов import j a v a .a w t .*; import java.applet.*; /* */ public class Ellipses extends Applet { public void paint(Graphics g) { g .drawOval( 1 0 , 10, 50, 50); g .fillOval( 1 0 0 , 10, 75, 50); g .drawOval (190 , 10, 90, 30); g.fillOval (70, 90, 140, } } 1 0 Результат выполнения этого аплета показан на рис. 24.7. 7 6 2 Часть И. Библиотека Java Applet Рис. 26.7. Пример рисования эллипсов Рисование дуг Дуги могут быть нарисованы методами d r a w A r c ( ) и f i l l A r c ( ) . void drawArc(int сверху int слева int ширина int высота, int начУгол, int уголПоворота) void fillArc(int сверху int слева int ширина int высота, int начУгол, int уголПоворота) Дуга ограничена прямоугольником, верхний левый угол которого находится в точке с координатами сверху, слева, а ширина и высота указаны параметрами ширина и высота Дуга рисуется начиная с угла на чУгол и продолжается на величину угла у го лПоворо та Углы указываются в градусах. Нуль градусов соответствует горизонтали, направленной почасовой стрелке, показывающей натри часа. Дуга рисуется в направлении против часовой стрелки, если значение уголПоворота положительно, и почасовой стрелке — если значение уголПоворота отрицательно. Таким образом, чтобы нарисовать дугу от 12 часов до 6 часов, нужно указать в качестве начального угла 90 градусов, а угла поворота — 180 градусов Рисование дуг окружностей import java.awt.*; import java.applet.*; /* */ public class Arcs extends Applet { public void paint(Graphics g) { g .drawArc(10, 40, 70, 70, 0, 75); g .fillArc(100, 40, 70, 70, 0, 75); |