Компоненты |
Аплет FormDemoВ аплете FormDemo мы покажем приемы работы с компонентами, такими как переключатели, кнопки, текстовые поля и списки. Мы разместили несколько таких компонент в окне этого аплета (рис. 7) таким образом, что они образуют собой форму. В этой форме вы можете ввести имя и фамилию, выбрать один из трех режимов работы, а также цвет.
Переключатели First и Second активизируют однострочные текстовые поля редактирования Enter your first name и Enter your second name. После того как пользователь нажмет кнопку Ready, содержимое активных полей, а также состояние переключателей Mode 1, Mode 2 и Mode 3 будет отображено в многострочном поле редактирования. Это поле находится в нижней части окна аплета. С помощью списка, расположенного справа от переключателя Mode 3, можно задавать цвет фона многострочного поля. Цвет устанавливается сразу после выбора новой строки из этого списка. К сожалению, при изменении размеров окна аплета находящиеся в нем компоненты изменяют свое расположение. Этот недостаток мы устраним после того, как расскажем вам о системе Layout Manager, с помощью которой вы можете управлять размещением компонент в окне аплета. Исходный текст аплета FormDemoИсходный текст аплета FormDemo вы найдете в листинге 1. Листинг 1. Файл FormDemo.java import java.applet.Applet; import java.awt.*; import java.util.*; public class FormDemo extends Applet { Button btReady; Checkbox chbox1; Checkbox chbox2; CheckboxGroup grRadio; Checkbox rd1; Checkbox rd2; Checkbox rd3; Choice ch1; Label lbFirstName; Label lbSecondName; TextField txtFirstName; TextField txtSecondName; TextArea txta; public void init() { chbox1 = new Checkbox("First"); add(chbox1); lbFirstName = new Label("Enter your first name:"); add(lbFirstName); txtFirstName = new TextField(" ", 30); add(txtFirstName); chbox2 = new Checkbox("Second"); add(chbox2); lbSecondName = new Label("Enter your second name:"); add(lbSecondName); txtSecondName = new TextField(" ", 30); add(txtSecondName); grRadio = new CheckboxGroup(); rd1 = new Checkbox("Mode 1", grRadio, true); rd2 = new Checkbox("Mode 2", grRadio, false); rd3 = new Checkbox("Mode 3", grRadio, false); add(rd1); add(rd2); add(rd3); ch1 = new Choice(); ch1.addItem("White"); ch1.addItem("Green"); ch1.addItem("Yellow"); add(ch1); setBackground(Color.yellow); lbFirstName.setBackground(Color.yellow); lbSecondName.setBackground(Color.yellow); rd1.setBackground(Color.yellow); rd2.setBackground(Color.yellow); rd3.setBackground(Color.yellow); chbox1.setBackground(Color.yellow); chbox2.setBackground(Color.yellow); txta = new TextArea("", 6, 45); add(txta); txta.setBackground(Color.white); btReady = new Button("Ready"); add(btReady); } public String getAppletInfo() { return "Name: FormDemo"; } public void paint(Graphics g) { Dimension dimAppWndDimension = getSize(); g.setColor(Color.black); g.drawRect(0, 0, dimAppWndDimension.width - 1, dimAppWndDimension.height - 1); } public boolean action(Event evt, Object obj) { Button btn; String str1, str2; if(evt.target instanceof Button) { if(evt.target.equals(btReady)) { btn = (Button)evt.target; str1 = txtFirstName.getText(); str2 = txtSecondName.getText(); if(chbox1.getState()) txta.append(str1); if(chbox2.getState()) txta.append(str2); if(rd1.getState()) txta.append("\nMode 1\n"); if(rd2.getState()) txta.append("\nMode 2\n"); if(rd3.getState()) txta.append("\nMode 3\n"); } else { return false; } return true; } else if(evt.target instanceof Choice) { if(evt.target.equals(ch1)) { if(ch1.getSelectedIndex() == 0) txta.setBackground(Color.white); if(ch1.getSelectedIndex() == 1) txta.setBackground(Color.green); if(ch1.getSelectedIndex() == 2) txta.setBackground(Color.yellow); } } return false; } } В листинге 2 мы привели исходный текст документа HTML, созданный для нашего аплета системой Java WorkShop. Листинг 2. Файл FormDemo.tmp.html<applet name="FormDemo" code="FormDemo" codebase= "file:/e:/sun/articles/vol6/src/FormDemo" width="500" height="600" align="Top" alt="If you had a java-enabled browser, you would see an applet here."> <hr>If your browser recognized the applet tag, you would see an applet here.<hr> </applet> Описание исходного текстаПриведем краткое описание полей и методов, определенных в аплете FormDemo. Поля главного классаВ главном классе нашего аплета мы определили несколько полей. Поле btReady хранит ссылку на кнопку с надписью Ready: Button btReady; В полях chbox1 и chbox2 записаны ссылки на переключатели с независимой фиксацией, которые используются для активизации однострочных текстовых полей: Checkbox chbox1; Checkbox chbox2; Поле grRadio хранит ссылку на группу переключателей с зависимой фиксацией, определяющих режимы работы Mode 1, Mode 2 и Mode 3: CheckboxGroup grRadio; Ссылки на эти переключатели находятся в следующих трех полях: Checkbox rd1; Checkbox rd2; Checkbox rd3; В поле ch1 хранится ссылка на список, предназначенный для выбора цвета: Choice ch1; Слева от однострочных полей редактирования в нашем окне имеются подписи, реализованные как объекты класса Label. Ссылки на эти объекты находятся в полях lbFirstName и lbSecondName: Label lbFirstName; Label lbSecondName; Ссылки на однострочные поля редактирования записаны в поля с именами txtFirstName и txtSecondName: TextField txtFirstName; TextField txtSecondName; И, наконец, ссылка на многострочное текстовое поле хранится в поле с именем txta: TextArea txta; Метод initМетод init занимается созданием компонент и добавлением их в окно алпета. Кроме того, этот метод изменяет цвет фона окна аплета и окон добавляемых компонент. Прежде всего метод init создает два переключателя с независимой фиксацией, два объекта класса Label и два однострочных поля редактирования текста: chbox1 = new Checkbox("First"); add(chbox1); lbFirstName = new Label("Enter your first name:"); add(lbFirstName); txtFirstName = new TextField(" ", 30); add(txtFirstName); chbox2 = new Checkbox("Second"); add(chbox2); lbSecondName = new Label("Enter your second name:"); add(lbSecondName); txtSecondName = new TextField(" ", 30); add(txtSecondName); Поля создаются при помощи конструкторов, а добавляются в окно аплета методом add. Согласно схемы расположения компонент, установленой по умолчанию, добавляемые компоненты размещаются сверху вниз и слева направо. Для группы переключателей с зависимой фиксацией мы создаем объект класса CheckboxGroup: grRadio = new CheckboxGroup(); Ссылка на этот объект затем передается в качестве второго параметра конструкторам, создающим переключатели: rd1 = new Checkbox("Mode 1", grRadio, true); rd2 = new Checkbox("Mode 2", grRadio, false); rd3 = new Checkbox("Mode 3", grRadio, false); Переключатели добавляются в окно аплета при помощи метода add: add(rd1); add(rd2); add(rd3); Список цветов создается как объект класса Choice: ch1 = new Choice(); После создания списка мы добавляем в него три элемента, вызывая для этого метод addItem: ch1.addItem("White"); ch1.addItem("Green"); ch1.addItem("Yellow"); Вслед за этим мы добавляем сформированный список в окно аплета: add(ch1); Для установки цвета фона мы вызываем метод setBackground без указания объекта: setBackground(Color.yellow); В этом случае метод вызывается для текущего объекта, то есть для нашего аплета. Чтобы установить цвет фона в окнах компонент, мы вызываем метод setBackground для соответствующих объектов, как это показано ниже: lbFirstName.setBackground(Color.yellow); lbSecondName.setBackground(Color.yellow); rd1.setBackground(Color.yellow); rd2.setBackground(Color.yellow); rd3.setBackground(Color.yellow); chbox1.setBackground(Color.yellow); chbox2.setBackground(Color.yellow); Многострочное текстовое поле создается как объект класса TextArea. В нем 6 строк и 45 столбцов: txta = new TextArea("", 6, 45); add(txta); Первоначальный цвет фона многострочного текстового поля устанавливается тем же способом, чтомы использовали для других компонент: txta.setBackground(Color.white); Этот цвет в дальнейшем будет изменяться обработчиком событий, создаваемых списком цветов. И, наконец, последнее что делает метод init перед тем как вернуть управление, - создает кнопку с надписью Ready и добавляет ее в окно аплета: btReady = new Button("Ready"); add(btReady); Метод actionВ методе action мы определили рабочие поля btn, str1 и str2: Button btn; String str1, str2; В начале своей работы метод action определяет, какой компонент вызвал событие. Для этого анализируется поле evt.target: if(evt.target instanceof Button) { . . . return true; } else if(evt.target instanceof Choice) { . . . return true; } return false; Наш метод action обрабатывает события, вызываемые объектами классов Button и Choice. Если событие вызвано компонентом, относящимся к какому-либо другому классу, метод возвращает значение false. Этим он сигнализирует, что обработка события не выполнялась. В случае успешной обработки события метод action возвращает значение true. Если событие вызвано кнопкой, наш метод action проверяет, какой именно. Обработка выполняется только в том случае, если через поле evt.target передается ссылка на кнопку btReady: if(evt.target.equals(btReady)) { . . . } else { return false; } return true; В противном случае метод action возвращает значение false, отказываясь от обработки события. Что делает обработчик события, создаваемого кнопкой? Прежде всего, он сохраняет ссылку на кнопку в рабочей переменной (просто для того чтобы показать, как это делается): btn = (Button)evt.target; Далее наш обработчик события извлекает текстовые строки из однострочных текстовых полей, вызывая для этого метод getText. Эти строки записываются в рабочие переменные str1 и str2: str1 = txtFirstName.getText(); str2 = txtSecondName.getText(); Затемметод action проверяет состояние переключателей с независимой фиксацией chbox1 и chbox2. Если они включены, содержимое соответствующих временных переменных добавляется в многострочное текстовое поле txta: if(chbox1.getState()) txta.append(str1); if(chbox2.getState()) txta.append(str2); Для добавления мы вызываем метод append. Аналогичным образом преверяется состояние переключателей с зависимой фиксацией: if(rd1.getState()) txta.append("\nMode 1\n"); if(rd2.getState()) txta.append("\nMode 2\n"); if(rd3.getState()) txta.append("\nMode 3\n"); Если событие вызвано списокм цветов ch1, то метод action определяет, какая строка списка стала выделенной и устанавливает в многострочном поле редактирования соответствующий цвет фона. Для определения выделенной строки применяется метод getSelectedIndex: if(evt.target.equals(ch1)) { if(ch1.getSelectedIndex() == 0) txta.setBackground(Color.white); if(ch1.getSelectedIndex() == 1) txta.setBackground(Color.green); if(ch1.getSelectedIndex() == 2) txta.setBackground(Color.yellow); } Работу остальных методов приложения FormDemo вы сможете разобрать самостоятельно. |