Аплет FormDemo

Оглавление

Компоненты
Кнопки
Переключатели
Списки Choice
Списки List
Поле Label
Поле TextField
Поле TextArea
Аплет FormDemo

Назад Вперед

В аплете FormDemo мы покажем приемы работы с компонентами, такими как переключатели, кнопки, текстовые поля и списки.

Мы разместили несколько таких компонент в окне этого аплета (рис. 7) таким образом, что они образуют собой форму. В этой форме вы можете ввести имя и фамилию, выбрать один из трех режимов работы, а также цвет.

pic07sm.gif (1910 bytes) Рис. 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 вы сможете разобрать самостоятельно.

Назад Вперед
Используются технологии uCoz