Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых
[Назад]

Библиотека примеров приложений Java

Оглавление
Кнопки Button

Кнопки с графикой и анимацией
Кнопка в виде аплета
Переключатели класса Checkbox
Переключатели с зависимой фиксацией
Нестандартные переключатели
Списки класса Choice
Списки класса List
Поля класса Label
Поля класса TextField
Поля класса TextArea
Нестандартные текстовые поля
Кнопки и события в JDK 1.1

Линейки Scrollbar
Окно ScrollPane

Назад Вперед

3.8. Списки класса List

В примере мы показали использование списка класса List для выбора цвета и шрифтового оформления текстовой строки, отображаемой в окне аплета.

Исходный текст примера

Архив проекта для Java WorkShop 2.0

Демонстрация
(ваш браузер должен уметь работать с аплетами Java)

Немного теории

Класс List позволяет создавать списки, предназначенные для выбора одновременно нескольких элементов или только одного элемента.

Список класса List занимает на экране прямоугольную область, где отображаются элементы списка (текстовые строки).

Конструктору класса List передаются два параметра: количество строк, видимых в области окна списка, и флаг выбора нескольких элементов одновременно. Если этот флаг равен true, пользователь может выбирать из списка сразу несколько элементов, а если false - только один.

Приемы работы со списком List во многом напоминают приемы, использованные нами в предыдущем примере.

Для добавления новых элементов вы можете использовать метод addItem, для получения номера выделенного элемента - метод getSelectedItem и так далее.

Если список допускает многократный выбор, приложение может получить ссылки на массивы номеров выделенных элементов или на массив строк выделенных элементов с помощью методов getSelectedIndexes и getSelectedItems, соответственно. Метод isSelected позволяет проверить, выделена или нет строка списка с заданным номером.

Обработка событий списка List может выполняться таким же образом, что и для списка Choise, однако события будут возникать лишь при двойном щелчке мышью по строкам списка. Если же вам необходимо отслеживать выделение отдельных строк списка (что может быть особенно актуально для списков с многократным выделением), лучше обрабатывать события, переопределив метод handleEvent.

Когда пользователь выделяет элемент списка, возникает событие с полем id, равным значению Event.LIST_SELECT. Когда выделение отменяется, значение этого поля будет равно Event.LIST_DESELECT.

Описание примера

В окне аплета, исходные тексты которого рассмотрены в настоящем разделе, мы расположили четыре списка, управляющих оформлением текстовой строки "Test string" (рис. 1).

pic1.gif (5088 bytes)

Рис. 1. Окно аплета со списками

Перед каждым списком мы добавили в окно аплета текстовое поле класса Label с описанием назначения списка. Заметим, что при изменении размеров окна аплета взаимное расположение полей и списков может отличаться от показанного на рис. 1. Чтобы избавиться от этого эффекта, необходимо соответствующим образом выбрать режим системы Layout Manager, однако сейчас мы не будем этим заниматься.

Списки Font, Color и Font size устанавливают, соответственно, шрифт, цвет текста и размер символов. Эти списки допускают одновременный выбор только одной строки.

Что же касается списка Font style, то в нем вы можете одновременно выбирать несколько строк. Например, можно выделить текст жирным шрифтом, выбрав строку Bold, и одновременно наклоном при помощи строки Italic. Строка Large увеличивает текущий размер символов выбранного шрифта в два раза.

Перейдем к описанию исходных текстов.

Поля главного класса аплета

Следующие четыре поля предназначены для хранения ссылок на списки класса List, создаваемые в нашем приложении:

List lboxFont;
List lboxColor;
List lboxFontSize;
List lboxStyle;

В полях класса Label мы храним ссылки на описания списков:

Label lblFont;
Label lblColor;
Label lblFontSize;
Label lblStyle;

Ниже мы показали поля, хранящие текущие параметры шрифтового оформления текстовой строки, отображаемой в окне аплета:

Color clrText = Color.black;
int nFontStyle = Font.PLAIN;
int nFontSize = 14;
Font fontTextFont;
String szFont = "Helvetica";
boolean bLargeFont = false;

Поле clrText хранит текущий цвет символов строки. Поле nFontStyle - стиль оформления (жирный или с подчеркиванием). В поле nFontSize находится размер символов текущего шрифта. Название шрифта записывается в поле szFont, а ссылка на соответствующий объект класса Font - в поле fontTextFont. Кроме того, в поле bLargeFont находится флаг увеличения размера шрифта в два раза.

Метод init

Прежде всего при инициализации аплета метод init устанавливает цвет фона окна:

setBackground(Color.yellow);

Затем выполняется создание всех списков и текстовых полей описаний:

lboxFont = new List(3, false);
lboxColor = new List(5, false);
lboxFontSize = new List(3, false);
lboxStyle = new List(4, true);
    
