Microsoft Visual J++. Создание приложений и аплетов на языке Java. Часть 1© Александр Фролов, Григорий ФроловТом 30, М.: Диалог-МИФИ, 1997, 288 стр. Приложение CheckBoxesДля демонстрации методов работы с различными переключателями мы подготовили приложение CheckBoxes. Окно соответствующего аплета показано на рис. 5.4. Рис. 5.4. Окно аплета CheckBoxes с переключателями и кнопкой В верхней части окна располагаются четыре переключателя с зависимой фиксацией, принадлежащих к одной группе. Ниже находятся три переключателя с независимой фиксацией, а еще ниже - кнопка с надписью Get CheckBoxes state. Нажав на эту кнопку, вы можете увидеть в нижней части окна аплета список включенных переключателей. Одновременно может быть включен только один из переключателей Mode 1 - Mode 4, так как эти переключатели составляют группу переключателей с зависимой фиксацией. Переключатели Switch 1, Switch 2 и Switch 3 могут находиться в произвольном состоянии независимо друг от друга. Заметим, что переключатели и кнопка размещались в окне аплета автоматически по мере добавления. Если бы мы добавляли эти компоненты в другой последовательности или если бы окно аплета имело другие размеры, то переключатели могли бы не оказаться сгруппированными, как это показано на рис. 5.4. Позже в этой главе мы научим вас настраивать систему Layout Manager таким образом, чтобы вы смогли располагать компоненты в заданном вами порядке с предсказуемым результатом. Исходные тексты приложения CheckBoxesФайл исходного текста приложения CheckBoxes представлен в листинге 5.3. Листинг 5.3. Файл CheckBoxes\CheckBoxes.java // ========================================================= // Работа с переключателями // // (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 CheckBoxes extends Applet { // Создаем три ссылки на объекты типа Checkbox Checkbox chbox1; Checkbox chbox2; Checkbox chbox3; // Создаем ссылку на объект типа CheckboxGroup CheckboxGroup grModeGroup; // Создаем четыре ссылки на объекты типа Checkbox Checkbox rdbox1; Checkbox rdbox2; Checkbox rdbox3; Checkbox rdbox4; // Создаем ссылку на объект типа Button Button btnGet; // ------------------------------------------------------- // getAppletInfo // Метод, возвращающей строку информации об аплете // ------------------------------------------------------- public String getAppletInfo() { return "Name: CheckBoxes\r\n" + "WWW: http://www.glasnet.ru/~frolov" + "E-mail: frolov@glas.apc.org" + "Author: Alexandr Frolov\r\n" + "Created with Microsoft Visual J++ Version 1.0"; } // ------------------------------------------------------- // init // Метод, получающий управление при инициализации аплета // ------------------------------------------------------- public void init() { // Устанавливаем желтый цвет фона setBackground(Color.yellow); // Создаем три переключателя с независимой фиксацией chbox1 = new Checkbox("Switch 1"); chbox2 = new Checkbox("Switch 2"); chbox3 = new Checkbox("Switch 3"); // Создаем группу переключателей с зависимой фиксацией grModeGroup = new CheckboxGroup(); // Создаем четыре переключателя с зависимой фиксацией, // принадлежащие группе grModeGroup rdbox1 = new Checkbox("Mode 1",grModeGroup, true); rdbox2 = new Checkbox("Mode 2",grModeGroup, false); rdbox3 = new Checkbox("Mode 3",grModeGroup, false); rdbox4 = new Checkbox("Mode 4",grModeGroup, false); // Создаем кнопку, предназначенную для определения // текущего состояния переключателей btnGet = new Button("Get CheckBoxes state"); // Добавляем в окно аплета четыре переключателя // с зависимой фиксацией add(rdbox1); add(rdbox2); add(rdbox3); add(rdbox4); // Добавляем в окно аплета три переключателя // с независимой фиксацией add(chbox1); add(chbox2); add(chbox3); // Добавляем в окно аплета кнопку add(btnGet); } // ------------------------------------------------------- // action // Метод вызывается, когда пользователь выполняет // действие над компонентами // ------------------------------------------------------- public boolean action(Event evt, Object obj) { // Проверяем, что событие вызвано кнопкой, а не // другим компонентом if(evt.target instanceof Button) { // Выполняем ветвление по кнопкам. if(evt.target.equals(btnGet)) { showStatus("Button 1 pressed"); } // Если событие возникло от неизвестной кнопки, // мы его не обрабатываем else { return false; } // Перерисовываем окно аплета repaint(); // возвращаем признак того, что мы обработали событие return true; } // Если событие вызвано не кнопкой, // мы его не обрабатываем return false; } // ------------------------------------------------------- // paint // Метод paint, выполняющий рисование в окне аплета // ------------------------------------------------------- public void paint(Graphics g) { // Определяем текущие размеры окна аплета Dimension dimAppWndDimension = size(); // Выбираем в контекст отображения черный цвет g.setColor(Color.black); // Рисуем рамку вокруг окна аплета g.drawRect(0, 0, dimAppWndDimension.width - 1, dimAppWndDimension.height - 1); // Строка для записи списка // состояния переключателей String s = new String("> "); // Проверяем переключатели с независимой фиксацией if(chbox1.getState()) s = s + chbox1.getLabel() + ", "; if(chbox2.getState()) s = s + chbox2.getLabel() + ", "; if(chbox3.getState()) s = s + chbox3.getLabel() + ", "; if(rdbox1.getState()) s = s + rdbox1.getLabel(); // Проверяем переключатели с зависимой фиксацией else if(rdbox2.getState()) s = s + rdbox2.getLabel(); else if(rdbox3.getState()) s = s + rdbox3.getLabel(); else if(rdbox4.getState()) s = s + rdbox4.getLabel(); // Рисуем строку состояния переключателей g.drawString(s, 10, 150); } } В листинге 5.4 вы найдете исходный текст документа HTML, который был создан системой Java Applet Wizard для нашего аплета. Листинг 5.4. Файл CheckBoxes\CheckBoxes.html <html> <head> <title>CheckBoxes</title> </head> <body> <hr> <applet code=CheckBoxes.class id=CheckBoxes width=320 height=240 > </applet> <hr> <a href="CheckBoxes.java">The source.</a> </body> </html> Описание исходного текстаРассмотрим поля класса CheckBoxes и переопределенные нами методы. Поля класса CheckBoxesВ нашем классе мы определили несколько полей, предназначенных для хранения ссылок на переключатели, группу переключателей и кнопку. Ссылки на переключатели имеют тип Checkbox: Checkbox chbox1; Checkbox chbox2; Checkbox chbox3; Checkbox rdbox1; Checkbox rdbox2; Checkbox rdbox3; Checkbox rdbox4; Для того чтобы сгруппировать переключатели с зависимой фиксацией в группу, мы создали ссылку на объект класса CheckboxGroup: CheckboxGroup grModeGroup; Кроме того, нам потребуется ссылка на объект класса Button: Button btnGet; Метод getAppletInfoМетод getAppletInfo возвращает информацию о нашем аплете. Метод initДо сих пор для изменения цвета фона окна наших аплетов мы раскрашивали окно в желтый цвет явным образом в методе paint. Однако есть и другой способ, основанный на вызове метода setBackground: setBackground(Color.yellow); Дополнением к этому методу может послужить метод setForeground, с помощью которого можно установить цвет для рисования в окне. Почему мы выбрали другой способ изменения фона окна? Дело в том, что переключатели сами по себе являются окнами, обладающими такими атрибутами, как цвет фона и цвет изображения. Если просто нарисовать их в окне, закрашенным желтым цветом, то получится, что серые переключатели нарисованы на желтом фоне, что некрасиво. Метод setBackground, вызванный для окна аплета, позволяет задать цвет фона не только для контейнера, но и для всех компонент, расположенных в нем. После установки цвета фона метод init создает три переключателя с независимой фиксацией, указывая их название: chbox1 = new Checkbox("Switch 1"); chbox2 = new Checkbox("Switch 2"); chbox3 = new Checkbox("Switch 3"); Далее метод init создает группу переключателей с зависимой фиксацией в виде объекта класса CheckboxGroup: grModeGroup = new CheckboxGroup(); Для создания переключателей с зависимой фиксацией необходимо использовать метод, допускающий указание группы и начального состояния переключателя: rdbox1 = new Checkbox("Mode 1",grModeGroup, true); rdbox2 = new Checkbox("Mode 2",grModeGroup, false); rdbox3 = new Checkbox("Mode 3",grModeGroup, false); rdbox4 = new Checkbox("Mode 4",grModeGroup, false); Затем метод init создает кнопку с названием Get CheckBoxes state, предназначенную для определения текущего состояния переключателей: btnGet = new Button("Get CheckBoxes state"); После создания компонент они добавляются в контейнер, которым является окно аплета. Для этого используется метод add. Прежде всего мы добавляем четыре переключателя с зависимой фиксацией: add(rdbox1); add(rdbox2); add(rdbox3); add(rdbox4); Размеры окна и размеры переключателей соотносятся между собой таким образом, что в верхней части окна аплета помещаются как раз четыре переключателя. Очевидно, если изменить размеры окна аплета, переключатели будут размещены по-другому. Далее метод init добавляет в окно аплета переключатели с независимой фиксацией и кнопку: add(chbox1); add(chbox2); add(chbox3); add(btnGet); Метод actionМетод action обрабатывает только те события, которые вызваны кнопкой btnGet: if(evt.target instanceof Button) { if(evt.target.equals(btnGet)) showStatus("Button 1 pressed"); else return false; repaint(); return true; } Когда пользователь нажимает кнопку, метод action выводит сообщение об этом в строку состояния навигатора и перерисывавает окно аплета. Текущее состояние кнопок определяется методом paint во время перерисовки окна. Метод paintВ методе paint мы не закрашиваем желтым цветом окно аплета, так как на этапе инициализации в обработчике метода init был установлен желтый цвет фона окна. Однако черную рамку вокруг границы окна аплета мы все же рисуем. Основная задача метода paint заключается в отображении в нижней части окна аплета списка включенных переключателей. Для формирования этой строки мы создаем объект s класса String: String s = new String("> "); Далее мы проверяем по очереди состояние всех переключателей с независимой фиксацией, дописывая к строке s название включенных переключателей: if(chbox1.getState()) s = s + chbox1.getLabel() + ", "; if(chbox2.getState()) s = s + chbox2.getLabel() + ", "; if(chbox3.getState()) s = s + chbox3.getLabel() + ", "; Для определения текущего состояния переключателей мы вызываем метод getState. Этот метод возвращает значение true для включенного переключателя и false - для выключенного. Название переключателя легко определить с помощью метода getLabel. Проверка состояний переключателей с зависимой фиксацией выполняется аналогично, но с учетом того, что одновременно может быть включен только один такой пеерключатель: if(rdbox1.getState()) s = s + rdbox1.getLabel(); else if(rdbox2.getState()) s = s + rdbox2.getLabel(); else if(rdbox3.getState()) s = s + rdbox3.getLabel(); else if(rdbox4.getState()) s = s + rdbox4.getLabel(); После завершения формирования строки s она отображается в окне аплета методом drawString: g.drawString(s, 10, 150); |