Главная страница

Java. Полное руководство. 8-е издание. С. Н. Тригуб Перевод с английского и редакция


Скачать 25.04 Mb.
НазваниеС. Н. Тригуб Перевод с английского и редакция
АнкорJava. Полное руководство. 8-е издание.pdf
Дата28.02.2017
Размер25.04 Mb.
Формат файлаpdf
Имя файлаJava. Полное руководство. 8-е издание.pdf
ТипДокументы
#3236
страница70 из 90
1   ...   66   67   68   69   70   71   72   73   ...   90
ГЛАВА
Использование элементов
управления,диспетчеров компоновки и меню библиотеки В этой главе продолжим исследование библиотеки AWT. Сначала рассмотрим стандартные элементы управления и диспетчеры компоновки. Затем речь пойдет о меню и полосе меню. Мы поговорим о двух компонентах верхнего уровня — диалоговом окне и диалоговом окне выбора файла. В конце главы предложим другой взгляд на вопрос обработки событий.
Элементамиуправленилнгзывгются компоненты, которые позволяют пользователю взаимодействовать с вашим приложением различными способами например, наиболее распространенным элементом управления является экранная кнопка. Диспетчер компоновки автоматически позиционирует компоненты внутри контейнера. Поэтому внешний вид окна зависит как от элементов управления, которые оно содержит, таки от диспетчера компоновки, используемого для их позиционирования.
Кроме элементов управления, обрамляющее окно может также включать полосу меню стандартного стиля. Каждый пункт полосы меню раскрывает меню, в котором пользователь может выбрать необходимую ему команду. Полоса меню всегда располагается в верхней части окна.
Несмотря на различие во внешнем виде, полосы меню обрабатываются почти также, как и другие элементы управления. Несмотря на то что позиционировать компоненты в окне можно вручную, сделать это обычно непросто. Диспетчер компоновки выполняет эту задачу автоматически. Вначале этой главы, где рассматриваются различные элементы управления, используется диспетчер компоновки, принятый по умолчанию. Он отображает компоненты в контейнере, размещая их слева направо и сверху вниз. После того как рассмотрим элементы управления, поговорим о диспетчерах компоновки. Вы узнаете, как лучше всего управлять позиционированием элементов управления.
Библиотека AWT поддерживает следующие типы элементов управления:
• метки;
• экранные кнопки;
• флажки;
• списки выбора;
• списки;
• полосы прокрутки;
• элементы редактирования текста.
Все эти элементы управления относятся к подклассам класса Com Основы элементов управления