lblFont = new Label("Font:");
lblColor = new Label("Color:");
lblFontSize = new Label("Font size:");
lblStyle = new Label("Font style:");

Обратите внимание, что в конструкторе списка lboxStyle мы указали, что этот список допускает одновременный выбор нескольких элементов.

Далее списки и текстовые поля добавляются в окно аплета, располагаясь там в порядке добавления:

add(lblFont);
add(lboxFont);
add(lblColor);
add(lboxColor);
add(lblFontSize);
add(lboxFontSize);
add(lblStyle);
add(lboxStyle);

Перед завершением работы метод init наполняет списки, добавляя в них строки методом addItem:

lboxFont.addItem("Helvetica");
lboxFont.addItem("Courier");
lboxFont.addItem("TimesRoman");
    
lboxFontSize.addItem("14");
lboxFontSize.addItem("16");
lboxFontSize.addItem("18");
lboxFontSize.addItem("20");
lboxFontSize.addItem("22");
    
lboxColor.addItem("Red");
lboxColor.addItem("Blue");
lboxColor.addItem("White");
lboxColor.addItem("Black");
lboxColor.addItem("Yellow");
    
lboxStyle.addItem("Large");
lboxStyle.addItem("Bold");
lboxStyle.addItem("Italic");

Метод paint

При перерисовке окна аплета метод paint устанавливает в контексте отображения окна аплета цвет текста из поля clrText и шрифт, хранящийся в поле fontTextFont. После этого строка отображается в окне аплета методом drawString:

public void paint(Graphics g)
{
  g.setColor(clrText);
  g.setFont(fontTextFont);
  g.drawString("Test string", 10, 200);
}

Метод handleEvent

Получив управление, метод handleEvent проверяет, вызвано ли событие списком класса List, и если да, то связано ли оно с выделением или отменой выделения строк списка:

public boolean handleEvent(Event evt)
{
  List lboxChanged;
    
  if(evt.target instanceof List)
  {
    lboxChanged = (List)evt.target;
      
    if(evt.id == Event.LIST_SELECT ||
       evt.id == Event.LIST_DESELECT)
    {
      . . .
      repaint();
      return true;
    }
    else
      return false;
  }  
}

Если связано, то метод handleEvent обрабатывает событие и перерисовывает окно аплета. Если же нет - просто возвращает значение false.

Когда пользователь выбирает новый шрифт, его название записывается в поле szFont:

if(lboxChanged.equals(lboxFont))
{
  szFont = lboxChanged.getSelectedItem();
}

Для получения названия шрифта, выделенного пользователем, мы применили метод getSelectedItem.

Если изменился цвет, то мы определяем номер выделенной строки методом getSelectedIndex и устанавливаем в поле clrText нужный цвет:

else if(lboxChanged.equals(lboxColor))
{
  int nColor = 
    lboxColor.getSelectedIndex();
  switch(nColor)
  {
    case 0:
    {
      clrText = Color.red;
      break;
    }
    case 1:
    {
      clrText = Color.blue;
      break;
    }
    case 2:
    {
      clrText = Color.white;
      break;
    }
    case 3:
    {
      clrText = Color.black;
      break;
    }
    case 4:
    {
      clrText = Color.yellow;
      break;
    }
  }
}

Изменение стиля шрифта выполняется следующим образом.

Вначале мы записываем в поле nFontStyle значение Font.PLAIN, соответствующее отсутствию всякого выделения:

else if(lboxChanged.equals(lboxStyle))
{
  nFontStyle = Font.PLAIN;
        
  bLargeFont = lboxStyle.isSelected(0);
        
  if(lboxStyle.isSelected(1))
    nFontStyle |= Font.BOLD;
          
  if(lboxStyle.isSelected(2))
    nFontStyle |= Font.ITALIC;
}

Затем мы по очереди проверяем все элементы списка, вызывая метод isSelected, выполняя соответствующие действия. Если, например, была выбрана строка Large, мы записываем значение true в поле bLargeFont. А если пользователь выбрал выделение жирным шрифтом или наклоном, мы устанавливаем соответствующие флаги в поле nFontStyle.

И, наконец, при изменении размера символов шрифта мы получаем номер выделенной строки, умножаем его на два и прибавляем к начальному размеру (14 пунктов):

else if(lboxChanged.equals(lboxFontSize))
{
  nFontSize = 
    14 + 2 * lboxFontSize.getSelectedIndex();
}

Результат записывается в поле nFontSize.

Далее вне зависимости от того, какие изменения были произведены, мы получаем новый шрифт, отвечающий установленным параметрам, и перерисовываем окно аплета:

if(!bLargeFont)
  fontTextFont = new Font(szFont,
    nFontStyle, nFontSize);
else
  fontTextFont = new Font(szFont,
    nFontStyle, 2 * nFontSize); 
repaint();

Шрифт записывается в поле fontTextFont.


Назад Вперед

[Назад]