Оглавление

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

    Аплет 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 вы сможете разобрать самостоятельно.



Java | Продукты и решения | Технологии | Сервис и обучение
О компании | Партнеры | Новости | Поиск
Sun Microsystems Inc. Corporate Information Our partners News and Events Search on site Java Computing Products and Solutions Technologies and Researches Education and Service Content
Используются технологии uCoz