Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
101
Добавлен:
30.03.2021
Размер:
42.12 Mб
Скачать

988

Часть

11.

Библиотека

Java

управления

из

библиотеки

АWT,

если

в

его

приемнике

определяется

функцио­

нальный

интерфейс.

Например,

интерфейс

IternListener

также

является

функ­

циональным.

Безусловно,

традиционный способ

обработки

событий,

применение

для

этой

цели

анонимного

внутреннего

класса

или лямбда-выражения

зависит

от

характера

прикладной

программы.

В

остальных

примерах,

представленных

да­

лее

в

этой

главе,

применяется

традиционный

способ

обработки

событий,

чтобы

исходный

код

этих

примеров

можно

было

скомпилировать

практически

в

любой

версии

Java.

Но

ради

интереса

можно

попытаться

переделать

обычные

обработчи­

ки

событий

на

лямбда-выражения

или

анонимные

внутренние

классы

там,

где

это

уместно. Флажки

Флажок чения или

представляет собой элемент управления, предназначенный для вклю­ отключения какого-нибудь режима. Он состоит из небольшой прямо­

угольной

ячейки,

которая

может

содержать

отметку

в

виде

галочки,

если

флажок

установлен,

или

быть

пустой.

Щелчком

на

флажке

можно

изменить

его

текущее

состояние,

т.е.

установить

или

сбросить.

Флажки

могут

использоваться

как

по

от­

дельности,

так

и

в группе.

Они

представлены

объектами

класса

Checkbox.

В

классе

Checkbox

поддерживаются

следующие

конструкторы:

Checkbox()

throws HeadlessException

 

 

 

Checkbox(String

строка)

throws

HeadlessException

HeadlessException

Checkbox(String

строка,

boolean

включено)

throws

Checkbox(String

строка,

boolean

включено,

 

 

CheckboxGroup

группа_флажков)

throws HeadlessException

Checkbox(String

boolean

строка, CheckboxGroup группа_флажков,

включено)

throws HeadlessException

В

первой форме конструктора

создается флажок с

пустой изначально мет­

кой.

Исходно флажок находится в

сброшенном состоянии. Во второй форме кон­

структора создается флажок, метка которого определяется параметром строка.

Исходно флажок находится в сброшенном состоянии.

В третьей

форме можно

установить исходное состояние флажка. Если параметр

включено

принимает ло­

гическое значение t rue, то флажок будет исходно установлен, а иначе - сброшен.

В четвертой и пятой формах создается флажок, метка которого определяется па­

раметром

строка,

а

группа

-

параметром

группа_

флажков.

Если

флажок

не

яв­

ляется

частью

группы,

то

параметр

группа_флажков

должен

принимать

пустое

значение

null.

(Группы

флажков

описываются

в

следующем

разделе.)

Значение

параметра включено определяет исходное состояние флажка.

Для получения текущего состояния флажка служит метод getState

(),а

для

его

установки

в

нужное

состояние

-

метод

setState

().

Вызвав

метод

get

Label

(),можно

получить

текущую

метку,

связанную

с

флажком.

А

для

того

что­

бы

задать

метку,

следует вызвать

метод

setLabel

().

Ниже

приведены

общие

формы

этих

методов.

Глава

26.

Применение

элементов

управления,

диспетчеров

компоновки".

989

boolean getState() void setState(boolean String getLabel() void setLabel(String

включено) строка)

Если

параметр

включено

принимает

логическое

значение

true,

то

флажок

будет

установлен.

А

если

этот

параметр

принимает

логическое

значение

false,

то

флажок

будет

сброшен. Заданная

строка

становится

новой

меткой,

связанной

с

вызывающим

флажком.

Обработка

событий

от

флажков

Всякий

раз,

когда

флажок устанавливается

или

сбрасывается,

наступает

со­

бытие

от

элемента.

Извещение

о

нем

передается

любому

приемнику

событий,

который

ранее

зарегистрировался

на

получение

извещений

о

событиях

от

эле­

ментов

данного

компонента.

Каждый

приемник

событий

реализует

интерфейс

ItemListener.

В этом

интерфейсе

определяется метод

itemStateChanged

().

Объект класса ItemEvent задается в качестве параметра данного держит сведения о событии (например, выбор или отмена выбора).

метода.

Он

со­

В

приведенном

ниже

примере

прикладной

программы

демонстрируется

соз­

дание и применение четырех флажков.

Состояние всех флажков отображается в

Исходно установлен первый

окне прикладной программы.

флажок. Оно об­

новляется

всякий

раз,

когда

изменяется

состояние

любого

флажка.

/!Продемонстрировать

применение

флажков

import

java.awt.*;

 

 

 

 

import

java.awt.event.*;

 

 

 

 

puЫic

class CheckboxDemo

extends

Frarne

irnplements

ItemListener

String rnsg

=

"";

 

 

 

 

 

Checkbox windows,

android,

solaris,

mac;

puЬlic CheckboxDerno()

{

 

 

//использовать

диспетчер

поточной

компоновки

setLayout(new

FlowLayout());

 

11

создать

флажки

 

 

true) ;

windows

 

new

Checkbox ("Windows",

android

=

new

Checkbox("Android");

 

solaris

=

new

Checkbox("Solaris");

 

rnac

= new

Checkbox("Mac OS");

 

//

ввести

флажки

в

фрейм

 

 

add (windows) ;

 

 

 

 

 

add(android);

 

 

 

 

 

add(solaris);

 

 

 

 

 

add (rnac)

;

 

 

 

 

 

 

{

11

ввести

приемники

событий

в

отдельных

элементах

windows.additernListener(this);

996

Часть

11.

Библиотека

Java

треть,

прокрутив

список.

Третья

форма

позволяет

выбрать

одновременно два

или

несколько

элементов

из

списка,

если

параметр

выбор_нескольких_элементов

принимает

логическое

значение

true.

Если

же

этот

параметр

принимает

логическое

значение

false,

то из

списка

можно

будет

выбрать только

один

элемент.

Для ввода

две формы:

элемента

в

список

следует

вызвать

метод

add

(

) ,

у

которого

имеются

void void

add(String add(String

имя) имя,

int

индекс)

Здесь

параметр

имя

обозначает

имя

элемента,

вводимого

в

список.

В

первой

форме

элементы

вводятся

в

конце

списка,

а

во

второй

элемент

вводится

в

список

по

указанному

индексу.

Индексация

элементов

в списке

начинается

с

нуля.

Чтобы

ввести

элемент

в

конце

списка,

следует

указать

значение

-1

параметра

индекс.

Чтобы

выяснить,

какой

элемент

выбран

в

данный момент

из

тех

списков,

где

допу­

скается выбирать только один элемент, следует вызвать метод getSelecteditem или getSelectedindex ().Ниже приведены общие формы этих методов.

()

String getSelecteditem() int getSelectedindex()

Метод

getSelecteditem

()

возвращает

символьную

строку,

содержащую

имя

элемента.

Если

выбрано

несколько

элементов

или

пока

еще

не

выбран

ни

один

из

них,

то

возвращается

пустое

значение

null.

Метод

getSelectedindex

()

возвращает индекс выбранного элемента. Первый элемент имеет нулевой Если же выбрано несколько элементов или пока еще не выбран ни один из

индекс. них, то

возвращается пустое значение -1.

 

Чтобы выяснить, какие

элементы выбраны в

допускается одновременно

выбирать

несколько

данный момент из тех списков, где элементов, следует вызвать метод

getSelecteditems ()

или

getSelectedindexes

().

В

частности,

метод

get

Selecteditems

()

возвращает

массив,

содержащий

имена

выбранных

на

данный

момент

элементов,

а

метод

getSelectedindexes

()

-

массив,

содержащий

индек­

сы

выбранных

в

данный

момент

элементов.

Ниже

приведены

общие

формы

этих

ме­

тодов.

 

 

String(]

getSelecteditems()

int[J

getSelectedindexes()

Чтобы

выяснить,

сколько

элементов

содержится

в

списке,

следует

вызвать

ме­

тод

getitemCount

().А

с

помощью

метода

select

()

можно

определить,

какой

именно

элемент

выбран

в

данный

момент.

Для

этих

целей

служит

целочисленный

индекс,

начинающийся

с

нуля.

Ниже

приведены

общие

формы

этих

методов.

int void

getitemCount() select(int индекс)

По

указанному

индексу

можно

получить

имя,

связанное

с

элементом,

доступным

по

этому

индексу,

если

вызвать

метод

getitem

().Этот

метод имеет

приведенную

ниже

общую

форму,

где

индекс

обозначает

конкретный

индекс

требуемого

элемента.

String

getitem(int

индекс)

1002

Часть

11.

Библиотека

Java

11

показать

текущее положение перемещаемой

g. drawString ( "*", horz SB. getValue ( J ,

 

 

vertSB.getValue());

мыши

puЬlic static void main(String[]

args)

{

SBDemo appwin = new

SBDemo();

 

1 80));

appwin.setSize(new

Dimension(ЗOO,

appwin.setTitle("SBDemo");

 

 

 

appwin.setVisiЬle(true);

 

 

 

Пример прокрутки вертикальной и горизонтальной программы SBDemo приведен на рис. 26.7.

полос

в

окне

прикладной

SВD~mo

-----l=П-sl

Vertical

:

103,

Horizontal

:

48

Рис.

26.7.

Прокрутка

вертикальной

и

горизонтальной

полос

в

окне

прикладной

программы

SBDemo

Текстовые

поля

Класс

TextField

реализует однострочную

область

для

ввода

текста,

которая

называется

текстовым

полем.

В

текстовых

полях

пользователь

может

вводить

текст

построчно

и

редактировать

его.

Класс

TextField

является

производным

от

класса

TextComponent

и

имеет

следующие

конструкторы:

TextField()

throws HeadlessException

TextField(int количество_символов)

throws

HeadlessExcepti

on

TextField(String

TextField(String

throws

строка)

throws HeadlessException

строка,

int количество_символов)

HeadlessException

В

первой

форме

конструктора

создается

текстовое

поле,

а

во

второй

форме

-

тек­

стовое

поле шириной,

равной

заданному

количеству_символов.

В

третьей

форме

конструктора

создаваемое

текстовое

поле

инициализируется

указанной

строкой,

а

в

четвертой

форме

-

текстовое

поле

не

только

инициализируется

указанной

строкой,

но

и

получает

ширину,

равную

заданному

количеству_символов.

В

классе

TextField

и

его

суперклассе

TextComponent

предоставляется

ряд

методов

для

обращения

с

текстовыми

полями

.

Чтобы

получить

строку

из

тек­

стового

поля,

следует

вызвать

метод

getText

(),

а

для

того

чтобы

задать

в

нем

текст

-

метод

setText

().

Ниже

приведены

общие

формы

этих методов,

где

строка

обозначает

новую

строку

текста.

1006

Часть

11.

Библиотека

Java

Класс

TextArea

предоставляет

следующие

дополнительные

методы:

void void void

append(String

строка)

 

 

insert(String

строка,

int индекс)

replaceRange(String строка,

int начальный_индекс,

 

int конечный_индекс)

Метод append ( )

вводит

заданную

строку

в

конце

текущего

текста.

Метод

insert

()

вставляет

заданную

строку

по

указанному

индексу.

Чтобы

заменить

текст,

следует

вызвать

метод

replaceRange

().

Он

заменяет

символы

от

пози­

ции

начальный_индекс

и

до

позиции

конечный_индекс-l

текстом

из

задан­

ной строки. Текстовые

области

являются

практически

автономными

элементами

управле­

ния,

а

следовательно,

для

управления

ими

прикладная

программа

не

несет

допол­

нительные

издержки.

Как

правило,

прикладная

программа

лишь

получает

текущий

текст

по

мере

надобности.

Но

при

желании

можно

организовать

прием

и обработ­

ку событий типа TextEvent.

В следующем примере прикладной

программы

создается

элемент

управления

типа

TextArea.

11

Продемонстрировать

применение текстовой

области

import import

java.awt.*; java.awt.event

.*;

puЬlic class TextAreaDemo

extends

Frame

puЬlic TextAreaDemo()

{

 

 

{

11

использовать

диспетчер поточной

компоновки

setLayout(new

FlowLayout());

 

 

 

 

 

String val

=

 

 

 

 

 

 

 

 

 

 

 

 

"Java

9

is

the

latest

version of

the

most\n"

 

+

"widely-used

computer

language

for

Internet "

 

+

"programming.\n"

 

 

 

 

 

 

 

 

 

+

"Building

on

а 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 add (text);

=

new

TextArea(val,

10,

30);

addWindowListener(new WindowAdapter()

1010

Часть

11.

Библиотека

Java

Класс

BorderLayou

t

Этот класс

реализует

общий

стиль

граничной

компоновки

для

окон

передне­

го

плана.

Он

имеет

четыре

узких

компонента

фиксированной

ширины

по

краям

и одну крупную север, юг, запад

область и восток,

в а

центре. область

Четыре стороны именуются по сторонам света: посредине называется центром. Ниже приведе­

ны

конструкторы,

определяемые

в

классе

BorderLayou

t.

BorderLayout ()

BorderLayout(int

горизонтально,

int

вертикально)

В

первой

форме

конструктора

выполняется

граничная

компоновка

по

умолча­

нию.

А

во

второй

форме

в

качестве

параметров

горизонтально

и

вертикально

устанавливается

горизонтальный

и

вертикальный

промежутки

между

компо­

нентами. В классе BorderLayout определяются

ластей граничной компоновки:

следующие

константы

для

указания

об­

BorderLayout.CENTER

BorderLayout.SOUTH

 

BorderLayout.EAST

BorderLayout.WEST

 

BorderLayout.NORTH

 

 

 

Эти константы обычно

используются при вводе компонентов

в

с помощью следующей формы метода add ()

из класса Container:

 

void add(Component ссылка_на_компонент,

Object область)

 

компоновку

Здесь

параметр

ссылка_на_компонент

обозначает

ссылку

на

вводимый

ком­

понент, а область -

место для ввода компонента в компоновку.

Ниже приведен пример граничной компоновки, где в каждой области

ется отдельный компонент.

размеща­

11

Продемонстрировать

применение

граничной

компоновки

import java.awt.*;

 

 

import

java.awt.event.*;

 

 

puЬlic

class BorderLayoutDemo

extends

puЫic BorderLayoutDemo()

{

 

Frame

{

11 11

в данном случае используется по

диспетчер умолчанию

граничной

компоновки

add(new

Button("This is

across the

top."),

 

BorderLayout.NORTH);

 

might go

here."),

add(new

Label("The footer message

BorderLayout.SOUTH);

BorderLayout.EAST);

add(new

Button("Right"),

add(new

Button("Left"),

BorderLayout.WEST);

 

String

msg

=

"The reasonaЬle

man adapts

"

 

+

"himself to the

world;\n"

 

 

+

"the unreasonaЫe

one

persists

in "

+

"trying to adapt

the

world

to

himself.\n"

1020

Часть

11.

Библиотека

Java

GridBagConstraints.CENTER

GridBagConstraints.EAST

GridBagConstraints.NORTH

GridBagConstraints.NORTHEAST

GridBagConstraints.NORTНWEST

GridBagConstraints.SOUTH

GridBagConstraints.SOUTHEAST

GridBagConstraints.SOUTНWEST

GridBagConstraints.WEST

Второй

тип

значений,

которые

можно

присвоить

полю

anchor,

является

относи­

тельным,

т.е.

они

указываются

относительно

ориентации

контейнера,

которая в

вос­

точных

языках

может

быть

другой.

Относительные

значения

констант

перечислены

ниже.

Их

имена

описывают

расположение

компонентов

относительно

ячейки.

GridBagConstraints.FIRST_LINE_END

GridBagConstraints.FIRST_LINE_START

GridBagConstraints.LAST_LINE_END

GridBagConstraints.LAST_LINE_START

GridBagConstraints.LINE_END

GridBagConstraints.LINE_START

GridBagConstraints.PAGE

END

GridBagConstraints.PAGE

START

ет

Третий тип значений, которые могут быть присвоены

полю anchor, позволя­

размещать компоненты вертикально по отношению к

базовой линии строки.

Значения

констант

этого

типа

перечислены

ниже.

При

горизонтальном

располо­

жении

центровка

может

выполняться

относительно

переднего

(LEADING)

или

за­

днего

(TRAILING)

края.

GridBagConstraints.BASELINE

GridBagConstraints.BASELINE_

TRAILING

GridBagConstraints.ABOVE_

BASELINE_LEADING

GridBagConstraints.BELOW_

BASELINE

GridBagConstraints.BELOW_

BASELINE_TRAILING

GridBagConstraints.BASELINE_LEADING

GridBagConstraints.ABOVE_BASELINE

GridBagConstraints.ABOVE_BASELINE_

TRAILING

GridBagconstraints.BELOW_BASELINE_

LEADING

Поля

weightx

и

weighty

очень

важны,

хотя

они

и

кажутся

на

первый

взгляд

непонятными.

Их

значения

определяют,

сколько

дополнительного

пространства

будет

выделено в

контейнере

для

каждой

строки

и

каждого

столбца.

По

умолча­

нию

оба

поля

имеют

нулевые

значения.

Если

все

значения

в

столбце

и

строке

ока­

зываются

нулевыми,

то

дополнительный

промежуток

распределяется

равномерно

между

краями

окна.

Увеличивая вес,

можно

увеличить

распределение

свободного

пространства

для

строки

или

столбца

пропорционально

остальным

строкам

или

столбцам.

Самый

лучший

способ

уяснить назначения

этих

полей

-

поэксперимен­

тировать с ними на конкретном примере.

В поле gridwidth можно задать ширину

ячейки

в

единицах

ячейки.

По

умолча­

нию

эта

переменная

принимает

значение

1.

Чтобы

компонент

использовал

свобод­

ное

пространство

в

строке,

следует

установить

значение

GridBagConstraints.

REМAINDER,

а

для

того

чтобы

компонент

мог

использовать

предпоследнюю

ячейку

в

строке

-

значение

GridBagConstraints.

RELATIVE.

Аналогично

действует

ограничение,

налагаемое

в

поле

gr

i

dhe

i

g h

t,

но

только

в

вертикальном

направлении.

1022

Часть

11.

Библиотека

Java

gbag.setConstraints(solaris,

gbc);

gbc.gridwidth = GridBagConstraints.REМAINDER;

gbag.setConstraints(mac, gbc);

11

ввести

компоненты

add(windows); add(android); add ( solaris) ; add (mac);

11 зарегистрировать приемники

событий

в

windows.additemListener(this);

 

 

android.additemListener(this);

 

 

solaris.additemListener(this);

 

 

mac.additemListener(this);

 

 

addWindowListener(new WindowAdapter()

 

puЬlic void windowClosing(WindowEvent

System.exit(O);

 

 

}

 

 

} ) ;

 

 

элементах

we)

{

11 11

воспроизвести повторно,

состояние флажка

когда

изменится

puЬlic void repaint();

itemStateChanged(ItemEvent

ie)

11

отобразить

текущее

состояние

флажков

puЬlic

 

void

paint(Graphics g)

{

msg

=

"Current

state:

";

 

g.drawString(msg,

20,

100);

 

msg

=

"

Windows:

" +

windows.getState();

g.drawString(msg,

30,

120);

 

msg

=

"

Android:

" +

android.getState();

g.drawString(msg,

30,

140);

 

msg

=

"

Solaris:

" +

solaris.getState();

g.drawstring(msg,

30,

160);

 

msg

=

"

Мае:

" +

mac.getState();

g.drawString(msg,

30,

180);

 

puЬlic static GridBagDemo

void main(String[J

args)

{

appwin = new GridBagDemo();

appwin.setSize(new Dimension(250, appwin. setTitle ( "GridBagDemo"); appwin.setVisiЬle(true);

200));

Пример сеточно-контейнерной компоновки элементов управления прикладной программы GridBagDemo приведен на рис. 26.15.

ГПИ

в

окне

Соседние файлы в папке Лабораторные работы (Объектно-ориентированное программирование (ООП))