Назад Вперед
В аплете FormDemo мы покажем приемы работы с
компонентами, такими как переключатели, кнопки,
текстовые поля и списки.
Мы разместили несколько таких компонент
в окне этого аплета (рис. 7) таким образом, что они
образуют собой форму. В этой форме вы можете
ввести имя и фамилию, выбрать один из трех
режимов работы, а также цвет.
|
Рис. 7. Окно аплета FormDemo |
Переключатели 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 вы сможете разобрать самостоятельно. |