Визуальное конструирование и повторное использование

В

данной главе вы научитесь создавать списки выбора с помощью компонента JList, использовать компонент JSlider и создавать свои собственные много­кратно используемые компоненты интерфейса. В разделе, посвященном классу JList, будет показано, как в списки выбора вставлять изображения. Вы также узна­ете некоторые новые приемы работы с элементами JTextArea

Кроме того, вы освоите несколько приемов обработки событий. Например, вы узнаете, как назначить один и тот же обработчик события нескольким элементам управления. Кроме того, будет объяснено, как преобразовать потомков класса Applet В ПОТОМКОВ JApplet.

Может быть, наиболее важной темой этой главы является объяснение, как пост­роить интерфейс программы на компоненте JPanei. Затем с помощью технологии JavaBean-компонент вы можете вставить панель JPanel в главное окно приложения или аплета. Подобная архитектура позволяет многократно использовать компонен­ты, созданные вами при разработке программы.

Эта глава входит в часть III, "Основы JBuilder". Все главы этой части предназна­чены просто для того, чтобы вы как можно более уверенно работали в IDE и визу­альном конструкторе. Я считаю, что на этой стадии знакомства с предметом необ­ходим большой объем непосредственной практической работы. Главная цель дан­ной главы — дать вам навыки работы с JBuilder IDE. Для облегчения этого процесса я предлагаю прочитать главу до конца, закрыть книгу и попытаться по памяти вос­создать описанные здесь программы, возможно, пользуясь лишь снимками экранов, приведенными в тексте.

Применение в аплете компонента JSlider

Сейчас вы приступите к созданию компонента выбора цвета, примерно такого, как показано на рис. 17.1. Программа, которую вы создадите, носит название MyColorSlider, и ее можно найти в сопровождающих книгу материалах.

Вначале создайте новый аплет, как описано в главе 3. На шаге 1 мастера создания проекта назовите проект MyCoIorSIider и щелкните на кнопке Finish. В результате вы попадаете в мастер создания аплета. В мастере создания аплета согласитесь со все­ми установками по умолчанию и щелкните на кнопке Finish для генерации аплета. Создание интерфейса

Интерфейс нашей программы будет создан на поверхности компонента JPanel. После создания интерфейса вы сможете вставить его в аплет с помощью очень про-

imt ⅛βs-s⅛asι 5» as=⅛ «а*,' «one aria»applet started.рис. 17.1. программа mycolorslider позволяет смешивать красный, зеленый и синий цвета для получения изумительных цветов различных оттенковz<i .uild⅛r*7 - >.z⅛rcjava∕alhjtihi(rds∕untιtled41Λtczuntit(ed<⅛7m> ^oiorshdβrj⅛va zрис. 17.2. три ползунка jslider в конструкторе с ориентацией verticale процессе установки свойства maximumd ⅛s*Φa
ftαα si ⅛u~-
33 untltled41 .jpx ⅛⅜ «project source» i ⅛≈ <Φ untitlβd4i
applβt1 html <s> appieti java mycolorsiider java • ⅛ untitled4l html
Φ untitled4l.mycoiorsiider
⅛ _.ui
÷∙ lo this (flowlayout) й ^^^3ut1 menu
jj data access other

ft ft x jmfippiett,^3¾ ⅛'⅛⅛∙ ⅛l 7 ∙⅛∙⅛',pmoertlas events

Стой технологии JavaBean-компонент. Ко­нечным результатом будет создание много­кратно используемого компонента плавно­го выбора цвета.

Сначала выберите в меню JBuilder пункт File ∣ New Class. Создайте новый класс, производный от javax. swing. JPanel, как показано на рис. 17.2. Для завершения Одесса щелкните на кнопке OK.

Г, гр. пчте в редакторе MyColorSlider. java >. перейди е в режим конструирования.

Первое, «то необходимо сделать — про­верить в панели структуры, что компо­новка этого потомка JPanel Установлена в FIowLayout (см. рис. 17.2). В панели струк­туры нашего проекта узел с пометкой "this" соответствует потомку JPanel. Вы можете удостовериться в этом, подведя курсор к слову "this" в панели структуры: при этом появится сообщение-подсказка "this: javax. swing. JPanel".

Компонент JSIider находится в правой части страницы Swing на палитре компо­нентов. Если ее не видно, сдвиньте палитру компонентов влево. Щелкните на ком­поненте JSIider в палитре компонентов, удерживая нажатой клавишу Shift, и три раза щелкните на конструкторе, чтобы поместить на MyCoIorSIider три компонента JSIider. Не забудьте затем щелкнуть на белой стрелке (стрелка выбора), чтобы курсор вновь функционировал нормально.

Щелкните на всех трех ползунках, удерживая клавишу Ctrl, чтобы выбрать их все. C помощью инспектора измените их ориентацию (свойство orientation) на VERTICAL и свойство maximum на 255. На рис. 17.2 показано, что должно получиться в резуль­тате.

File Edit Search View Project Run Team Wizards Tools Window Help

»i⅛ Appletl »4 MX OlorSIider j

T⅛ Swing {Swing CoriMnera) Bnnwere IPeteExprese! dbSwlngi MoredbSwtng i CbSwIngModeIe I Memeffir

Iδ5∏[j]P∣ 5= lCB-j=i eφ=∙r<tc∣gr ►

тэ ∖Font — Dialog",0,1

Foreground □ 217.217,

InpiJtVerIIIer i………………………………….

Imerted! False_______

HrtaeITsrfoee., ’

Na∣orTιckSp maximum Jg ImaxlrnurnStze j24,32767

