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

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


Скачать 25.04 Mb.
НазваниеС. Н. Тригуб Перевод с английского и редакция
АнкорJava. Полное руководство. 8-е издание.pdf
Дата28.02.2017
Размер25.04 Mb.
Формат файлаpdf
Имя файлаJava. Полное руководство. 8-е издание.pdf
ТипДокументы
#3236
страница72 из 90
1   ...   68   69   70   71   72   73   74   75   ...   90
TRACK
Произошло событие абсолютного перемещения
UNIT_DECREMENT
Нажата кнопка перевода страницы на одну строку вниз
UNIT_INCREMENT
Нажата кнопка перевода страницы на одну строку вверх
Следующий код создает вертикальную и горизонтальную полосы прокрутки. Отображаются текущие настройки полос прокрутки. При перемещении курсора мыши в окне координаты каждого события перемещения будут использоваться для обновления полос прокрутки. Звездочка отображается в текущей позиции при перетаскивании. Обратите внимание на то, как метод s e t P r e f e r r e d S i z e () позволяет устанавливать размер полос прокрутки Демонстрация применения полос прокрутки
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
/*


*/
public class SBDemo extends Applet
implements AdjustmentListener, MouseMotionListener {
String msg = "";
Scrollbar vertSB, horzSB;
public void ini t () {
int width = Integer.parselnt(getParameter("width"));
int height = Integer.parselnt(getParameter("height"));
vertSB = new Scrollbar(Scrollbar.VERTICAL,
0, 1, 0, height);
vertSB.setPreferredSize(new Dimension(20, 100));
horzSB = new Scrollbar(Scrollbar.HORIZONTAL,
0, 1, 0, width);
horzSB.setPreferredSize(new Dimension(100, 20));
add(vertSB);
add(horzSB);
// регистрация на получение уведомлений о событиях
vertSB.addAdjustmentListener(this);
horzSB.addAdjustmentListener(this);
addMouseMotionListener(this)
;
}

8 0 Часть II. Библиотека Java
public void adjustmentValueChanged(AdjustmentEvent ae) {
repaint();
}
// Обновление полос прокрутки в ответ на перетаскивание
// с помощью мыши void mouseDragged(MouseEvent me) {
int x = m e .g e t X ();
int у = m e .g e t Y ();
vertSB.setValue(y);
horzSB.setValue(x);
repaint();
// Это нужно для MouseMotionListener
public void mouseMoved(MouseEvent me) {
}
// Отображение текущего значения полос прокрутки
public void paint(Graphics g) {
msg = "Vertical: " + vertSB.getValue();
// msg = "Вертикальная " + vertSB.getValue();
msg += ", Horizontal: " + horzSB.getValue();
// msg +- ", Горизонтальная " + horzSB.getValue();
g .drawString(msg,
6, 160);
// показываем текущую позицию при перетаскивании с помощью
g .drawString("*", horzSB.getValue(),
vertSB.getValue());
}
}
Аплет
SBDemo вовремя выполнения показан на рис. 25.7.
НЯ
ftpptet
Vertical: 117, Horizontal. 152
Applet Рис. 25.7. Окно аплета
SBDemo
Глава 25. Использование элементов управления, диспетчеров компоновки.
8 Использование класса Класс
TextField реализует однострочную область для ввода текста, которая называется текстовым полем В текстовых полях пользователь может вводить строки и редактировать текст. Класс
TextField является подклассом класса
TextComponent и определяет следующие конструкторы) throws HeadlessException

TextField(int
количСимволов)
throws HeadlessException
TextField(String строка throws HeadlessException
TextField(String строка int
количСимволов)
throws Первый вариант создает текстовое поле. Второй — текстовое поле, ширина которого в символах определяется параметром количС им во лов.
Третий вариант конструктора инициализирует текстовое поле и устанавливает его ширину.
Класс
TextField и его суперкласс
TextComponent предлагают несколько методов, с помощью которых можно работать с текстовым полем. Чтобы узнать, какая строка содержится на данный момент в текстовом поле, вызовите метод getText (). Чтобы настроить текст, вызовите метод setText ()
. Эти методы показаны ниже getText()

void setText(String
строка)
Здесь параметр строка
определяет новую строку.
Пользователь может выделить часть текста в текстовом поле. Часть текста также можно выделить программно с помощью метода select ()
. При помощи метода get
Select edText
() программа сможет узнать, какой текст выделен в данный момент. Упомянутые методы показаны ниже getSelectedText()

void select(int
начИндекс,
int
конИндекс)
Метод getSelectedText
() возвращает выделенный текст. Метод select
() выделяет символы, начиная со значения начИ ндекс
и заканчивая значением
к он Индекс -С помощью метода set
Edit able
() пользователю можно разрешить изменять содержимое текстового поля, ас помощью метода isEditable
() — редактировать текст. Эти методы показаны ниже isEditableO
void setEditable(boolean
правкаВозможна)
Метод isEdi table
() возвращает значение true, если текст можно изменять, и значение false
— если текст изменять нельзя. Если в методе setEditable
() параметр правкаВозмож на
содержит значение true, то текст можно изменять, а если значение false
— текст изменять нельзя.
Иногда нужно сделать так, чтобы текст, вводимый пользователем, был невидим в частности, при вводе пароля. С помощью метода setEchoChar
() можно отключить отображение вводимых символов. Этот метод задает одиночный символ, который объект класса
TextField будет отображать при вводе символов (и, следовательно, реальные символы отображаться не будут. С помощью метода getEchoChar
() можно узнать, включен ли этот режим для текстового поля. Получить символ отображения можно с помощью метода getEchoChar ()
. Эти методы показаны ниже setEchoChar(char символ)
boolean echoCharlsSet()
char Здесь параметр символ определяет отображаемый символ. Если значением параметра символ будет нуль, то восстанавливается нормальное отображение на экране Зак 3030

8 0 Часть II. Библиотека Обработка текстовых полей
Поскольку текстовые поля выполняют собственные функции редактирования, ваша программа вообще не будет реагировать на события отдельных клавиш, происходящие в текстовом поле. Однако вам, возможно, нужно будет сделать так, чтобы пользователь мог нажимать клавишу . При нажатии этой клавиши будет происходить событие действия.
Ниже показан пример, в котором создается классический экран для ввода имени пользователя и пароля Демонстрация применения текстового поля
import j a v a .a w t .*;
import j a v a .a w t .event.*;
import java.applet.*;
/*


*/
public class TextFieldDemo extends Applet
implements ActionListener {
TextField name, pass;
public void init() {
Label namep = new Label("Name: ", Label.RIGHT);
// Label namep = new
L a b e l (Имя ", Label.RIGHT);
Label passp = new La b e l ("Password: ", Label.RIGHT);
// Label passp = new La b e l (Пароль, Label.RIGHT);
name = new TextField(12);
pass = new TextField(8);
p a s s .setEchoChar('?');
add(namep);
a d d (name);
add(passp);
add(pass);
// регистрация на получение уведомлений о событиях действия
name.addActionListener(this);
p a s s .addActionListener(this);
}
// Пользователь нажал .
public void actionPerformed(ActionEvent ae) {
repaint();
}
public void paint(Graphics g) {
g .drawstring("Name:
" + n a m e .getText(), 6, 60);
g .drawString("Selected text in name: " +
n a m e .getSelectedText(), 6, 80);
g.drawString("Password: " + p a s s .getText(), 6, 100);
// g Имя " + n a m e .getText(), 6, 60);
// g Выделенный текст в имени " +
//
n a m e .getSelectedText(), 6, 80);
// g Пароль " + p a s s .getText(), 6, 100);
}
}
Аплет T e x t F i e l d D e m o вовремя выполнения показан на рис. 25.8.
Глава 25. Использование элементов управления, диспетчеров компоновки.
8 0 3
. ,
f
bfc ъ % J -

^ ^ Y ^ ^ ф г ^ ,4, * j* >
; f IfA p p le t V ie w e r:T e x tF ie ld D e m o
| Applet
|
Nam e: 1 Herb Ш 1 Ш, j '?*?????'?'???
4
юямммшвпи
Name: Herb Schildt
Selected text in nam e Schildt
Password' Idfkjslkdf
Applet Рис. 25.8. Окно аплета Использование класса
T e x t A r e Иногда одной строки для ввода текста недостаточно. На этот случай библиотека AWT предлагает простой многострочный редактор — класс
TextArea. Ниже показаны конструкторы этого класса) throws HeadlessException

TextArea(int
количСтрок,
int
количСимволов)
throws HeadlessException
TextArea(String строка throws HeadlessException
TextArea(String строка
количСтрок,
int
количСимволов)
throws
HeadlessException
TextArea(String строка int
количСтрок,
int
количСимволов,
int
пПрокрутки)
throws Здесь параметр количСтрок
определяет высоту текстовой области, измеряемой в строках, а параметр количС им волов
задает ее ширину, измеряемую в символах. Исходный текст можно определить при помощи параметра строка.
В пятом варианте можно создать полосы прокрутки, которые могут понадобиться для работы с этой областью. Параметр пПрокрутки должен
принимать одно из следующих значений.
SCROLLBARS_BOTH
SCROLLBARS_NONE
SCROLLBARS_HORIZONTAL_ONLY
SCROLLBARS_VERTICAL_ONLY
Класс
TextArea является подклассом класса
Text
Component. Следовательно, он поддерживает методы getText (), setText (), getSelectedText (), se­
lect
( ), isEditable
() и setEditable
( ), описанные в предыдущем разделе.
Класс
TextArea включает следующие дополнительные методы append(String строка insert(String строка int индекс replaceRange(String строка int

начИндекс,
int
конИндекс)
Метод append
() добавляет строку, определяемую при помощи параметра строка, вконец текущего текста. Метод insert
() вставляет строку, указанную параметром строка, вместо, определенное индексом. Чтобы заменить текст, вызовите метод replaceRange
(). Он заменяет символы, начиная с индекса, указанного в параметре нач Индекс, и заканчивая индексом, указанным в параметре кон Индекс на текст, передаваемый в параметре строка

8 0 Часть II. Библиотека Текстовые области являются практически автономными элементами управления. Вашей программе не грозят издержки, связанные с управлением областями текста. Обычно программа просто получает текущий текст, если в этом есть необходимость. Однако, при желании, вы можете прослушивать события класса
T e x t E v e n t. В следующей программе создается элемент управления класса
T e x t A re a .
// Демонстрация применения TextArea,
import j a v a .a w t .*;
import ja v a .applet.*;
/*


*/
public class TextAreaDemo extends Applet {
public void ini t () {
String val =
"Java 7 is the latest version of the most\n" +
"widely-used computer language for Internet programming.\n" +
"Building on a rich heritage, Java has advanced both\n" +
"the art and science of computer language design.\n\n" +
"One of the reasons for Java's ongoing success is its\n" +
"constant, steady rate of evolution. Java has never stood\n" +
"still. Instead, Java has consistently adapted to the\n" +
"rapidly changing landscape of the networked world.\n" +
"Moreover, Java has often led the way, charting the\n" +
"course for others to follow.";
TextArea text = new TextArea(val,
10, 30);
dd(text);
Аплет
T ex tA reaD em o вовремя выполнения показан на рис. 25.9.
11
Applet Viewer: TextAreaDemo
|
- || П ||
X
|
Applet
[Java 7 is the latest version of the m o s l|
widely-used computer language for In [
Building on a rich heritage, Java has a f
the art and science of computer (angu I
One of the reasons for Java's ongoing 1
constant, steady rate of evolution Java I
still Instead, Java has consistently ad
j
rapidly changing landscape of the neft
Moreover, Java has often led the wav, «1
S '
Applet Рис. 25.9. Окно аплета
TextAreaDemo
Глава 25. Использование элементов управления, диспетчеров компоновки.
8 0 Диспетчеры компоновки
Каждый рассмотренный до настоящего времени компонент позиционировался диспетчером компоновки, используемым по умолчанию. Как было замечено вначале этой главы, диспетчер компоновки автоматически размещает ваши элементы управления внутри окна с применением некоторого алгоритма. Если вам приходилось писать программы для других сред с графическим пользовательским интерфейсом (например, для Windows), то вы, возможно, привыкли размещать свои средства управления вручную. Хотя элементы управления, созданные с помощью Java, тоже можно размещать вручную, вы вряд ли этим будете заниматься. На это есть две главные причины. Во-первых, размещать вручную большое количество компонентов очень утомительно. Во-вторых, в тот момент, когда нужно расположить какой-нибудь элемент управления, вы можете не знать о том, какую он имеет высоту и ширину, поскольку на этот момент еще не будут готовы собственные компоненты инструментария. Эта ситуация подобна загадке о происхождении курицы и яйца — трудно понять, когда можно использовать размеры данного компонента для его позиционирования относительно другого компонента.
У каждого объекта класса
Container имеется свой диспетчер компоновки, который представляет собой экземпляр любого класса, реализующего интерфейс
LayoutManager. Диспетчер компоновки устанавливается при помощи метода setLayout
(). Если вызов метода setLayout
() не осуществляется, используется диспетчер компоновки, принятый по умолчанию. Всякий раз при изменении размеров контейнера (или при начальном определении размеров) диспетчер компоновки используется для позиционирования каждого компонента внутри контейнера.
Метод setLayout
() имеет следующую общую форму setLayout(LayoutManager

объектКомпоновки)
Здесь параметр объектКомпоновки
представляет ссылку на требуемый диспетчер компоновки. Если вы хотите отменить использование диспетчера компоновки и позиционировать компоненты вручную, присвойте параметру объектКомпоновки значение null. Если вы сделаете это, вам нужно будет определить форму и позицию каждого компонента вручную с помощью метода set
Bounds ()
, определенного в классе
Component. Обычно выбудете работать с диспетчером компоновки.
Каждый диспетчер компоновки следит за списком компонентов, хранящихся под своими именами. Диспетчер компоновки получает уведомление каждый раз, когда вы добавляете компонент в контейнер. Всякий раз, когда нужно изменить размеры контейнера, диспетчер компоновки использует для этого свои методы m i n i m u m L a y o u t S i z e () и p r e f e r r e d L a y o u t S i z e (). Каждый компонент, который находится под управлением диспетчера компоновки, содержит методы g e t -
P r e f e r r e d S i z e () и g e t Mi n i m um S iz e (). Они возвращают предпочтительный и минимальный размеры, которые необходимы для отображения каждого компонента. Диспетчер компоновки будет учитывать их, если это вообще будет возможно, и поддерживать непротиворечивую политику размещения. Можно переопределить эти методы для элементов управления, для которых вы создаете подклассы. Иначе будут применяться значения по умолчанию имеет несколько предварительно определенных классов диспетчеров компоновки, часть из которых будет описана далее. Вы можете использовать такой диспетчер компоновки, который наилучшим образом подходит для вашего приложения.
Класс
F l o w L a y o u Диспетчер компоновки класса
FlowLayout используется поумолчанию. Именно этот диспетчер компоновки применялся в предыдущих примерах. Диспетчер клас­

8 0 Часть II. Библиотека Java
са
FlowLayout реализует простой стиль компоновки, который подобен тому, как следуют друг за другом слова в текстовом редакторе. Направление размещения определяется свойством ориентации компонента контейнера, которое по умолчанию задает направление слева направо и сверху вниз. Поэтому по умолчанию компоненты размещаются построчно, начиная с левого верхнего угла. В любом случае, если строка больше не может уместить компонент, он появится в следующей строке. Между каждым компонентом остается небольшой промежуток сверху и снизу, атак же справа и слева. Ниже показаны конструкторы класса
FlowLayout.
FlowLayout()
FlowLayout(int как как int гори з ,
int
верт)
Первый вариант размещает элементы по схеме, принятой по умолчанию, — компоненты размещаются по центру, а между ними остается промежуток, равный пяти пикселям. Второй вариант позволяет определить способ расположения каждой строки. Ниже представлены допустимые значения параметра как.
• FlowLayout.LEFT
• FlowLayout.CENTER
• FlowLayout.RIGHT
• FlowLayout.LEADING
• FlowLayout.TRAILING
Эти значения определяют выравнивание полевому краю, по центру, по правому краю, переднему и заднему соответственно. Третий конструктор позволяет определить промежутки по горизонтали и вертикали между компонентами при помощи параметров гори з
и верт. Ниже показан вариант уже знакомого вам аплета
CheckboxDemo, измененного таким образом, что в нем используется последовательное размещение с выравниванием влево Компоновка с выравниванием влево
1   ...   68   69   70   71   72   73   74   75   ...   90


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