7 8 Часть II. Библиотека Добавление и удаление элементов управления
Чтобы включить элемент управления в окно, его нужно сначала добавить к нему. Для этого необходимо создать экземпляр требуемого элемента управления, после чего добавить его в окно с помощью метода a d d ( )
, который определен классом
C o n t a i n e r . Метод a d d
() имеет несколько форм. Вначале этой главы используется следующая форма add(Component

объектУпр)
Здесь параметр объектУпр
представляет экземпляр элемента управления, который вы хотите добавить. Метод возвращает ссылку на объект объектУпр. После того как элемент управления будет добавлен, он будет отображаться при появлении его родительского окна.
Иногда необходимо удалить элементы управления из окна. Для этого служит метод re m o v e ( )
. Он тоже определен в классе
C o n t a i n e r . Вот одна из его форм remove(Component
объект)
Здесь параметр объект
представляет ссылку на элемент управления, который вы хотите удалить. Можно удалить все элементы управления, если вызвать метод r e m o v e A l l ( ) Реакция на действия над элементами управления
За исключением меток, которые являются пассивными элементами, каждый элемент управления извещает о событии в тот момент, когда к нему обращается пользователь. Например, когда пользователь щелкает на экранной кнопке, происходит событие, идентифицирующее эту кнопку. В общем случае ваша программа просто реализует соответствующий интерфейс, после чего регистрирует слушателя события для каждого элемента управления, за которым вы хотите вести наблюдение. Как было сказано в главе 23, если установить слушатель, то извещения о событиях будут передаваться ему автоматически. В последующих разделах для каждого элемента управления будет описан соответствующий интерфейс.
Исклю чение
H e a d l e s s E x c e p t i o Большинство элементов управления библиотеки AWT, рассматриваемых в этой главе, имеют конструкторы, способные передавать исключение
H e a d l e s s E x c e p t i o n при попытке создать экземпляр компонента GUI в неинтерактивной среде те. в среде, в которой, например, нет монитора, мыши или клавиатуры. Исключение
H e a d l e s s E x c e p ti o n было добавлено в Java 1.4. С помощью этого исключения можно написать код, который будет адаптироваться к неинтерактивным средам. Естественно, делать это можно не всегда) Данное исключение не обрабатывается программами в этой главе, так как для иллюстрации элементов управления библиотеки AWT нужна интерактивная среда.
М е т к и
Самым простым элементом управления является метка. Мешка представляет собой объект класса
L a b e l и содержит строку, которую она отображает. Метки являются пассивными элементами управления, не поддерживающими никакого взаимодействия с пользователем. Класс
L a b e l определяет следующие конструкторы
Глава 25. Использование элементов управления, диспетчеров компоновки.
7 8 5
L a b e l () throws HeadlessException
Label(String строка throws HeadlessException
Label(String строка int как throws В первом варианте создается пустая метка, во втором — метка, содержащая строку строка эта строка выравнивается полевому краю. В третьем варианте создается метка, содержащая строку строка, выравнивание которой определяется с помощью параметра как Параметр как должен принимать одну из следующих трех констант
Label.
LEFT, Label.
RIGHT или
Label.
Изменить состояние текста в метке можно с помощью метода setText (). Получить текущую метку можно с помощью метода get
Text ()
. Эти методы показаны далее setText(String строка В методе setText
() параметр строка определяет новую метку. Метод get­
Text
() возвращает текущую метку.
Выровнять строку в метке можно с помощью метода set
Alignment ()
. Чтобы получить текущее выравнивание, используется метод get
Alignment ()
. Эти методы показаны ниже setAlignment(int как)
int Здесь параметр как должен представлять одну из трех приведенных выше констант. В следующем примере создаются три метки, которые затем добавляются в аплет.
// Демонстрация меток
import j a v a .a w t .*;
import java.applet.*;
/*


*/
public class LabelDemo extends Applet {
public void in i t () {
Label one = new L a b e l ("One");
Label two = new L a b e l ("Two");
Label three = new L a b e l ("Three");
// добавление меток в окно аплета
add(one);
a d d (two); На рис. 25.1 показано окно, созданное аплетом
LabelDemo. Обратите внимание на то, что упорядочение меток в окне выполнено при помощи диспетчера компоновки, используемого по умолчанию. Позже вы увидите, каким образом можно более точно управлять размещением меток.
Использование кнопок
Пожалуй, наиболее широко используемым элементом управления является кнопка. Экранная кнопка — это компонент, который содержит метку и извещает особы тии, когда пользователь щелкает на ней кнопкой мыши. Экранные кнопки являются объектами класса
Button. Класс
Button определяет следующие конструкторы

7 8 6 Часть II. Библиотека Java
. = | A p p le t V ie w e r: La Ь еЮ ето л |
A pplet
One
Tw o
T h ree
A pplet Рис. 25.1. Окно аплета LabelD em o
Button() throws HeadlessException
Button(String строка throws В первом варианте создается пустая кнопка, во втором — кнопка сметкой строка После того как кнопка создана, с помощью метода s e t L a b e l () можно определить ее метку. Получить метку можно с помощью метода g e t L a b e l ( ) . Эти методы показаны ниже строка Здесь параметр строка представляет новую метку для кнопки.
Обработка кнопок
Когда пользователь щелкает на кнопке, происходит событие действия. Извещение о нем посылается любому слушателю, который предварительно зарегистрировался на получение извещений о событиях действия отданного компонента. Каждый слушатель реализует интерфейс. Этот интерфейс определяет метод a c t i o n P e r f o rm ed ( ) , который вызывается вовремя события. В качестве параметра для этого метода указывается объект класса A c tio n E v e n t. Он содержит ссылку на кнопку, извещающую о событии, и ссылку на командную строку действия, связанную с этой кнопкой. По умолчанию командной строкой действия является метка кнопки. Как правило, для идентификации кнопки используется или ссылка на кнопку, или командная строка действия. (Скоро вы увидите примеры каждого подхода.)
Н иже показан пример создания трех кнопок с метками " Y e s " (Да, "N o" (Нет) и " U n d e c id e d " (Нет решения. Когда пользователь щелкает на одной из кнопок, отображается сообщение, свидетельствующее о выбранной кнопке. В этом варианте команда действия кнопки (которая по умолчанию является ее меткой) используется для определения, на какой из кнопок выполнен щелчок. Получение метки производится при помощи вызова метода g e tA c tio n C o m m a n d () в объекте класса A c t i o n E v e n t , который передается методу a c t i o n P e r fo r m e d () .
I l l Пример кнопок
import j a v a .a w t .*;
import j a v a .a w t .event.*;
import java.applet.*;
/*


*/
public class ButtonDemo extends Applet implements ActionListener {
Глава 25. Использование элементов управления, диспетчеров компоновки.
7 8 7
String msg = "";
Button yes, no, maybe;
public void i n i t () {
yes = new Button("Yes");
no = new Button("No");
maybe = new Button("Undecided"),
}
add(yes);
a d d (n o );
add(maybe);
y e s .addActionListener(this);
n o .addActionListener(this);
m a y b e .addActionListener(this)
public void actionPerformed(ActionEvent ae) {
String str = a e .getActionCommand();
i f (s t r .equals("Yes")) {
msg = "You pressed Y e s .";
// msg = "Нажата кнопка Yes.";
}
else i f (s t r .equals("No")) {
msg = "You pressed No.";
// msg = "Нажата кнопка No.";
}
}
else {
msg
// msg
}
repaint(
"You pressed Undecided."; Нажата кнопка Undecided.";

public void paint(Graphics g) {
g .drawString(msg,
6, Окно функционирующего аплета B uttonD em o можно видеть на рис. 25.2.
#’ A p p le t V ie w e r: B u tto n ... та Рис. 25.2. Окно аплета

ButtonDemo

7 8 Часть II. Библиотека Как уже было сказано, помимо сравнения командных строк действия кнопок, можно также определить, на какой из кнопок выполнен щелчок, если сравнить объект, полученный из метода g e t S o u r c e ( )
, с объектами кнопок, которые вы добавляете в окно. Для этого следует вести список добавляемых объектов. Этот подход отражен в следующем аплете.
// Распознавание объектов Button,
import j a v a .a w t .*;
import j a v a .a w t .event.*;
import java.applet.*;
/*


*/
public class ButtonList extends Applet implements ActionListener {
String msg = "";
Button bList[] = new Button[3];
public void i n i t () {
Button yes = new Button("Yes");
Button no = new B u tton("No");
Button maybe = new B u tton("Undecided")
// сохранение ссылок на кнопки при добавлении
bList[0] = (Button) add(yes);
bList[l] = (Button) add(no);
bList[2] = (Button) add(maybe);
// регистрация на получение уведомлений о событиях действия
for(int i = 0; i < 3; i++) {
bList[i].addActionListener(this);
}
}
public void actionPerformed(ActionEvent ae) {
for(int i = 0; i < 3; i++) {
if(ae.getSource() == bList[i]) {
msg = "You pressed " + b L i s t [i ].getLabel();
// msg = "Нажата кнопка " + b L i s t [i ].getLabel();
}
}
repaint();
}
public void paint(Graphics g) {
g .drawString(msg,
6, В этом варианте при добавлении кнопок в окно аплета программа записывает в массив ссылку на каждую кнопку. (Вспомните, что метод a d d
() возвращает ссылку на кнопку при ее добавлении) Впоследствии этот массив используется в методе a c t i o n P e r f o rm ed ( )
, чтобы определить, на какой кнопке выполнен щелчок.
В простых аплетах распознать кнопки по их меткам обычно несложно. Но если выбудете изменять метку внутри кнопки вовремя выполнения или использовать кнопки с одинаковыми метками, то определить, на какой кнопке выполнен щелчок, можно очень легко, если воспользоваться ее объектной ссылкой. Можно также присвоить строке команды действия, связанной с кнопкой, что-нибудь отличное от ее метки, вызвав метод s e t A c t ionCommand ( )
. Он изменяет строку команды действия, не влияя
Глава 25. Использование элементов управления, диспетчеров компоновки 8 на строку, используемую в качестве метки кнопки. Таким образом, если задать строку команды действия, можно отделить друг от друга команду действия и метку кнопки.
Использование флажков
Флажок представляет собой элемент управления, который служит для включения или отключения чего-нибудь. Он состоит из небольшого окна, которое может либо содержать отметку (в виде галочки, либо быть пустым. У каждого флажка есть метка, описывающая параметр, который представляет флажок. При щелчке на флажке можно изменить его состояние. Флажки могут использоваться как индивидуально, таки в составе группы. Они являются объектами класса
C h e c k b o x . Класс
C h e c k b o x поддерживает следующие конструкторы) throws HeadlessException

Checkbox(String строка throws HeadlessException
Checkbox(String строка boolean
вкл)
throws HeadlessException
Checkbox(String строка boolean
вкл,
CheckboxGroup
группаФлажка)
throws
HeadlessException
Checkbox(String строка
группаФлажка,
boolean
вкл)
throws Первая форма конструктора создает флажок, метка которого изначально является пустой. Флажок находится в сброшенном состоянии. Вторая форма создает флажок, метка которого определяется параметром строка.
Флажок находится в сброшенном состоянии. Третья форма позволяет установить исходное состояние флажка. Если параметр в кл содержит значение t r u e , то флажок изначально будет установлен, в противном случае — нет. Четвертая и пятая формы создают флажок, метка которого определяется параметром строка, а группа — параметром группаФлажка. Если флажок не является частью группы, то параметр группаФлажка
должен иметь значение n u l l . Группы флажков описываются в следующем разделе) Значение параметра в кл определяет исходное состояние флажка.
Чтобы получить текущее состояние флажка, используется метод g e t S t a t e ( ) . Для установки его состояния используется метод s e t S t a t e ( ) . C помощью метода g e t L a b e l
() можно получить текущую метку, связанную с флажком. Чтобы задать метку, нужно вызвать метод s e t L a b e l ( )
. Эти методы показаны ниже getState()

void setState(boolean
вкл)
String getLabel()
void setLabel(String
строка)
Если параметр в кл содержит значение t r u e , то флажок будет установлен. Если он содержит значение
false, флажок будет сброшен. Строка, передаваемая в параметре строка, становится новой меткой, связанной с вызываемым флажком.
Обработка флажков
Каждый раз, когда флажок устанавливается или сбрасывается, происходит событие элемента. Извещение о нем передается любому слушателю, который ранее зарегистрировался на получение извещений о событиях элемента отданного компонента. Каждый слушатель реализует интерфейс
I t e m L i s t e n e r . Этот интерфейс определяет метод i t e m S t a t e C h a n g e d
(). Объект класса
I t e m E v e n t задается в качестве параметра для данного метода. Он содержит информацию о событии например, выбор или отмена выбора

7 9 0 Часть II. Библиотека В следующей программе создается четыре флажка. Первый флажок изначально установлен. Состояние каждого флажка отображается. Каждый раз при изменении состояния флажка производится обновление отображаемого состояния Демонстрация применения флажков
import j a v a .a w t .*;
import java.awt.event.*;
import java.applet.*;
/*


*/
public class CheckboxDemo extends Applet implements ItemListener {
String msg = "";
Checkbox winXP, w i n 7 ,
s o l a n s , mac;
public void init() {
winXP = new Checkbox("Windows XP" ,
null, true);
win7 = new Checkbox("Windows 7");
solaris = new Checkbox("Solaris") ;
mac = new Checkbox("Mac O S " );
add(winXP);
add(win7)
;
add(solaris) ;
add(mac);
winXP.addltemListener(this);
w i n 7 .addltemListener(this)
;
solaris.addltemListener(this);
m a c .addltemListener(this);
}
public void itemStateChanged(ItemEvent ie) {
repaint();
}
// Отображение текущего состояния флажков void paint(Graphics g) {
msg = "Current state: ";
// msg = "Текущее состояние ";
g .drawString(msg,
6, 80);
msg = " Windows XP: " + w i n X P .getState();
g .drawString(msg,
6, 100);
msg = " Windows 7: " + w i n 7 .getState();
g .drawString(msg,
6> 120);
msg = " Solaris: " + solaris.getState();
g .drawString(msg,
6, 140);
1   ...   66   67   68   69   70   71   72   73   ...   90


написать администратору сайта