{minimum jo________

IminimumSIze *24.36 IminpiTIcicSp..Jo [model

InegdFocusab.______

Ippaque JTrue Iorlenlatlon ^VERTICAL paintLabels, False

Теперь измените компоновку MyCoIorSIider на null, как показано на рис. 17.3. Иногда при этом компоненты JSIider пропадают. Если такое случится, закройте проект MyColorSlider И затем откройте его снова с помощью пункта меню File | Reopen.

Вновь выберите все три ползунка и перетащите их в левую часть конструктора. Они должны быть четко выровнены, поскольку находятся в компоновке FlowLayout. Измените в инспекторе имена ползунков на SliderRed, SliderGreen и SliderBIue (слева направо).

Возможно, вы захотите увеличить горизонтальное пространство между ползун­ками, чтобы над ними поместились надписи. Поскольку вы находитесь в компонов­ке Null, то можете передвигать их с помощью мыши. Или, если вам так больше нра­вится, прижмите клавишу Ctrl и попиксельно двигайте их с помощью клавиш со- "стрелками. Последний метод может оказаться очень удобным, если вам нужно передвинуть компонент вправо или влево, не сдвинув его нечаянно вверх или вниз (а также для точного позиционирования компонента — Прим, перев.)

примечаниеКак вы уже делали раньше, с помошью клавиши Ctrl выберите несколько компо­нентов и щелкните на одном из них, чтобы появилось всплывающее меню выравни­вания. В данном случае сгодится либо Align Bottom (Выровнять по низу), либо Align Top (Выровнять по верху). Можно еше выбрать опцию Even Space Horizontal (Равные промежутки по горизонтали).

"*β*ιui-““““ Во всплывающем контекстном меню компоновки Null имеется не­сколько полезных средств для выравнивания компонентов. Если вы выберете несколько компонентов, вы можете выровнять их вправо, вверх, влево или вниз. Вы можете привес­ти их все к одному размеру или сделать между ними одинаковые промежутки. Запом­ните также способ попиксельного сдвига компонента с помощью клавиши Ctrl и клавиш со стрелками. Эти приемы, если вы не забудете об их существовании, могут сэкономить Немало времени и усилий.

рис. 17.3.
установка пустой компоновки для вновь созданного потомка jpanel
.ек

Поместите на правую сторону конструктора элемент JTextArea. Установите его за­головок равным пустой строке. Для этого щелкните в инспекторе на свойстве text. C помощью клавиши Backspace очистите поле рядом со словом "text" и затем нажмите клавишу Enter. Теперь поле text пусто.

Настройте размер и положение JTextArea Так, чтобы этот компонент занимал достаточно большую часть правой стороны конструктора. Результат должен быть похож на то, что изображено на рис. 17.4.

Раз уж вы как-то причастны к этому процессу, то, возможно, захотите увидеть свой аплет в действии. Для этого сохраните все файлы и затем скомпонуйте проект, щелкнув на пиктограмме Маке. Затем щелкните на строке Appletl. html в панели про­екта и выберите страницу View.

Поместите в конструктор три компонента JTextFieId (текстовое поле) и три JLabeI (метка), по одному JTextFieId и JLabeI под каждым ползунком. Наверно, удоб­нее позиционировать компоненты JTextField и JLabel так, чтобы их средние марке­ры растяжки оказались на уровне низа ползунков (см. рис. 17.5) Здесь опять нужно применить освоенное вами умение настраивать выравнивание и промежутки.

Измените заголовки трех меток, слева направо, на Красный, Зеленый и Синий. Уберите текст в текстовых полях и с помощью инспектора измените их имена на textF∣eldRed, textFieldGreen и textFιeldBI∪e. Возможно, вам покажется излишним ме­нять имена, однако осмысленные имена могут существенно облегчить вашу жизнь при написании кода.

На данном этапе осталось только одно: переключиться с компоновки Null на GridBagLayout. Еще раз выберите узел this в панели структуры. В инспекторе сме­ните компоновку с Null на GridBagLayout. Если не случится ничего непредвиденно­го, эта смена пройдет без проблем, и ваша программа будет выглядеть так, как и было задумано. На рис. 17.5 показано текущее состояние программы.

У меня переход с Null На GridBagLayout Прошел абсолютно гладко. Мне не пришлось подстраивать пользовательский интерфейс программы. Если у вас на

i ег ■' < •• .'ъгс jav>.∙-∣l∣∙mp'∣∙ ч/unhtl : ι∕src∕uhthled4l/mytolorshder javaрис. 17.4.
ползунки и компонент jtextarea помещены в конструктор
file edit search view project run team wizards iools window help
d fit'f¾b 0 <p> - fc> a- i '⅛4 ^pιe- -=∙-∙∙^ 4 - i- 4 #
⅛⅛i>< ≠ 3p~∙
⅛un!itled41jpx !s∙ «project source*
i $ Φ untitled41 j⅛ appletl html ; & appletl java
t mycoiorsiiderjava untltled41 html
3¾⅛ι a∙'d>∙s∙⅜∙rjξjfc амезr<sΓi⅛ untttled41 .mycoloisiicjt ⅛ j ul : й ethis
0* «null»
c⅛ ⅛' jslider1
ti⅝ «null»
i & <cfc jsiider2 #5 «null»
φ ∙⅛⅜ jslider3 fs: «null»
: 6 rextλreeι j menu
 ■ « 
 j - j - j 
 ■ 
 v 
sourer des⅛n j peanl uml dor i hlstoryi 

*sa applet! .j∙⅛st mycθlorβlldar ∣
k svdno jswmpcertekk*»i bverwmrei detafepee-,r i dbsvvhς mr-e ubsvdno ' dbsvdpumotfc v hsmel8∙w,√lii
i3*' *→-rstjΓfli-ml∩irnumsbe ⅛ 17 nextfocueab...-preferredstze iθ, 17 requestfocu =truer0w8 'o i
seiectedteiii .. ■ black j
?.?!?^9hcolor® ι¾!s6jl j
seieciionend o i
sele,tionslaιt opoitiptert
stapstyleyyojfalse proeedle- ɛv 'ht.
:a

File Edit Search View Project Run Team Wizards ɪools Window Help

DfiSS*¾⅛e>⅛⅛ p* ⅛* ⅛ 85 X J<⅜ i⅛p5i

~Ξl⅜⅞*ik a∙3a

¾tf ⅜b>,3p-
*yp diycoiorsiiderjpx ‘ ф ж «project source»
., ⅛ Φ mycolorslider i jftappietihtmi i <ft appietl java j <s eltcoiorsiiderjava
’ x;<$fc appletl
⅛ swing j swinogcxitainers j jbvenwire j cmiaexprem 1 <fc>swsπgι i
∖> <⅛j ⅛- 4j s*- wm.⅛⅛∙∣sη fr ®
,i7mαre(∙jswii0 f ohswinglitodeh iʃ oterħβtθe⅛ljl-*j
⅛q3¾ *^s∙*s qk fj' }
,jtexiareai ⅛o,ilioji ;
рис. 17.5.
построение
интерфейса
компонента
mycolorslider
завершено
alignment ⅛s j
aiignmen!y ]0.5 _ .j .
background !□white
border [custom j
caretcoior ■ black ⅛-
caretpqsition ip ⅝
columns ⅛ ⅛
oebuggraphic i<default∙ - - jjʌ
oisabledtext... ■ 7<л<л?зт
document 
ooubiebutjfered: false &=
editable ∣true jjj-
enabled true u"'
focusacceiera „ w
this (grιdbaglr^; # oridsaglas φ iextfieidon ⅛ iextfieldgii
. ⅛ iexlfieidre s= *⅛ sliderred
й «null»
e slidergreeu, s? «null*
e *⅛* slidersiue й «null»
£
--μ.
baved 1 modified ftps
,tj !,-ι¼,jbjhgtfi p⅜rtgn j⅛e⅜nj omlj oocj ⅛⅝⅝ory¾

■# — i <»

Этом шаге возникли какие-либо проблемы, то, возможно, вам поможет изучение кода, доступного в сопровождающих материалах.

Добавление обработчиков событий

Следующее, что необходимо сделать — назначить некоторые обработчики собы­тий, чтобы программа могла выполнять свои функции.

Выберите ползунок SliderRed, щелкнув на нем, и перейдите на страницу Events инспектора. На ней вы увидите доступные события, упорядоченные в алфавитном порядке. Вам нужно задействовать событие MouseReieased. Для этого щелкните в поле редактора свойств справа от слова mouseReieased и после того как в поле по­явится текст, нажмите клавишу Enter. Результат этой операции показан на рис. 17.6.

*g⅛ ⅞an ,дии» ¾⅝⅜,,be⅛ jr<^n w⅛>ft⅛ ɪoois sjnatw t*w ⅛4,√j⅝.. ,--г
oj⅛sΛ⅛m ям * ’а лг ɪi ✓ -j-∙ <e>
jj3!>рис. 17.6. событие mousereieased в инспекторемег usf чэ i⅛ зп rnycotot- * ф Λpp∣βtt jj mycolorslider.jpx <л mycolorslider jft appletl-html⅛ mycolorslider applell
∣j- ~jt∣∣
null»
£ 0 creensiider .0 «null»
h= ⅜* wueslider
~: settingszailainistcatoc/jbpt ojcc t∕teap∕nycolor slider/c xna sea∕app ietl. heal's3 this (borderlayouo а$ borderlayoutl
⅛≈∙∙β jpanell is *∏u∣∣> ci ∣textf∙e∣d2 я ∣textfield3 redfle∣d ∙s⅛[
ðf z f>ιuwot intense.Ξ!' ctem ⅜pp⅛nf"
f⅜⅞Γ⅞⅞⅜^¾y

JBuilder перейдет в режим редактирования исходного кода и создаст заготовку обработчика события. В тело обработчика поместите следующий код:

Void SliderRed_MouseReleased(MouseEvent Е)

{

Int redint = redSlider. getValue(); Int bluelnt = blueSlider. getValue () ; Int greenlnt = greenSlider. getValue(); CedField. SetText(Integer. toString(redint));

GreenField. setText(Integer. toString(greenlnt)); BlueField. setText(Integer. toString(blueInt));

JTextAreal. SetBackground(new Color(redint, greenlnt, bluelnt));

}

Этот код выбирает текущие значения ползунков RedSlider, blueSlider И GreenSlider:

Int redint = redSlider. getValue(); Int bluelnt = blueSlider. getValue(); Int greenlnt = greenSlider. getValue();

Результирующие значения будут целыми числами от О до 255, поскольку вы за­дали для ползунков именно такой диапазон. Мы используем эти числа для измене­ния цвета JTextArea.

JTextAreal. SetBackground(new Color(redint, greenlnt, bluelnt));

Данный вызов смешивает значения, соответствующие интенсивностям красной, зеленой и синей составляющих, в один цвет — примерно так же, как художник сме­шивает краски на палитре.

Мы также выводим числа, применяемые для создания цветов, в текстовых полях JTextFild:

RedField. setText(Integer. toString(redint)); GreenField. setText(Integer. toString(greenlnt)); BlueField. setText(Integer. toString(bluelnt));

Назначение нескольким элементам управления одного и того же обработчика события

Нам требуется, чтобы все три ползунка обращались к одному и тому же обработ­чику события. Для этого всем ползункам необходимо назначить обработчик SliderRed-mouseReleased. Вернитесь в режим конструирования. Щелкните на SliderGreen, перейдите на страницу Events инспектора и щелкните на текстовом поле рядом со строкой mouseReleased. Измените текст в поле на SliderRed rnouseReIeased. Нажмите клавишу Enter. JBuiIder вернется в режим ре­дактирования исходного кода, а курсор будет находиться в заготовке обработчика события, который вы приготовили для события SliderRed_mouseReleased. Верни­тесь в режим конструирования, щелкните на SliderBIue и повторите описанные выше действия еще раз. В результате вы назначите всем трем ползункам один и тот же обработчик одного и того же события. При сдвиге любого ползунка будет вызы­ваться этот единственный метод. Он отобразит результирующий цвет на JTextArea С учетом состояния всех трех ползунков

Добавление MyCoIorSIider в главное окно аплета

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

C помощью панели проекта выделите в редакторе Appletljava. Перейдите в ре­жим конструирования. Убедитесь, что компоновка панели ContentPane аплета уста­новлена равной BorderLayout.

Выберите компонент Bean Chooser у левого края палитры компонентов. Он на­ходится как раз под белой стрелкой выбора (см. рис. 17.7).

Выберите во всплывающем меню для Bean Chooser элемент Select. C помощью диалогового окна Bean Chooser найдите и выберите класс MyCoIorSIider, как показа­но на рис. 17.8.

После выбора MyCoIorSIider курсор примет форму крестика, как и при выборе компонента с палитры компонентов. Теперь поместите новый элемент управления на свой аплет, в точности так же, как если бы вы добавляли на него новую JPaneI. Установите свойство constraints этого элемента в Center, как показано на рис. 17.9.

Вы только что создали JavaBean-компонент и поместили его на свое приложе­ние. Но пока вам не нужно рассматривать этот процесс как часть технологии JavaBean-компонент. Просто считайте его легким способом создания многократно используемых компонентов. А технология JavaBean-компонент будет подробно рас­смотрена в части VII, "JavaBean-компоненты".

Вы, конечно, понимаете, что можете скопировать файл MyColorsiider В другой проект и там его повторно использовать. Единственное отличие состоит в том, что в этом случае вам потребуется поместить в начало файла оператор Package. Во время изучения части VII, "JavaBean-компоненты", вы узнаете, что если вы все сделаете

рис. 17.7. c
помощью bean chooser можно добавить вновь созданные компоненты в интерфейс разрабатываемого аплета

рис. 17.8. выбор в диалоговом окне bean chooser вновь созданного потомка класса jpanel

io -1 . ∣t i - г √.otw4tder∕sfc∕rnycoloi∙shder∕aρpleιl java

Правильно, то абсолютно ничего не придется менять. А пока достаточно понять, насколь­ко легко и просто можно манипулировать до­вольно сложным комплектом компонентов, составляющих MyColorSlider. java, как од­ним многократно используемым целым.

Тестирование аплета

Не забудьте сохранить результаты проде­ланной работы с помощью пункта меню File |

Save АН. Теперь запустите аплет. Проверить корректность проделанных шагов можно, по очереди сдвигая каждый ползунок до макси­мума (вверх), а два других — до минимума (вниз). Если все нормально, сдвиг красного ползунка вверх до упора даст красный цвет, зеленого ползунка — зеленый цвет, а синего — синий. JTextArea В соответствии с произ­веденными установками будет менять свой цвет на любую комбинацию красного, зеленого и синего цветов. Текстовые поля под ползунками будут отображать создаваемые вами RGB-установки. На рис. 17.10 мож­но посмотреть, как выглядит аплет во время выполнения.

Создание аплета из нескольких компонентов

Теперь, когда вы знаете, как добавить в свой аплет один вновь созданный Ьеап — компонент, вы сможете разобраться в том, как создать более сложную программу из нескольких bean-компонентов подобного рода. Если конкретно, мы сейчас добавим

File Edit Search View Project Run Team Wbards Tools Window Help

φ mycolorsllder.jpκ
f ® «project source» »; ® mycolorslider ⅛ applet! html appletl java -⅛ mycdlorsllder java
,ft & Λ sj spmycolor... ’ i «,<4 appwt i x;$ mycolorsiideri
k swme i swmg cxtamers 1 bvenware i oalaexprass
i ‘‘ rs≈ri .... _ ɪ r=z_ r-—: fs^l '
,1? inycolorsiiderappieti
•,.jui
s- ft tt>∣s
,3 fj (contentpane) (borderl u* borderlayou11 Γf∙□imki =5 smycoiorsiideri
- ⅛j «gridbaglayout „i menu
_j dataaccess j other
♦ gridθaglayoutf
,ɪ .. Π^⅛⅞ pee⅛nlbean ∙χml dpcthstoiyi,enabled ,true i
font itpiatogr1ojlii
ibreground hbiacf
inpuivertiier ; ɪ
layout «default iayov rnaximumsi... ;2147483647,j phinimurnsize i40p1291 nextfocusa.. l⅛j
,properties bents,,' dbswing! more <*swmj 1 obswlngmodeis i stama a-*i
ti {“ ■ 1½±□ ''pð ∣≈fl *φ~ ∙~≈ ж )
,arttonmao
a⅝g∩mentx io s j
sllgnmenty jθ.5 j
background,.t□2171217j
border ɪ j
debugθrap... !«default» i
dnublebu"» true
рис. 17.9.
потомок класса jpanel, mycolorslider, размещен на экземпляре japplet.
его свойство constraints установлено равным center

D ⅛S й ’¾ H ⅝ ® x Sm

В нижнюю часть программы MyCoiorSlider еще одну панель, содержащую кнопку выхода из программы. Эта добавка совершенно гладко впишется в ваш аплет, как показано на рис. 17.11.

Сначала в JBuilder выберите пункт меню File ∣ New Class. Создайте нового по­томка класса JPanel И назовите его CoIorPaneI, как показано на рис. 17.12.

Как показано на рис. 17.13, вам нужно поместить на этот простой компонент одну кнопку с именем JButtonCIose и установить ее заголовок (свойство text) равным Выход.

Назначение компонента ClosePanei Очевидно: он должен закрывать главный аплет, на котором находится. Для этого необходимо, чтобы компонент ClosePanei Вызывал метод из Appletl. java. Проблема здесь в том, что в данном случае

applet viewer: rnycσlorslider. applet1... *. ×∣appletappletstaitedрис. 17.10. аплет mycolorsiider во время выполнения (показан фиолетовый цвет)t⅝рис. 17.11. в нижнюю часть программы добавляется еще один потомок jpanel, и, таким образом, весь аплет становится сочетанием двух специализированных компонентоврис. 17.12. создание потомка класса javax.swing. jpanel с именем closepanel⅛^ . i createanewjawadam
i—ʃ fin in the fields below to set the package, name, base class, and other options for the java class whichwih be created
 
package: imycolorslider
j '~3-j;
classname iciosepanei 
baseciass: ilavaxswingjpanei 1
options 
t i* pjjblic p oeneratedefaultconstructor
j Γ^ oeneraternalnmethod p oyerrideabstractmethods
p oenerate header comments 

class wizat'∕i Λ? ⅛e ^, ■<-helpcancel

ClosePanei и Appietl. java будут связаны весьма специфическим способом. В ре­зультате CiosePanel Перестанет быть многократно используемым компонентом, ко­торый можно вставлять в другую программу.

Для обхода упомянутой проблемы можно сделать так, чтобы ClosePanel При щелчке пользователя на кнопке "Выход" возбуждала событие. А аплет будет ожидать это событие и прекращать работу при его получении.

В главе 15 вы уже узнали, как заставить компонент отправлять сообщение друго­му компоненту. Если вы имеете дело с JBuilder редакции SE или Enterprise, можете сделать это с помощью технологии BeansExpress. В противном случае вам придется ввести вручную нужный код.

Если вам доступна технология BeansExpress, выберите закладку Bean среди зак­ладок просмотра файла. Перейдите на страницу Events и назначьте компоненту CIosePaneI возможность генерировать событие ActionEvent, как показано на рис 17.14. Заполните обработчик события ActionEvent Кнопки "Выход" кодом, предназ­наченным для возбуждения события в результате щелчка на кнопке:

‘C Builder F ~ 6ι⅛rΛava∕jSbook7fundamentaf57rnyColorSHαer7src∕mycolorillder∕Cto5ePanel. Jav

file edit search view project run team wizards ɪools window help,q £ s - ¾b 0 * tβ * - ∙* 0
ft ⅛3 ® jfe- s3 mycotor., ii⅛l mycolorslιder)pκ se- Φ «project source»
⅛ ⅛ mycolorslider
ift applett .html . Φ appletl java
,h> oiycolorsliderciosepanel
ifes -jui i' & sthls
⅞∣ «flowlayout»
-.jmenu
,3¾⅛1 ⅛hffl v -v∙**,x⅛apptβtl * -&ctosepenelj x⅛⅛mycoiorsuoer∣ swing j swtngcotmners i bvehwtra 1 oamexpress)
c''l'¾s1 jh.ir-liihwcj.
, j esin -bi,ooc,l⅛8
рис. 17.13.
конструирование
простого
компонента
closepanel,
который
впоследствии
будет
добавлен в
интерфейс
аплета

5* IBuiIder ∙’ — G;ZSrc Jc>va7jbfcσσk∕fun -arrienUts^ColorSlider/src/rnycolordider/ClosePan.

file edit search view protect run team wizards ɪools window help,qtf≤'sho∙
'i∙. ♦» *i⅛
ft £? <jfe s∣ myco∣... 33 mycclors i ider.)px i ss ⅜l «project source» i ⅛ i⅛ mycolorslider
s appletlhtiril ⅛ applettjava ⅛ ciosepanei java -d⅛ mycoiorsiider java
,create custom event..,~3⅜ ⅞⅜ ¾i¾⅛-∙jj⅛] > '»**•’,x ⅜ mycolorsiltjer i,import event bet.,si ⅛⅛ι imports
⅛⅞ -■> ciosepanei *⅛ jpanei
closepanelo
-- ⅜ addactionllstener(act , * removeacfionlιstener
j* iireactionp erformed<Λ jf∙∙ jbuttoni _actionperfor
- t> jbuttoni
^lblnit° ' <--*.Γi^
,i firetheeetypesofevents: i—awi events oava^rwt.eveπt й ■ ∙∏ wtf
ij□ adjustment
^□component
i□ container
sj□ focus
μ□∣tem
,□key
∏□ mouse
,usteniorthese events: f—awt events (javaw wt∙event "τ
⅛∣□ action
□ adjustment
□ component
□ container >hi∣□ focus
j. □∣tem ■i □key i ι∣□ mouse
,oer erat i properties! beanirrfq j^π⅛(pnφatty editors],sotwce] d⅛⅛nb bean i umt i рос i htetory],.j
рис. 17.14.
использование
beansexpress
для
назначения
closepanel
возможности
генерировать
события
actionevent

Void jButtonClose_actionPerf ormed.(ActionEvent e)

{

β ActionEvent CloseEvent = new ActionEvent (this, 1, "Close”); fIreActionPerformed(CloseEvent);

}

Весь исходный текст ClosePanel Можно найти в листинге 17.1. Его можно ис­пользовать при работе в JBuilder редакции Personal.

Листинг 17.1. Исходный код простого Ьеап-компонента CIosePaneI

Public synchronized void SddActionListener(ActionListener 1)

{

Vector v = actionListeners ==

Null? new Vector(2) : (Vector) actionListeners. clone();

If (,v. contains(1))

{

V. SddElement(1);

SCtionListeners = v;

1

}

Protected void fIreActionPerformed(ActionEvent e)

{

If (actionListeners! = null)

{

Vector listeners = actionListeners; int count = listeners. size(); for (int i = O; i < count; i++)

{

((ActionListener) listeners. eIeraentAt(i)).SctionPerformed(e);

)

1

)

}

Class ClosePanel_jButtonClose_actionAdapter implements

J ava. awt. event. Ac tionLis tener

{

ClosePanel adaptee;

ClosePanel_jButtonClose_actionAdapter(ClosePanel adaptee) f

This. adaptee — adaptee;

)

Public void actionPerformed(ActionEvent e)

{

Adaptee. jButtonClose_actionPerformed(e);

}

1

350

Вам необходимо также добавить в метод jbinit код, который явно запрашивает отправку событий ОТ ClosePanel:

// Инициализация компонентов private void jbɪnit() throws Exception {

.. . Здесь пропущен фрагмент кода ClosePanell. BddActionListener(this);

}

Рис. 17.15. Только что созданный компонент ClosePanet Добавлен в аплет MyColorSlider

О JBuiIder 7 * 6√Srс JavazjbbookzfundarnentalsMiyCoIorSb -ef⅛rc∕rnycσl^Hl⅛er∕ΛpJU H j *

Hle Edit Search View Project Run Team Wizards ɪools Window Help

⅞* fai ~5 * jfcl > ∙ ¾* ’ ∙O U3’¾B ð <j ⅛’⅛i

Tag ♦■•«>!#

lil
saved 2 modified files

jsj⅛f applett i x⅛ ciosepanell mycoiorsiidef j,createcustom event-,import event sel..,jqener st ( properties j beanmo events [property editors,
,r rɪ".,и."- .∣ "v;,, - r∙. 
,sourcej design" bean)umlj doc j history]

∣3O 3PmyCol.. {2Γ∣ myColorSllder. jpx j æ 9 «Project Source*

‘♦ 3 mycolors∣lder

Ift ApoIetIhtmI

<⅛ Appletl java sfe CIosePaneIjaya s& MycoIorSIIder java

8B∙⅛ Imports

Э ⅛ Appletl ~ % JAppIet

Sl ActionLlstener AppletlO

* actlonPerformed(Actlo

* OetAppletInfoO

* getParameter(Strlno k

* OetParametertnfoO

* InltO

Γire thβsetvpesofevenτs. —— —

— — AtAfT Events (JawLawtevent.*)-

□ Action

□Adjustment

□ Component

□ Container

□ Focus

□ item

□ Key

□ Mouse

TJetentortheseeventS"

` h—AWT Events (laua. awt. event. *)-

BxttOItl ‘

⅛ IjDAdjustment ‘ ,□ Component : h□ Container • ‘∙l□ Focus

J□∣tem : □κey

рис. 17.16. использование beansexpress для назначения аплету возможности
ожидать события actionevent

r^. Mouse

Чтобы аплет действительно прекращал работу при получении этого события, из­мените код события ActionPβrformed Следующим образом:

Public void actionPerformed(ActionEvent Е)

{

System. exit (O);

}

примечаниеТеперь вы можете запустить приложение, чтобы проверить его работу и посмот­реть, как работает новое средство. Если у вас возникнут какие-либо проблемы, обра­титесь к сопровождающим книгу материалам за полной версией программы MyColorSlider.

После сборки программы нужно не забывать явно проводить измене­ния в MyColorSlider. java И ClosePanel. java. Не редактируйте визуально эти ком­поненты, когда они уже размещены внутри Appletl. java. Вместо этого выделите ClosePanel. java Или MyColorSlider. java И внесите изменения в код самих компо­нентов. Например, если вы захотите добавить на ClosePanel Кнопку "Выход", Вам нужно выделить CIosePaneLjava В панели проекта, перейти в режим конструирования и провес­ти нужные изменения. При запуске аплета или переходе в режим конструирования Appletl. java Вы автоматически увидите изменения, проделанные в ClosePanel. Если вы не увидите в Appletl. java Изменения, внесенные в ClosePanel. java, Попробуйте закрыть и вновь открыть проект. Иногда возникают проблемы с буферами, особенно в Lmux, Которые мешают конструктору JBuiIder Быстро отображать изменения.

Технология, показанная в данной части главы, очень важна. Возможность лег­кого создания небольших многократно используемых компонентов, вроде MyColorSlider Или ClosePanel, Является одним из огромных достоинств языка Java. Вы узнаете про эту технологию гораздо больше в части VII, "JavaBean-компо- ненты".

Антракт: Applet, JAppIet и Swing

C помощью JBuilder можно создавать аплеты на основе старого класса Applet версии I. х или на основе класса JApplet, базирующегося на Swing. Если вы в своем проекте пользуетесь классом Applet и элементами управления AWT, то этот проект может выполняться на некоторых очень старых JRE. Иногда такая обратная совмес­тимость нужна. Однако она не дает вам возможность использовать новые возможно­сти, присутствующие в Swing

В тот момент, когда вы помещаете на потомка класса Applet компонент со стра­ницы Swing, вы полностью переходите на использование JAppiet и классов Swing. Если в вашем аплете имеется хоть одно поле JTextField, Вы не сможете вернуться к старому JRE 1.x. Вы перешли границу и вступили в страну Swing. Если это и требо­валось, можете перенести в Swing вообще всю программу.

Мне часто приходится переводить старые аплеты в JApplet. А иногда, в спешке, я нечаянно создаю Applet, в то время как нужно было JAppiet. И если мой новый аплет уже достаточно разработан, то мне не хотелось бы начинать все сначала.

Вот способ конвертирования потомка Applet в потомка JAppiet. Сначала им­портируйте пакет Swing и измените имя класса-предка на JApplet:

352

Import j avax. swing.*;

Public class Appletl extends JApplet

Теперь найдите в методе jbinit ссылки на переменную this:

This. SetLayout(borderLayoutl);

This. add(j Panell, BorderLayout. CENTER);

Вам может понадобиться получить дескриптор панели содержимого JApplet и затем заменить вышеупомянутые ссылки и другие аналогичные ссылки, чтобы они выглядели следующим образом:

JPanel ContentPane = (JPanel) this. getContentPane();

ContentPane. SetLayout(borderLayoutl);

ContentPane. add(jPanell, BorderLayout. CENTER);

списки выбора

рис. 17.17. простое приложение со списком выбора. в левой части списка находятся изображения,
прокручиваемые вместе со списком
B большинстве случаев этого хватит. Теперь ваш класс Applet может выполнять­ся как JApplet.

Компонент списка выбора (list box) яв­ляется одним из наиболее часто используе­мых средств Swing. В данном разделе вы уз­наете, как создать простое приложение со списком выбора, содержащим изображе­ния. Пример приложения под названием ListBox показан на рис. 17.17.

Пример программы, использующей список выбора

Сначала создайте элементарное прило­жение JBuilder, как объяснялось в главе 3.

Выделите в редакторе Framel и перейдите в режим конструирования. Проверьте, что компоновка панели ContentPane установлена в BorderLayout. Поместите на ContentPane компонент JScroIIPane со страницы Swing Containers. Установите его свойство constraints в Center. Перейдите на страницу Swing и поместите на JScroIIPane компонент JList.

Пока интерфейс приложения завершен. Он должен быть похож на изображен­ный на рис. 17.17, только JList должен быть пуст.

Вопрос теперь в том, как заполнить содержимое компонента JList. Один из способов — изменить конструктор объекта JList в начале кода для Framei. До вне­сения ваших изменений этот конструктор выглядит как последняя строка следую­щего фрагмента кода’

Public class Framel extends JFrame

JPanel ContentPane;

BorderLayout borderLayoutl = new BorderLayoutO ;

JScrollPane jScrollPanel = new JScrollPane();

JList jListl = new JList() ;

Λ frame thleaτq ×рис. 17.18. компонент jlist, содержащий несколько простых строкДля нас важна лишь последняя строка. Другие приведены только для того, чтобы проще было сориентироваться.

Чтобы вставить в JList несколько простых элементов типа string, можно напи­сать что-то вроде

JList jListl = new JList(new String[] ("Sam", "Joe", "Paul"}) ;

Показанный выше код создает и инициализирует объект JList так, что он содержит несколько строк, как по­казано на рис. 17.18.

В некоторых классах подобного кода оказывается достаточно. Но чаше всего вам нужно добавлять и удалять строки списка не во время конструи­рования, а во время выполнения про­граммы. Для этого вам придется иметь дело C объектом DefaultLiStModel:

Public class Framel extends

JFrame

{

JPanel ContentPane;

BorderLayout borderLayoutl = new BorderLayoutO;

JScrollPane jScrollPanel = new JScrollPane();

JList jListl = new JList () ;

DefaultListModel model = new DefaultListModelO;

. . . Здесь пропущен фрагмент кода Private void jblnit() throws Exception {

. . . Здесь пропущен фрагмент кода jListl. setModel(model);

последнее в этом фрагменте кода поле данных инициализирует экземпляр класса defaultlistmodel. последняя строка метода jbinit связывает defauitlistmodei с jlist. после ввода этого кода компонент jlist будет ис-пользовать defaultlistmodel для рабо-ты с отображаемым списком элементов.
defaultlistmodel позволяют до-бавлять и вставлять элементы наподо-бие строк, которые вы хотите видеть в jlist. например, если вы напишете следующий код, список выбора будет содержать данные, показанные на рис. 17.19:
list box - πs
in'orma'.~π9
informationlo
informationli
ormatkmlz
informationl3
informatkmh
info mat ml5 informat,onl6 informationl7 informatk>nl8 
informationzo informationzl information22 ] formation23 'nfumatkmz4 j

,рис. 17.19. последовательность строк, добавленная в компонент jlist с помощью класса defaultlistmodel

}

For (int i = O; i < 25; i++)

{

Model. addElement("Information" + String. valueθf(i));

}

Для выборки элементов списка можно написать приблизительно такой код:

Void jButtonl_actionPerformed(ActionEvent Е)

{

DefaultListModel list = (DefaultListModel)jListl. getModelQ; Int SelectedIndex = jListl. getSelectedlndex(); If (SelectedIndex! = -1)

{

String s = (String)list. get(SelectedIndex);

Systern. out. println("Список: " + s) ;

}

Else

{

System. out. println("Вы должны выбрать элемент");

}

)

Этот код вначале находит объект DefaultListModel, вставленный ранее в объект JList. Затем с помощью метода JList. getSeiectedindex() выбирается индекс выбранного в данный момент элемента списка выбора. Если в списке выбора не выбран ни один элемент, getSelectedlndex () возвращает -1. В остальных случаях, пользуясь этим индексом, можно получить значение выбранного элемента списка с помощью метода get:

String s = (String)list. get(SelectedIndex);

Класс DefaultListModel Содержит и другие полезные методы, такие как Clear, contains, firstElement, getSize, indexθf, IastElement, remove, isEmpty, TemoveAllElements И RemoveRange. Имена этих методов говорят сами за себя (clear — очистить, contains — содержит, first element — первый элемент, get size — полу­чить размер, index — индекс, last element — последний элемент, remove — удалить, is empty — пуст, remove all elements — удалить все элементы и remove range — удалить диапазон), и их использование обычно интуитивно понятно, поэтому подробно рассматриваться они не будут.

Добавление в список объектов

В объектах JList можно хранить не только строки. Взгляните на следующий фрагмент кода метода jbinit:

JListl. setModel(model); Model. addElement(jScrollPanel); model. addElement(jButtonl); model. addElement(j Panell);

B этом коде в JList Добавляются не строки, а стандартные Java-классы. То, что получается в результате во время выполнения, можно видеть на рис. 17.20.

На рис. 17.20 вы видите, что для вывода информации в JList JDK автоматически вызывает ме­тоды jScroIlPanel. toString(), jButtonl. toString() И

JPanell. toString(). Не НУЖНО Обладать богатым воображением, чтобы догадаться, что можно со­здавать свои собственные специа­лизированные объекты с более привлекательным выводом мето­дов toString. Затем эти объекты можно сохранить в JList и при выборе их пользователем делать с выбранным объектом все, что заб­лагорассудится.

рис. 17.20. если вы добавите в объект jlist не строки, а другие объекты, то при отображении списка вызываются их методы tostringДобавление графики в JList

Теперь, когда вы знаете, как работать с элементами JList, наконец, можно на­учиться, как с каждой строкой списка связывать графическое изображение. Для это­го необходимо воспользоваться интерфейсом javax. swing. ListCellRenderer. В большинстве случаев нужно создать потомка класса JLabel, реализующего интер­фейс ListCeiiRenderer. Идея состоит в том, чтобы загрузить метку картинкой и текстом, и затем метка должна отображаться в нужной строке JList. Код потомка класса JLabel, который выводит информацию, представленную на рис. 17.17, мож­но найти в листинге 17.2.

Листинг 17.2. Объект ListCeIIRencIerer, связывающий битовые изображения с элементами JList

Package listbox;

Import j avax. swing. ListCellRenderer;

Import java. awt.*;

Import javax. swing.*;

Import java. util.*;

Public class FolderRenderer extends JLabel implements ListCellRenderer {

ArrayList folderlcons;

Public FolderRendererCArrayList folderlcons)

{

This. folderlcons = folderlcons;

1

Public Component getListCellRendererComponent(JList list, Object value,

Int index, boolean isSelected, boolean CellHasFocus)

{

If (value ’= null)

(

ListModel model = list. getModel();

String text = (String)model. getElementAt(index);

Systern. out. println("Текст: " + text + " ” + value. toString());

SetText(text); Setθpaqυe(true);

)

If (f oɪderɪeons I= null)

(

Setɪeon((Icon)folderlcons. get(index));

}

If (isSelected)

(

SetBackground(list. getSelectionBackground()); SetForeground(list. getSelectionForeground());

)

Else

{

SetBackground(list. getBackground()); SetForeground(Iist. getForeground());

}

Return this;

Я не хочу повторяться подобно заезженной грампластинке, но все же хотелось бы еще раз напомнить вам, что этот класс расширяет JLabei. Вам нужно запомнить это, иначе весь этот код не будет иметь никакого смысла.

Конструктор этого объекта принимает массив пиктограмм:

ArrayList folderlcons;

Public FolderRenderertArrayList folderlcons)

{

This. folderlcons = folderlcons;

}

Массив пиктограмм инициализируется и создается в Framel, Вместе с DefaultListModel:

ArrayList list = new ArrayListO ;

DefaultListModel model = new DefaultListModelO; for (int i = 1; i < 20; I++)

{

Int nun = i;

If (num > 10) num -= 10;

String value = StringBox-IntToStrPadO(num, 2);

Model. addElement("Папка: " + value);

List. add(new ImageIcon("Folder" + value + ".png"));

}

JListl. setModel(model);

JListl. SetCellRenderer(new FolderRenderer(list));

Использованный здесь метод IntToStrPadO Принимает строку, например, "2" и преобразует ее в строку, дополненную нулями: "02". Такая же подпрограмма ис­пользуется, чтобы для значения времени "две минуты третьего" вывести "2:02", а не "2:2". Вот как выглядит код этого метода:

Public static final String IntToStrPadO(int value, int paddings)

{

String rawString = String. valueθf(value);

StringBuffer paddedString = new StringBufferfrawString); while (paddedString. length() < paddings)

{

PaddedString. insert(O, , O,) ;

}

Return paddedString. toString() ;

}

Можно передать и два параметра: значение, которое нужно дополнить, и желае­мое количество цифр. Например, вызов intτoStrPadO(5, 4) даст в результате стро­ку "0005", а вызов IntToStrPadO (25, 2) — строку "25". Обратите внимание, что

Используется объект StringBuffer, а не string. Структура объектов string жест­кая, поэтому в цикле вроде того, что организован в IntToStrPadO, они создаются снова и снова. Объекты StringBuffer лучше приспособлены к подобному коду и не заставляют так тяжко трудиться сборщик мусора.

Метод IntToStrPadO важен потому, что битовые изображения, предназначенные для отображения в списке выбора, хранятся на диске в таком формате:

FolderOl. png

Folder02.png И т. д.

Чтобы генерировать эти строки на лету, необходимо создавать строки типа "FolderOl. png", а не "Folderl. png".

Следующие строки кода загружают каждое изображение с диска, запоминают его В объекте ImageIcon И затем добавляют ЭТОТ Объект В ArrayLiSt:

String value = StringBox. intToStrPadO(num, 2); list, add (new ImageIcon ("Folder" + value + ,,.png"));

Визуализаторы ячеек: создание компонентов для отображения в JList

После того как реализации ListCellRenderer передан массив пиктограмм, класс визуализатора ячеек полностью инициализирован. Когда нужно вывести изображения в списке выбора, вызывается следующий метод нашей реализации Класса ListCellRenderer:

Public Component getListCellRendererComponent(JList list, Object value,

Int index, boolean isSelected, boolean CellHasFocus)

Этот метод возвращает экземпляр компонента JLabel, создаваемого в данный момент. В ответ на вызов метода мы должны заполнить экземпляр JLabel и вернуть его в систему. В самой простой и чисто теоретической форме этот вызов может выг­лядеть так:

Public Component getListCellRendererComponent(JList list,

Object value, int index, boolean isSelected, boolean CellHasFocus)

{

SetText("My Text") ; return this;

}

Вспомните, что мы находимся внутри экземпляра потомка JLabei. Поэтому вы­зов setτext установит текст экземпляра JLabel. Затем код возвращает JLabel сис­теме, которая отображает ее в строке списка выбора.

примечаниеНо это просто теория, объясняющая работу системы. На практике все немного сложнее

Одна сложность, о которой вы не должны забывать — это то, что на са­мом деле вы не создаете последовательность меток JLabel, а используете один ком­понент JLabel, постоянно меняющийся для нужд текущей строки списка выбора. В дан­ном разделе я иногда, для простоты, буду говорить о последовательности создаваемых меток JLabel. Но имеется только одна метка, которая все время выглядит по-разному, Чтобы каждый раз отображать требуемый текст.

Объект JList, с которым мы работаем, передается системой в первом параметре вызова GetListCeliRendererComponent. Второй параметр содержит выбранный на момент вызова элемент списка. В нашем случае это строка. Но вы видели, что он может быть практически любого типа. (Что позволяет вам включить пиктограмму, которую вы хотите связать с объектом, в сам объект!) Третий параметр — это номер выбранного элемента списка Seiectedindex. Четвертый определяет, является ли те­кущий элемент выбранным. Помните, что метод вызывается для отображения всех видимых строк списка, а не только выбранной строки. Поэтому вам необходимо знать, как визуализировать текущую строку, переданную методу: как выбранную или нет. И, наконец, последний параметр позволяет узнать, является ли визуализируе­мая строка не только выбранной, но и активной. Мы не используем этот последний параметр.

Первая часть кода В нашей реализации GetListCeliRendererComponent Дает Возможность задать текст, который необходимо вывести:

SetOpaque(true); If (value ∙= null)

{

ListModel model = list. getModel();

String text = (String)model. getElementAt(index);

System, out. println ("Texcτ: ” + text + " " + value. toStringQ); setText(text);

}

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

Следующий шаг отображает требуемую картинку:

If (folderIcons!= null)

{

Setlcon((Icon)folderIcons. get(index));

}

Ясно, что это наиболее важный шаг всего процесса. Но, несмотря на это, он крайне прост — настолько прост, что я даже не знаю, что тут еще можно сказать.

Последняя часть кода в getListCellRendererComponent закрашивает фон обла­сти отображения заполняемого нами списка выбора:

If (folderlcons!= null)

{

Setlcon((Icon)folderlcons. get(index));

)

Как видите, мы всего-то просим сам JList предоставить нам цвета по умолча­нию для фона выбранной и невыбранной строк, и затем закрашиваем элементы эти­ми цветами. Наверно, можно было бы придумать и что-нибудь более сложное, но приведенный здесь код является достаточно шаблонным для большинства виден­ных мною реализаций этого объекта. Главное здесь в том, что нужно визуализиро­вать элемент по-разному: когда он выбран и когда не выбран

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

Последняя строка кода метода getListCellRendererComponent просто возвра­щает полностью созданного потомка JLabel:

Return this;

Затем система отображает элемент в списке выбора, производя полное впечатле­ние волшебства происходящего. И только усталый программист, создавший этот код, знает, что пользователь видит всего лишь одного потомка JLabel, постоянно отображаемого в маленьком прямоугольном участке экрана. Это феномен волшеб­ника Изумрудного города, показанный во всех цветах и со всеми картинками.

Резюме

В данной главе вы пользовались некоторыми инструментами визуальной разра­ботки JBuilder для создания нескольких простых программ. Вы набрались опыта в использовании конструктора, инспектора, панели структуры, панели проекта и ре­дактора. Вы также узнали еще немного о событиях, доступных с помощью страницы Events инспектора.

В одном из наиболее важных разделов главы было показано, как создавать ин­терфейс вашего приложения, используя два многократно используемых объекта JPanel. Вы можете многократно использовать эти компоненты в других приложе­ниях. Еще одной выгодой от конструирования приложения из последовательности JPanel является то, что вы можете распределить сложность кода главного окна про­граммы. В частности, все компоненты, которые должны были появиться в одном методе j.∙>init, могут быть распределены по нескольким jblnit, что существенно упрощает работу с кодом.

В последнем разделе главы вам была предоставлена возможность повозиться с битовыми изображениями и объектом JList. Удивительно, насколько сильное впе­чатление у пользователей программы могут вызвать пара-тройка простых картинок. Если вы являетесь одним из счастливых программистов, которые недавно выходили на улицу посреди дня, то вы могли заметить некоторые цветные объекты, наподо­бие неба, деревьев и цветочных клумб. Эти объекты не прорисованы на компьютере, это природные объекты. Но все равно они способны глубоко потрясти человеческое сознание. Разработчики программ могут тоже немного воспользоваться этой маги­ей, если поместят в свои программы несколько привлекательных картинок. Важ­ность подобных украшательств неуклонно возрастает, по мере роста изощренности пользователей и количества доступных приложений.

Теперь самое время закрыть книгу, запустить JBuilder и проверить, сможете ли вы воссоздать по памяти программы, описанные в данной главе. Если возможно, по­пробуйте использовать в качестве подсказок только снимки экранов. Проверьте, сможете ли вы создать программы, не глядя в текст книги и не просматривая сопро­вождающие материалы. Если вы сможете продвинуться настолько далеко, значит, вы усвоили информацию, приведенную в данной главе. Не забывайте, что вы може­те найти примеры программ MyCoiorSiider И ListBox На сайтах издателя русско­язычной редакции этой книги, а также на сайте Www. elvenware. com.

Чарли Калверт

Глава 18

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *