Microsoft Visual J++. Создание приложений и аплетов на языке Java. Часть 1© Александр Фролов, Григорий ФроловТом 30, М.: Диалог-МИФИ, 1997, 288 стр. Приложение Panel2В окне аплета Panel2 мы создали две панели, одна из которых занимает верхнюю половину окна, а другая - нижнюю (рис. 7.7). Рис. 7.7. Окно аплета Panel2 с двумя панелями Для каждой панели мы создали два отдельных класса на базе класса Panel. В созданных нами классах переопределен метод paint, который рисует одну текстовую строку в окне своей панели. В верхней панели рисуется строка “Первая панель”, в нижней - “Вторая панель”. Кроме того, метод paint класса нашего аплета рисует две строки в окнах обеих панелей, получая контекст отображения для панелей и указывая ссылку на этот контекст явным образом. В процессе инициализации метод init класса нашего аплета устанавливает различный цвет фона и изображения для панелей, поэтому рамки вокруг окон панелей и текст получаются нарисованными различным цветом независимо от способа их рисования. Исходные тексты приложенияФайл исходных текстов приложения приведен в листинге 7.5. Листинг 7.5. Файл Panel2\Panel2.java // ========================================================= // Работа с панелями класса Panel // Наследование от класса Panel // // (C) Фролов А.В, 1997 // // E-mail: frolov@glas.apc.org // WWW: http://www.glasnet.ru/~frolov // или // http://www.dials.ccas.ru/frolov // ========================================================= import java.applet.*; import java.awt.*; // ========================================================= // Класс Panel2 // Это наш аплет // ========================================================= public class Panel2 extends Applet { // Первая панель FirstPanel pPanel1; // Вторая панель SecondPanel pPanel2; // ------------------------------------------------------- // getAppletInfo // Метод, возвращающей строку информации об аплете // ------------------------------------------------------- public String getAppletInfo() { return "Name: Panel2\r\n" + "Author: Alexandr Frolov\r\n" + "E-mail: frolov@glas.apc.org" + "WWW: http://www.glasnet.ru/~frolov" + "Created with Microsoft Visual J++ Version 1.0"; } // ------------------------------------------------------- // init // Метод, получающий управление при инициализации аплета // ------------------------------------------------------- public void init() { // Создаем в окне аплета две панели, разделяющие // окно по горизонтали setLayout(new GridLayout(2, 1)); // Создаем первую панель pPanel1 = new FirstPanel(); // Добавляем первую панель в окно аплета add(pPanel1); // Создаем вторую панель pPanel2 = new SecondPanel(); // Добавляем вторую панель add(pPanel2); // Устанавливаем желтый цвет фона для первой панели pPanel1.setBackground(Color.yellow); // Устанавливаем черный цвет изображения // для первой панели pPanel1.setForeground(Color.black); // Устанавливаем белый цвет фона для второй панели pPanel2.setBackground(Color.white); // Устанавливаем красный цвет изображения // для второй панели pPanel2.setForeground(Color.red); // Инициируем вызов метода paint repaint(); } // ------------------------------------------------------- // paint // Метод paint, выполняющий рисование в окне аплета // ------------------------------------------------------- public void paint(Graphics g) { Graphics gPanel1; Graphics gPanel2; // Получаем контекст отображения для первой панели gPanel1 = pPanel1.getGraphics(); // Рисуем строку в окне первой панели gPanel1.drawString("Нарисовано в первой панели", 10, 80); // Получаем контекст отображения для второй панели gPanel2 = pPanel2.getGraphics(); // Рисуем строку в окне второй панели gPanel2.drawString("Нарисовано во второй панели", 10, 80); } } // ========================================================= // Класс FirstPanel // Первая панель // ========================================================= class FirstPanel extends Panel { // ------------------------------------------------------- // paint // Метод paint, выполняющий рисование в окне аплета // ------------------------------------------------------- public void paint(Graphics g) { // Определяем текущие размеры Dimension dimAppWndDimension = size(); // Рисуем рамку вокруг окна аплета g.drawRect(0, 0, dimAppWndDimension.width - 1, dimAppWndDimension.height - 1); // Устанавливаем шрифт g.setFont(new Font("TimesRoman", Font.PLAIN, 12)); // Рисуем строку g.drawString("Первая панель", 10, 50); // Вызываем метод paint родительского класса super.paint(g); } } // ========================================================= // Класс SecondPanel // Вторая панель // ========================================================= class SecondPanel extends Panel { // ------------------------------------------------------- // paint // Метод paint, выполняющий рисование в окне аплета // ------------------------------------------------------- public void paint(Graphics g) { // Определяем текущие размеры Dimension dimAppWndDimension = size(); // Рисуем рамку вокруг окна аплета g.drawRect(0, 0, dimAppWndDimension.width - 1, dimAppWndDimension.height - 1); // Устанавливаем шрифт g.setFont(new Font("Helvetica", Font.PLAIN, 12)); // Рисуем строку g.drawString("Вторая панель", 10, 50); // Вызываем метод paint родительского класса super.paint(g); } } Исходный текст документа HTML, предназначенного для размещения нашего аплета, представлен в листинге 7.6. Листинг 7.6. Файл Panel2\Panel2.html <html> <head> <title>Panel2</title> </head> <body> <hr> <applet code=Panel2.class id=Panel2 width=320 height=240 > </applet> <hr> <a href="Panel2.java">The source.</a> </body> </html> Описание исходного текстаКак мы уже говорили, в приложении Panel2 мы создали два класса, взяв для них в качестве базового класс Panel. Имена этих классов - FirstPanel и SecondPanel. После трансляции проекта системой Microsoft Visual J++ получаются три двоичных файла с именами Panel2.class, FirstPanel.class и SecondPanel.class - по одному для каждого класса. Поля класса Panel2В классе Panel2 определено два поля с именами pPanel1 и pPanel2 класса Panel. Первое из них предназначено для хранения ссылки на верхюю панель, второе - на нижнюю (в соответствии с их расположением в окне аплета). Метод getAppletInfo класса Panel2Метод getAppletInfo возвращает информацию об аплете. Метод init класса Panel2Прежде всего метод init устанавливает для окна панели режим добавления компонент GridLayout, определяя таблицу из двух строк и одного столбца. Первая панель создается на базе класса FirstPanel, определенного в нашем приложении: pPanel1 = new FirstPanel(); Этот класс мы рассмотрим позже. Созданная панель добавляется в окно аплета методом add: add(pPanel1); Аналогично мы создаем и вторую панель, на этот раз как объект класса SecondPanel: pPanel2 = new SecondPanel(); Вторая панель добавляется в окно аплета точно также, как и первая: add(pPanel2); Для того чтобы выделить панели на фоне окна аплета, мы устанавливаем для них разные цвета фона и изображения. Для первой панели устанавливается желтый цвет фона и черный цвет изображения: pPanel1.setBackground(Color.yellow); pPanel1.setForeground(Color.black); Для второй панели мы устанавливаем белый цвет фона и красный цвет изображения: pPanel2.setBackground(Color.white); pPanel2.setForeground(Color.red); В результате цвета рамки окна и текста первой и второй панели будут разными. На последнем этапе инициализации мы инициируем вызов метода paint класса Panel2, вызывая для этого метод repaint: repaint(); Это нужно для того, чтобы сразу после отображения окна аплета выполнить рисование текстовых строк внутри окон панелей. Метод paint класса Panel2Метод paint класса Panel2 рисует две строки в окнах панелей, расположенных в окне аплета. Для этого он получает контекст отображения каждой панели и вызывает для этого контекста метод drawGraphics: Graphics gPanel1; Graphics gPanel2; gPanel1 = pPanel1.getGraphics(); gPanel1.drawString("Нарисовано в первой панели", 10, 80); gPanel2 = pPanel2.getGraphics(); gPanel2.drawString("Нарисовано во второй панели", 10, 80); Хотя при рисовании строк мы указали одинаковые координаты начала строки (10, 80), наложения строк не произойдет. Это потому, что эти строки рисуются в разных графических контекстах, которые относятся к окнам разных панелей. Цвет рисуемого текста и фона, на котором он будет нарисован, также получится разный, так как для наших панелей установлен разный цвет изображения и фона. Класс FirstPanelКласс FirstPanel создан на базе класса Panel: class FirstPanel extends Panel { public void paint(Graphics g) { . . . super.paint(g); } } В нашем приложении мы создаем верхнюю панель как объект этого класса. Единственный метод, переопределенный в классе FirstPanel - это метод paint. Метод paint класса FirstPanelЗадачей метода paint класса FirstPanel является рисование рамки вокруг первой панели и текстовой строки в окне этой панели. В качестве параметра метод paint класса FirstPanel получает ссылку на контекст отображения для окна первой панели. Мы можем использовать этот контекст для того чтобы нарисовать что-нибудь внутри первой панели. Процедура рисования не имеет никаких особенностей: Dimension dimAppWndDimension = size(); g.drawRect(0, 0, dimAppWndDimension.width - 1, dimAppWndDimension.height - 1); g.setFont(new Font("TimesRoman", Font.PLAIN, 12)); g.drawString("Первая панель", 10, 50); Заметим, однако, что после завершения рисования мы вызываем метод paint из базового класса, позволяя этому классу выполнить свою обработку: super.paint(g); Класс SecondPanelКласс SecondPanel создан также на базе класса Panel: class SecondPanel extends Panel { public void paint(Graphics g) { . . . super.paint(g); } } С использованием этого класса создается нижняя панель. В классе SecondPanel, как и в классе FirstPanel, переопределен метод paint. Метод paint класса SecondPanelМетода paint класса SecondPanel выполняет те же самые операции, что и метод paint класса FirstPanel, однако ему передается контекст отображения второй панели. Поэтому он нарисует рамку и текстовую строку во второй панели, а не в первой или где-нибудь еще. |