Microsoft Visual J++. Создание приложений и аплетов на языке Java. Часть 1© Александр Фролов, Григорий ФроловТом 30, М.: Диалог-МИФИ, 1997, 288 стр. Приложение ChoiceListВ прложении ChoiceList мы создали два списка, первый из которых управляет цветом фона окна аплета, а второй - цветом изображения, то есть цветом, которым рисуется изображение в этом окне (рис. 5.7). Рис. 5.7. Окно аплета ChoiceList, в котором создано два списка класса Choice Пользоваться этим аплетом очень просто - выбирайте из левого списка цвет фона, а из правого - цвет изображения, при этом следите за цветом, которым нарисована текстовая строка и рамка вокруг окна аплета. Исходные тексты приложения ChoiceListИсходный текст приложения ChoiceList вы найдете в листинге 5.5. Листинг 5.5. Файл ChoiceList\ChoiceList.java // ========================================================= // Списки типа Drop Down // // (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.*; public class ChoiceList extends Applet { // Создаем ссылки на объекты класса Choice Choice chBackgroundColor; Choice chForegroundColor; // ------------------------------------------------------- // getAppletInfo // Метод, возвращающей строку информации об аплете // ------------------------------------------------------- public String getAppletInfo() { return "Name: ChoiceList\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() { // Создаем списки для выбора цвета фона и // цвета изображения chBackgroundColor = new Choice(); chForegroundColor = new Choice(); // Добавляем списки в окно аплета add(chBackgroundColor); add(chForegroundColor); // Заполняем список цвета фона chBackgroundColor.addItem("Yellow"); chBackgroundColor.addItem("Green"); chBackgroundColor.addItem("White"); // Заполняем список цвета изображения chForegroundColor.addItem("Black"); chForegroundColor.addItem("Red"); chForegroundColor.addItem("Blue"); // Устанавливаем цвет фона setBackground(Color.yellow); // Устанавливаем цвет изображения setForeground(Color.black); } // ------------------------------------------------------- // action // Метод вызывается, когда пользователь выполняет // действие над компонентами // ------------------------------------------------------- public boolean action(Event evt, Object obj) { // Переменная для хранения ссылки на список, // вызвавший событие Choice ch; // Получаем ссылку на список ch = (Choice)evt.target; // Проверяем, что событие вызвано списком, а не // другим компонентом if(evt.target instanceof Choice) { // Выполняем ветвление по спискам // Список цвета фона if(evt.target.equals(chBackgroundColor)) { // Получаем номер текущего элемента списка // и устанавливаем соответствующий // цвет фона if(ch.getSelectedIndex() == 0) setBackground(Color.yellow); else if(ch.getSelectedIndex() == 1) setBackground(Color.green); else if(ch.getSelectedIndex() == 2) setBackground(Color.white); } // Список цвета изображения else if(evt.target.equals(chForegroundColor)) { // Получаем номер текущего элемента списка // и устанавливаем соответствующий // цвет изображения if(ch.getSelectedIndex() == 0) setForeground(Color.black); else if(ch.getSelectedIndex() == 1) setForeground(Color.red); else if(ch.getSelectedIndex() == 2) setForeground(Color.blue); } // Если событие возникло от неизвестного списка, // мы его не обрабатываем else { return false; } // Перерисовываем окно аплета repaint(); // возвращаем признак того, что мы обработали событие return true; } // Если событие вызвано не кнопкой, // мы его не обрабатываем return false; } // ------------------------------------------------------- // paint // Метод paint, выполняющий рисование в окне аплета // ------------------------------------------------------- public void paint(Graphics g) { // Определяем текущие размеры окна аплета Dimension dimAppWndDimension = size(); // Рисуем рамку вокруг окна аплета g.drawRect(0, 0, dimAppWndDimension.width - 1, dimAppWndDimension.height - 1); // Рисуем строку g.drawString("Смотри на цвет фона и текста!", 10, 50); } } Исходный текст документа HTML, созданного для нашего аплета, приведен в листинге 5.6. Листинг 5.6. Файл ChoiceList\ChoiceList.html <html> <head> <title>ChoiceList</title> </head> <body> <hr> <applet code=ChoiceList.class id=ChoiceList width=320 height=240 > </applet> <hr> <a href="ChoiceList.java">The source.</a> </body> </html> Описание исходного текстаРассмотрим поля класса ChoiceList и переопределенные нами методы. Поля класса ChoiceListВ нашем классе мы определили два поля для хранения ссылок на списки цвета фона и цвета изображения: Choice chBackgroundColor; Choice chForegroundColor; Созданные списки пока пустые, но мы можем добавить их в окно аплета, вызвав метод add: add(chBackgroundColor); add(chForegroundColor); Сразу после добавления списков мы их заполняем, вызывая для соответствующих объектов метод addItem: chBackgroundColor.addItem("Yellow"); chBackgroundColor.addItem("Green"); chBackgroundColor.addItem("White"); chForegroundColor.addItem("Black"); chForegroundColor.addItem("Red"); chForegroundColor.addItem("Blue"); Элементы, добавленные в список первыми, будут выбраны в списке по умолчанию. В нашем случае будет выбран фон желтого цвета и изображение черного цвета. Такие же цвета мы устанавливаем для окна аплета, вызывая методы setBackground и setForeground: setBackground(Color.yellow); setForeground(Color.black); Метод actionМетод action обрабатывает событие, вызванное списками, - выбор элемента из списка. Прежде всего, метод action сохраняет ссылку на список, в котором произошел выбор, в переменной ch: Choice ch; ch = (Choice)evt.target; Далее выполняется проверка факта, что событие вызванно именно списком, после чего происходит анализ, в каком именно списке сделан выбор нового элемента: if(evt.target.equals(chBackgroundColor)) { if(ch.getSelectedIndex() == 0) setBackground(Color.yellow); else if(ch.getSelectedIndex() == 1) setBackground(Color.green); else if(ch.getSelectedIndex() == 2) setBackground(Color.white); } else if(evt.target.equals(chForegroundColor)) { if(ch.getSelectedIndex() == 0) setForeground(Color.black); else if(ch.getSelectedIndex() == 1) setForeground(Color.red); else if(ch.getSelectedIndex() == 2) setForeground(Color.blue); } else return false; Обратите внимание, что мы вначале выполняем преобразование типа evt.target к классу Choice, а только затем проверяем, действительно ли событие вызвано списком. Правильно ли это? Вообще говоря, неправильно. Так как в поле evt.target могут находиться ссылки на объекты различных классов, в процессе выполнения преобразования типов может произойти исключение. Если предпринимается попытка выполнить преобразование для несовместимых типов. Но так как в нашем аплете события создаются только списками, исключение не возникает. Корректнее было бы вначале проверить ссылку evt.target на принаддлежность к классу Choice с помощью оператора instanceof, а только потом выполнять преобразование типов. Так мы и будем делать в следующих примерах аплетов, обрабатывающих события от различных источников. С помощью метода getSelectedIndex метод action определяет номер выбранного элемента списка, устанавливая соответствующим образом цвет фона или изображения. Метод paintОбработчик метода paint рисует рамку вокруг окна аплета и текстовую строку в средней части этого окна. Dimension dimAppWndDimension = size(); g.drawRect(0, 0, dimAppWndDimension.width - 1, dimAppWndDimension.height - 1); g.drawString("Смотри на цвет фона и текста!", 10, 50); При этом мы не указали цвет фона, а также цвет изображения. При этом используются цвета, установленные методом action при выборе соответствующих строк из списков. |