Назад
Вперед
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).
Рис. 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.
Назад Вперед |