Основы JavaBean-KOMiiOHeHT

В

примечание редакциях JBuilder SE и JBuilder Enterprise представлено несколько инструмен­тов, призванных сэкономить время при создании JavaBean-компонентов. Но даже с использованием этих инструментов создание bean-компонента представляет собой достаточно сложную задачу.

Если вы пользуетесь редакцией JBuiIder Personal, посмотрите раздел "Bean-компоненты и редакция JBuiIder Personal" этой главы.

примечаниеСуществует классическое разделение между теми, кто создает визуальные ком­поненты, и теми, кто использует эти визуальные компоненты. В таких языках, как Delphi, C++ или Visual Basic, создание хорошего компонента часто является до­вольно сложной задачей, поэтому можно с уверенностью сказать, что создание ком­понентов — это развлечение далеко не для каждого. В Java это не совсем так, по­скольку здесь создание bean-компонента представляет собой абсолютно несложную задачу.

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

Bean-компоненты легки в использовании и просты для понимания. Если конк­ретнее, то bean-компонент проще для понимания, легче в использовании и проще в управлении, нежели стандартный Java-объект. В частности, bean-компонент обычно обеспечивает тщательно протестированный и простой в использовании визуальный интерфейс, тогда как Java-объект представляет собой лишь необработанный исход­ный код. Bean-компонёнты особенно просты при использовании в среде JBuilder, где с помощью визуальных инструментов вы сможете визуализировать и редактиро­вать важнейшие свойства bean-компонента, выполнив лишь несколько щелчков кнопкой мыши.

Надеюсь, я разбудил у вас интерес к этой полезной теме. Теперь пришло время с головой погрузиться в саму JavaBean-технологию.

Обзор

Ключом к разработке JavaBean-компонент в JBuilder является функция под на­званием BeansExpress BeansExpress предлагает JavaBean-дизайнерам поддержку по четырем различным направлениям:

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

■ BeansExpress помогает в создании Beanlnfo-файлов. Beanlnfo-файлы позволя­ют таким визуальным инструментам, как JBuilder, запрашивать информацию у bean-компонента и организовать для пользователя визуальный интерфейс bean-компонента. В частности, JBuilder использует Beanlnfo-файлы для выво­да свойств в инспекторе. (Можно получить информацию о Ьеап-компоненте и с помощью традиционного самоанализа в Java, но Beanlnfo-файл может по­мочь точно настроить интерфейс Ьеап-компонента.)

■ BeansExpress также помогает в создании событий и обработчиков событий.

■ BeansExpress помогает тестировать bean-компоненты с помощью BeansInsight.

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

Что такое BeansExpress?

Я склонен думать, что BeansExpress состоит из следующих функций:

■ Мастер JavaBean Wizard, который можно вызвать через пункт меню File, New ∣ JavaBean.

■ Диалоговое окно BeanInsight, находящееся в меню Tools.

■ Закладки, к которым можно получить доступ через закладку просмотра фай­лов Bean, находящуюся в нижней части редактора (см. рис. 33.1). В частно­сти, обратите внимание на закладки General, Properties, Beanlnfo, Events и Property Editors. Инструменты, находящиеся на этих закладках, являются сердцем BeansExpress.

Bean-компоненты и редакция JBuiIder Personal

В редакции JBuilder Personal отсутствуют и BeansExpress, и мастер JavaBean Wizard. Для большинства разработчиков это, возможно, является наиболее суще­ственным пробелом этой редакции.

Если вы пользуетесь JBuilder Personal, не все еще потеряно. Код, представлен­ный в этой главе, не привязан ни к какой конкретной версии продукта. Отсутствуют только инструменты, предназначенные для автоматической генерации кода.

Рис. 33.1. Доступ к ядру BeansExpress через закладки просмотра файлов, находящиеся в нижней части редактора

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

При использовании bean-компонента, у вас должна быть возможность сделать одно из двух:

■ Использовать диалоговое окно Bean Chooser для того, чтобы выбрать Ьеап-ком — понент из своего текущего проекта для его использования в своей программе.

■ Поместить собственноручно сделанный bean-компонент, сохраненный в JAR — файле, в палитру компонентов, чтобы его можно было выбирать так, как лю­бой другой компонент.

Эти две функции позволяют существенно увеличить мощь JBuilder. К счастью, обе эти задачи можно выполнить и в редакции Personal. Вы прочитаете про первую задачу в этой главе, а про вторую — в главе 37.

Определение терминов

Компания Sun обычно называет bean-компонентом отдельный JavaBean-компо — нент, если он имеет отношение к такой емкой концепции как архитектура JavaBeans. Я не буду настолько формальным. Вы обнаружите, что я буду называть от­дельный компонент либо bean-компонентом, либо JavaBean-компонентом.

Архитектура JavaBeans была разработана в феврале 1997 года как часть Java JDK 1.1. Bean-компонент — это нечто большее, нежели прославленный стандартный Java-класс или набор классов. Bean-компоненты обычно хранятся в JAR-файлах.

Вот как выглядят ключевые требования к преобразованию обычного класса в bean-компонент:

■ Он должен быть объявлен общедоступным.

■ Он должен иметь конструктор по умолчанию. Конструктор по умолчанию — это конструктор, не имеющий параметров. Это условие является необходи-

Мым, потому что JBuilder (и подобные инструменты) должны создавать Ьеап — компоненты на лету. Они не знают, какие параметры следует передавать в конструктор объекта, если такие параметры вообще существуют. В результате, bean-компоненты должны иметь простой конструктор, не требующий пара­метров.

Исходя из данного определения, следующий класс вполне можно считать Ьеап — компонентом:

Public class MyBean

{

Public MyBean()

{

)

}

Вряд ли можно придумать архитектуру компонента, которая была бы проще, чем эта.

Большинству bean-компонентам присущи следующие общие характеристики:

■ C bean-компонентом обычно связаны некоторые свойства и события. Свой­ства представляют собой методы с простым доступом, позволяющие получать данные bean-компонента. События являются механизмом, который исполь­зует bean-компонент для того, чтобы сообщить другому объекту про то, что произошло некоторое изменение.

■ Bean-компонент также должен иметь сопровождающий Beanlnfo-файл. Beanlnfo-файлы обеспечивают поддержку самоанализа, как это называют в компании Sun. Мы рассмотрим Beanlnfo-файлы позже в этой главе, и более подробно в главе 35.

Как вы можете видеть, разница между стандартным Java-классом и Ьеап-компо — нентом весьма незначительна. Простота JavaBean-спецификации находится в силь­ном контрасте с относительной сложностью компонентов Delphi и невероятной сложностью элементов управления ActiveX.

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

Единственная деталь спецификации JavaBeans, которая, возможно, явля­ется несколько более сложной, чем нужно, — это механизм событий. Спецификация со­бытий в Java является мощной и гибкой, но также она многословна и иногда несколько закручена. Прежде чем полностью понять механизм событий, программистам на Java приходится проводить несколько часов, сфокусировав свое внимание на событиях Java. К счастью, в конечном счете, сложность спецификации относительно легко управляема, и JBuiIder предоставляет значительную помощь в том, чтобы обойти трудные места. Как только вы уловили их суть, события Java становятся довольно простым инструментом, пользуясь которым, можно легко усовершенствовать свои bean-компоненты. Дополни­Тельную информацию о событиях можно получить в главе 14, "Обработка событий".

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

Создание простого Ьеап-компонента

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

Выберите в меню пункт File ∣ New ∣ JavaBean. Появится диалоговое окно, которое по своему внешнему виду и поведению очень похоже на диалоговое окно мастера нового класса New Class Wizard. Это диалоговое окно, называющееся JavaBean Wizard (Мастер JavaBean-компонент), показано на рис. 33.2.

примечаниеВ мастере JavaBean необходимо выбрать пакет, имя класса и базовый класс для создаваемого Ьеап-компонента. Для начала вы можете оставить имена пакета и клас­са, заданные по умолчанию, безо всяких изменений. Убедитесь, что в качестве базо­вого класса выбран JPaneI. Если нужно, нажмите кнопку эллипсиса, расположен­ную справа от поля базового класса и найдите javax. swing. JPanel. В области опций выберите пункты Public (Общедоступный), Generate header comments (Генерировать заглавные комментарии) и Generate default constructor (Генерировать конструктор по умолчанию). Нам не нужен главный метод, и также нам не нужен пример свойства, поскольку вскоре мы создадим свое свойство.

В большинстве случаев имеется небольшая разница между выбором JPanel и JComponent в качестве предка визуального JavaBean-компонента. Я начал с использования JPanelf так как вы уже должны быть хорошо знакомы с этим компонен­том. Однако JConiponent является более легковесным И, возможно, представляет собой Лучший выбор при создании приложений.

рис. 332. диалоговое окно мастера javabean-компонент и по внешнему виду, и по функциональности очень похоже на окно мастера нового класса

После того, как вы щелкнете на кнопке OK, ваш bean-компонент будет автомати­чески создан. В итоге должен получиться код, похожий на то, что вы видите в лис­тинге 33.1.

Листинг 33.1. Пример bean-компонента, созданного с помощью мастера JavaBean — компонент

Packageuntitled7;

Import java. awt.*;

Import javax. swing. JPanal;

Public class Baanl extends JPanel

{

BorderLayout borderLayoutl = new BorderLayout(); public Beanl()

1

Try

{

Jblnit () ;

)

Catch(Exception ex)

{

Ex. printStackTrace();

)

)

Private void jbɪnit() throws Exception {

This. SetLayout(borderLayoutl);

}

)

Как вы можете видеть, этот bean-компонент очень похож на обычный Java-класс. В действительности, он и представляет собой обычный Java-класс JBuilder самосто­ятельно добавил диспетчер компоновки, но это можно расценивать, скорее, как просто льготу, которая никоим образом не определяет принадлежность класса к bean-компонентам. Важной характеристикой класса является то, что он объявлен общедоступным:

Public class Beanl extends JPanel

Другая ключевая характеристика состоит в существовании конструктора по умол­чанию:

Public Beanl()

{

Try

1

Jblnit();

>

Catch(Exception ex)

1

Ex. printStackTrace ();

1

}

Тестирование Ьеап-компонента с помощью Beanlnsight

JBuilder редакций SE и Enterprise содержит инструмент BeanInsight, который мо­жет исследовать bean-компонент и предоставить отчет о его состоянии. Для того чтобы использовать BeanInsight, сначала выберите bean-компонент в панели содер­жимого. Выберите в меню пункт Tools ∣ Beanlnsight. JBuilder откроет диалоговое окно, показанное на рис. 33.3, которое содержит две кнопки в верхней части. Верх­нее поле, называющееся Select a bean to examine (Выберите bean-компонент для ис­следования), позволяет выбрать исходный файл, который нужно протестировать. Так как мы начали с того, что выбрали свой bean-компонент в панели содержимого, нет необходимости в том, чтобы пользоваться этой кнопкой. Вместо этого выберите другую кнопку, Examine Bean (Исследовать Ьеап-компонент). После того как вы щел­кнете на этой кнопке, в разделе результатов BeanInsight появится текст, показанный на рис. 33.3.

примечаниеКак видите, такому инструменту, как BeanInsight, понравилось в нашем Ьеап — компоненте все, за исключением того факта, что отсутствует связанный с данным компонентом Beanlnfo-файл. Мы добавим этот файл после того, как предваритель­но обсудим еще некоторые вопросы.

Beanlnsight может выдать сообщение об ошибке следующего содер­жания: "class X not found on classpath" ("класс X не найден в пути классов"). Обычно это говорит о том, что вы не откомпилировали свой bean-компонент должным образом. Чтобы это исправить, выберите в меню пункт Project ∣ Rebuild Project (команда make, скорее всего, будет работать так же хорошо, как и команда build). После успешной компиляции вашего Ьеап-компонента Beanlnsight должен выдать более полезную ин­формацию. Если же после компиляции проблема не была решена, тогда у вас, скорее всего, проблема с путями классов. Это можно исправить, если переместить свой Ьеап — компонент в пакет, являющийся частью вашего проекта, или если выбрать в меню пункт Project I Project Properties и добавить в проект новую библиотеку. Вопросы данного ха­Рактера более глубоко рассматривались в части V книги.

рис. 33.3. исследование ьеап- компонента при помощи инструмента beaninsight

Обратите внимание на кнопку View Details (Показать детали) в нижней части окна, показанного на рис. 33.3. Щелчок на этой кнопке приводит к отображению нескольких закладок с описанием деталей построения bean-компонента. В частно­сти, появляются закладки Bean, Beanlnfo, Properties (Свойства), Event Sets (Набор событий), Property Editors (Редакторы свойств), Customizer (Настройка) и Attributes (Ат­рибуты). Мы рассмотрим эти закладки более подробно во время обсуждения Beanlnfo-файлов.

Добавление свойства в Ьеап-компонент

На данном этапе у вас уже имеется довольно-таки приличный Ьеап-компонент, который, правда, не делает ничего интересного. Не стоит и говорить, что для добав­ления свойств к bean-компоненту необходимо связать с ним методы и данные. Син­таксис свойств в Java отличается от синтаксиса свойств в таких продуктах, как Delphi. Для того чтобы определить свойство в Java, вам нужно только лишь опреде­лить метод доступа. Метод доступа — это метод, с помощью которого происходит из­влечение и/или присвоение значения переменной, объявленной вами. Например:

Private int xPos; public int getXPos()

{

Return xPos;

}

Public void setXPos(int value)

{

XPos = value;

}

примечаниеB качестве данных здесь выступает переменная xPos. Чтобы преобразовать эти данные в свойство, вам потребуется снабдить эту переменную методами извлечения и присвоения значений.

В моей программе возникли ошибки, когда я дал своим переменным имена х и у. Невероятно, но компанией Sun были объявлены методы класса JConponent, называющиеся getX и getY. Поскольку все методы Java являются виртуальными, это мо­жет привести к тому, что JDK при попытке определить границы вашего компонента будет вызывать ваши методы getX или getY. Это может привести к всевозможным пробле­мам. Поэтому я настоятельно рекомендую никогда не давать элементу Java-класса таких Имен, как х или у.

Важно отметить тот факт, что метод извлечения значений начинается со слова get (что вполне естественно), за которым следует имя свойства. Имя метода при­своения значений составляется по тому же шаблону. Оно начинается со слова set, за которым следует имя свойства. Такая комбинация слов get и set, за которыми следует имя свойства, является методом определения свойства в Java. В Delphi про­граммисты используют ключевое слово property. В Java вы не пользуетесь ключе­вым словом Вместо этого вы следуете синтаксическому шаблону.

примечаниеНаверное, для того, чтобы немного усложнить программистам жизнь, метод извлечения значений для переменной булевого типа начинается не со слова get, а со слова is. Например, если у вас есть переменная, объявленная как Boolean bigθne, ее методы извлечения и присвоения значений будут называться IsBigOne и SetBigOne. Хорошо это или плохо, но это, безусловно, заставляет нас быть внимательными.

Может выглядеть неудобным то, что мы должны написать весь этот код лишь для того, чтобы создать свойство. К счастью, JBuilder может создать большую часть кода автоматически. Чтобы понять, как это работает, давайте попробуем пойти по двум различным сценариям.

Во-первых, в редакторе исходного кода перейдем в панель содержимого и доба­вим переменную в верхнюю часть своего класса. Например, чуть выше конструктора класса напишем private int yPos. Теперь выберем Bean ∣ Properties в нижней части па­нели содержимого. Вы увидите свою переменную в пределах сетки на закладке Properties (Свойства), как показано на рис. 33.4.

На рис. 33.4 вы можете видеть, что я выбрал колонки Getter И Setter для пере­менной YPos. В результате автоматически был сгенерирован следующий код:

Public int getYPos()

{

Return yPos;

)

Public void setYPos(int yPos)

{

This. yPos = yPos;

}

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

JBuiIder GiZSrt Jovα∕AlllJιιtitledsZιιrιtitled6ZsrcZuntit∣ d6∕Be<sn1.javn цО _____ ∣

рис. 33.4. свойство, отображаемое в beansexpressFile Edit Search vɪew Project Run Team Wizards Tools Window Help

D <s ⅞F A Q ⅛"Y(∣mΓ⅜ ¾J5⅛ ⅛ ⅛~* <

Fflɪ ’ ⅛,Jf → ■» ]4? _

1√∣ 5Й J∏titt ’ <& Bean1 ∣⅛⅛ Framei j

I∣j3 untitledβ.jpx & (J untided6

φ Applicationl. java —1⅜ Bean1 ∣ava <& FrameUava

Ri ⅞⅛ Imports

B ⅜ Beant

% JPaneI *∙ getYPosO

Name

I T⅝pe

Getter! Better

Binding j

BorderLayoutl

Bo, derLayout

Γ i r

None i

⅝dd property.i)∣ remove pmperty jgeneral properties jbwnlnto “ evente propertyeditorsi
source) design, bean)uwl∣ docj history)
— * SetYPos(StringyPos) I ‰ borderLayoutl ; ⅜yPos

Перейдите в JBuilder в панель, показан­ную на рис. 33.4. На этот раз щелкните на кнопке Add Property (Добавить свойство). По­явится диалоговое окно New Property (Новое свойство), показанное на рис. 33.5. Введите имя нового свойства, скажем, myString.

Как видите, я присвоил свойству имя, указал его тип и попросил JBuilder реализо­вать методы извлечения и присвоения зна­чений. Я также указал отображаемое имя и краткое описание для своего свойства.

После того как вы щелкнете на кнопке OK в диалоговом окне New Property, перехо­дите в редактор. Вы обнаружите, что код ва­шей программы несколько увеличился:

Private String myString;

Public void SetMyString(String myString)

{

This. myString = myString;

}

Public String getMyString()

{

Return myString;

}

Если теперь вы захотите переименовать свое свойство, перейдите на закладку Properties, которая была показана на рис. 33.4. Щелкните на левом столбце, в котором отображается имя свойства. Введите новое имя, например yourString. Перейдите назад в исходный код, и вы увидите, что все необходимые изменения отразились и в коде:

Private String yourString;

Public void SetYourString(String yourString)

{

This. yourString = yourString;

}

Public String getYourString()

{

Return yourString;

}

Вы можете также легко удалить свойство вместе с его методами извлечения и присвоения значений. Просто щелкните в BeansExpress на кнопке Remove Property (Удалить свойство).

Инструменты, которые здесь представлены, являются довольно мощными. Если вы имеете дело со сложным объектом, содержащим множество переменных, вы мо­жете использовать BeansExpress для того, чтобы быстро и легко переименовать мно­гие ключевые свойства этих объектов. Эти инструменты работают даже тогда, когда

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

Ключевой мыслью здесь является то, что вы должны помнить, что в JBuiIder имеется такая возможность. Можно почти с полной уверенностью заявить, что тысячи пользователей JBuiIder (включая и меня) потратили многие часы на создание и/ или переименование свойств и соответствующих им методов извлечения и присвоения значений вручную. Если вы имеете в своем арсенале такой мощный инструмент, как JBuiIder, одна из целей, которой следует достичь, заключается в том, чтобы научиться пользоваться предоставляемыми им инструментами, а затем не забывать постоянно при­менять их на практике. JBuiIder является лучшим инструментом подобного рода. Нет ни одного другого редактора и компилятора Java такого калибра. Однако его реальная Ценность зависит от способности разработчика задействовать его в полной мере.

Beanlnf о-файлы

Простого определения свойства достаточно для того, чтобы свойство появилось в инспекторе JBuilder. Однако вы можете обрести больший контроль над свойства­ми своего bean-компонента, если вы помимо этого добавите Beanlnfo-файл.

Beanlnfo-файл является стандартом, определенным компанией Sun, который по­зволяет явно выявлять и выделять характеристики bean-компонента. Технологии са­моанализа Java (τ.e., его информация о типах во время выполнения) позволяют вам многое узнать о структуре и содержимом класса. Однако Beanlnfo-файл предостав­ляет большую степень контроля над интерфейсом класса. В частности, он позволя­ет следующее:

■ Показать или сокрыть свойства или другие характеристики Ьеап-компонента.

■ Поставить в соответствие bean-компоненту определенную пиктограмму.

■ Снабдить bean-компонент отображаемым именем и описанием свойств и прочих характеристик. В частности, вы можете использовать Beanlnfo-файл для того, чтобы связать строку справки со свойством своего Ьеап-компонента.

■ Создать категории для характеристик Ьеап-компонента, например, свойства для редакции Enterprise, свойства для редакции Standard, свойства уровня эк­сперта, свойства среднего уровня и т. д.

Создавать Beanlnfo-файл в JBuilder исключительно легко. Во-первых, выберите в панели проекта необходимый bean-компонент, как показано на рис. 33.6. Выберите из закладок просмотра файла, расположенных в нижней части панели содержимого, закладку Bean и перейдите на закладку Beanlnfo. Отметьте флажки в столбце Expose (Показать). После этого будут показаны свойства вашего Ьеап-компонента. Щелк­ните на кнопке Generate Beanlnfo (Сгенерировать Beanlnfo-файл). Будет создан новый файл с названием вроде BeaniBeaninfo. java. Имя этого файла составляется из имени вашего Ьеап-компонента, после которого следует Beaninfo. java: XxxBeanInfo. java. Имя созданного BeanInfo-файла можно видеть в панели проекта (см. рис. 33.6).

рис. 33.6. генерация beanlnfo-файла. обратите внимание на отмеченные флажки в столбце expose, а также на узел bean ibeaninfojava, видимый в панели проекта flle edlt sβe∙tlι view.. pnlecl р» learn wtjards до sgrtdi,* sfseanf j ж i½ fι∙ame11,eΛosp steertiaee beanlnto,⅛∣μ untwed23jpx йй ф «project source»
⅛ ф untwed23 i ф applicationijava i ф beam java г ф beanibeaninfbjava -■ ф frarnal java
,ij⅜an⅛r⅛ιe beaninft,-л'»-*?
о βpl∙vl
,nw-ij,«default»,pivstriliu,s imports ;
• beanl : ⅝ jpanei
- ⅛ bean10
• ♦ gelmystringo
• ⅜ geltposo
- ♦ setmystring(strin
• seiypos(inlypo* .-т» h∩rriρri av∩ιιtlj
,~ч. "ij •• да s & ,я &&ss58 .
jg.- j 3jx32 eo∣nr icprr - i 32x32 mono .con:
,я. jpcoiorftpn-,i. montɪteθr,dbβnιnfu ,tvnm∙j property ed_ton l,paved1 modbled⅛⅜.,c* jbuiwer 7 ь ⅛rc ⅛rcjovd abικrtttteds 'unt.uie423∕src∕untuud23.∙*be-an14αvβ,nle∣ault>,bnrrlprl⅛√ou!1

Как упоминалось выше, имя Beanlnfo-файла должно соответствовать определен­ному шаблону. Этот шаблон является частью спецификации Java, связанной с Ьеап — компонентами. В частности, Beanl Имя bean-компонента, a Beaninfo Тип ис­ходного файла Java. Соедините две части, и вы получите имя Beanlnfo-файла для своего bean-компонента, т. е. BeanlBeaninfo. java. Если имя bean-компонента выг­лядело как MyListBox. java, Тогда имя Beanlnfo-файла для этого Ьеап-компонента будет выглядеть как MyListBoxBeanInfo. java.

примечаниеРаспознавая этот шаблон, JBuilder и прочие среды разработки Java находят Beanlnfo-файлы для bean-компонентов. Эти шаблоны являются такой же неотъем­лемой частью спецификации Java, как ключевое слово Property Являются частью языка Object Pascal, или как ключевое слово Void Являются частью языков C и C++.

К этому моменту вы уже столкнулись с двумя ситуациями, когда в Java имеет значение шаблон слов в имени. Сначала вы увидели, что имена методов извлече­ния и присвоения значений соответствуют шаблону getX, setX. Теперь вы увидели, что имена Beanlnfo-файлов соответствуют шаблону xxxBeanlnfo. java. Нравится вам это, или нет, но в мире Java все зиждится именно на этом. Что касается меня, то я не нахожу, что шаблоны такого рода причиняют много вреда, тогда как они в действительности по­могают достичь договоренности относительно присвоения имен, а это определенно хо­рошо. В публичном заявлении, которое дал создатель Java, Джеймс Гослинг (James Gosling), он намекнул, что если бы у него был шанс сделать все заново, он, возможно, воспользовался методом обработки свойств, используемым в Delphi, вместо того чтобы Отдавать предпочтение шаблонам.

По окончании работы BeanInfo вы можете исследовать файл Bean2Beaninfo. java И просмотреть его содержимое. Давайте просмотрим созданный нами файл, который приведен в листинге 33.2.

Листинг 33.2. Простой Beanlnfo-файл

Package untitled6;

Import java. beans.* ;

∕** ——————— ———

* <p>Title: <∕p>

* <p>Description: <∕p>

* <p>Copyright: Copyright (с) 2002 by Charlie Calvert<∕p>

* <p>Company: Elvenware<∕p>

* βauthor Charlie Calvert

* Aversion 1.0 */

Public claβa BeanlBeanInfo extends SiiitpleBeanXnfo

{

Class beanClass ■ Beanl. class;

String IconColorl6xl6Filename;

String iconColor32x32Filename;

String IconMonol6xl6Filename;

String iconMono32x32Filename;

Public BeanlBeanInfo()

{

)

Public PropertyDescriptor[] getPropertyDeβcriptorβ()

{

Try

(

PropertyDescriptor YPos = new PropertyDescriptorCyPos", beanClass, "getYPos", ,*setYPos") ;

_yPos. SetDisplayHame("yPos");

_yPos. SetShortDescription("yPos");

PropertyDescriptor _myString = new PropertyDescriptorCmyString", beanClass, "getMyString", "setMyString");

_myString. SetDisplayName("myString");

_myString. SetShortDescription("myString");

PropertyDescriptor[] pds = new PropertyDescriptor[] {

_yPos,

_myString};

Return pds ;

}

Catch(IntrospectionBxception ex)

(

Ex. PrintStackTrace() ; return null;

}

}

Public java. awt. Image getlcon(int iconKind)

{

Switch (iconKind) {

Case BeanInfo. ICON_COLOR_16x16:

Return iconColorl6xl6Filename!= null?

IoadImage(iconColor16xl6Filename) null;

Case BeanInfo. ICON_COLOR_32x32:

Return iconColor32x32Filename!= null?

IoadImage(iconColor32x32Filename) null;

Case BeanInfo. ICON_MONO_16xl6:

Return IconMonol6xl6Filename! = null?

IoadImage(IconMonol6xl6Filename) null;

Case BeanInfo. ICON_MONO_32x32:

Return iconMono32x32Filename!= null?

IoadImage(iconMono32x32Filename) null;

)

Return null;

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

■ geticon. Этот метод возвращает пиктограммы, которые необходимо сопоста­вить с Ьеап-компонентом.

■ get Pr opertyDe scrip tors. Этот метод возвращает основную информацию о свойствах Ьеап-компонента.

Вот как выглядит описание одного из свойств:

PropertyDescriptor _myString = new PropertyDescriptor("myString", beanClass, "getMyString", ,,setMyString") ;

_myString. SetDisplayName("myString");

_myString. SetShortDeecription("myString");

Несложно заметить, что свойство описано посредством класса PropertyDescriptor. Некоторые методы PropertyDescriptor (например, SetDisplayName И SetShortDescription) ЯВЛЯЮТСЯ достаточно ПОНЯТНЫМИ. Тем не менее, у Ьеап-компонента могут быть и более сложные характеристики, например, редактор свойств. Этот редактор появляется автоматически, когда вы пользуетесь инспектором JBuilder. Его назначение состоит в том, чтобы предоставить пользова­телю возможность редактирования свойства.

Понимание SimpIeBeanInfo

Beanlnfo-классы, представленные в JBuilder, унаследованы от JDK-класса SimpleBeaninfo. Ниже приведено объявление этого класса (код реализации после­днего метода я удалил по причине его большого объема).

Package j ava. beans;

Public class SinpleBeanInfo implements BeanInfo

{

Public BeanDescriptor getBeanDescriptor()

{

Return null;

}

Public PropertyDescriptor[] getPropertyDescriptors()

{

Return null;

}

Public int getDefaultPropertyIndex()

{

Return -1;

}

Public EventSetDescriptor[] getEventSetDescriptors()

{

Return null;

1

Public int getDefaultEventlndex()

{

Return -1;

1

Public MethodDeecriptor[] getMethodDescriptors()

{

Return null;

}

Public BeanInfo[] getAdditionalBeanlnfo()

{

Return null;

}

Public java. awt. Image getlcon(int iconKind)

{

.∙ return null;

}

Public java. awt. Image IoadImage(final String resourceName)

{

∕∕ Я удалил реализацию этого метода

}

}

Если метод Beanlnfo-класса возвращает Null Или -1, он подобным образом уве­домляет, что у него нет информации о данной функциональной возможности. Это может означать, что bean-компонент должен скрывать эту возможность, или что для того, чтобы исследовать эту возможность bean-компонента, следует прибегнуть к традиционному самоанализу Java. Самоанализ иногда еще называют информацией о типах времени выполнения (Run Time Type Information, RTTI). Информация о ти­пах времени выполнения — это средство, позволяющее напрямую опрашивать объект для того, чтобы исследовать его характеристики. Например, при помощи са­моанализа вы можете узнать тип поля, являющегося частью класса.

Поскольку BeanInfo-классы среды JBuilder являются производными этого класса, класс Beaninfo Ничего не говорит о bean-компонентах, с которыми он связан. Вся­кий раз, когда инспектор JBuilder запрашивает информацию путем вызова одного из этих методов, в ответ он получает либо Null, Либо -1. В зависимости от того, ка­кой метод используется, это может означать либо то, что JBuilder или подобный ему инструмент не показывает никакой информации вовсе, либо то, что следует ис­пользовать самоанализ и посмотреть, каких результатов можно достичь путем ис­следования шаблонов, реализованных в классе. Например, если вы не даете ника­кой информации о событиях, JBuilder воспользуется самоанализом, чтобы выявить, какие события доступны для данного класса.

Как вы уже видели, JBuilder перекрывает некоторые из этих методов, когда вы просите показать информацию о своем bean-компоненте. В частности, вы видели, что он перекрывает метод GetPropertyDescriptors. Таким образом, вы сообщаете внешнему миру о свойствах своего Ьеап-компонента.

Управление видимостью свойств предка

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

Если у вас вообще нет класса Beaninfo, Тогда JBuilder воспользуется службой са­моанализа для того, чтобы выявить доступные свойства вашего класса. Он будет ис­кать в классе методы извлечения и присвоения значений, а затем покажет их в виде свойств в инспекторе.

Если вы создадите Beanlnfo-класс, являющийся потомком SinyleBeaninfo, Тог­да, по умолчанию, механизм поиска свойств путем самоанализа отключается. Вмес­то этого вы будете видеть лишь те свойства, которые явно показаны в Beanlnfo-Knac- се. Это дает вам полный контроль над интерфейсом компонента с внешним миром.

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

Если вы хотите сделать видимыми все свойства, унаследованные от класса-пред­ка, добавьте в класс следующий код:

Public BeanInfo[] getAdditionalBeanlnfo()

{

Class superclass = beanClass. getSuperclass(); Try {

BeanInfo SuperBeanInfo = Introspector. getBeanlnfo(superclass); return new BeanInfo [ ] { SuperBeanInfo } ;

}

Catch(IntrospectionException ex)

1

Ex. printStackTrace(); return null;

)

1

примечаниеЭто один из методов класса SimpleBeanInfo, Который был приведен ранее в этой главе. При замене этого метода JBuilder реализует код, который делает види­мой Beanlnfo-информацию классов-предков.

Имя метода getBeanlnf о, к которому обращается метод getAdditionalBeanlnfo, представленный здесь, может ввести в заблуждение. Когда происходит вызов метода getBeanlnfo, Java сначала ищет явно объявленные Beanlnfo — классы. Но, кроме того, Java будет также искать любую производную информацию, ко­торую только можно найти путем поиска шаблонов методов извлечения и присвоения Значений переменных.

Документация по классу Introspector, Доступная в Javadoc-файлах компании Sun, написана настолько хорошо, что она буквально вышибает у меня слезу. Здесь, например, очень вдохновляют последние предложения обзора этого класса: "Если мы не находим явного BeanInfo для данного класса, тогда мы используем низко­
уровневую рефлексию для изучения методов класса, а также применяем стандарт­ные шаблоны разработки для поиска средств доступа к свойствам, источников со­бытий или общедоступных методов. Затем мы продолжаем анализировать базовый класс данного класса и добавляем информацию из него (а также, возможно, и из других классов иерархии базовых классов)". Когда они пишут это настолько четко и последовательно, будет вопиющим преступлением не потратить некоторое время на чтение Javadoc-документов, относящихся к некоторым из этих классов.

примечаниеВ JBuilder вы можете сгенерировать код метода GetλdditionalBeaninfo, Перей­дя в BeansExpress и выбрав закладку Bean из закладок просмотра файлов. Перейдите на закладку Beanlnfo и отметьте флажок Expose superclass Beanlnfo (Показать Beanlnfo для базового класса). Щелчок на кнопке Generate Beanlnfo приведет к авто­матической генерации метода GetAdditionalBeanlnfo.

Иногда, когда я удаляю и добавляю свойства к компоненту, единствен­ный способ, которым я могу заставить их исчезнуть из инспектора JBuiIder, заключается в том, чтобы удалить целиком весь каталог и все входящие в него каталоги, включая и кэш пакета. Я также сталкивался с такими ситуациями, когда код метода getAdditionalBeanlnfo не был удален и после выключения соответствующей ему Метки на закладке Beanlnfo. Если это необходимо, удалите метод вручную.

Можно еще многое сказать по поводу Beanlnfo-файлов. Однако я хотел бы завер­шить обсуждение этой темы здесь, поскольку эта глава была задумана как введение в основы технологии JavaBeans. Более подробную информацию о Beanlnfo-файлах и обо всех аспектах создания JavaBean-компонентов можно найти в последующих не­скольких главах. В них вы сможете найти конкретные примеры более сложных Ьеап — компонентов, в которых используются все характеристики спецификации JavaBean. В частности, прочитайте разделы "Показ свойств New Clock" и "Показ событий New Clock" в главе 35.

Использование Ьеап-компонента

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

Выберите в панели проекта файл Beanljava. Щелкните на закладке Design, нахо­дящейся среди закладок просмотра файла в нижней части редактора. Убедитесь, что в качестве значения свойства Layout для Ьеап-компонента выбрано BorderLayout. Те­перь поместите на свой bean-компонент объекты JButton и JTextArea, как показано на рис. 33.7.

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

Void JButtonl_ActionPerfoπned(ActionEvent Е)

{

JTextAreal. setText("Это простой bean-компонент");

)

Рис. 33.7. Интерфейс для простого Bean-компонента

Теперь с помощью панели проекта переместите фокус на Frameljava в панели содержимого. Переключитесь в режим конструирования. Убедитесь, что свойство Layout для Framel равняется BorderLayout (Для потомков JFrame, Коим является Framel, Это свойство равно BorderLayout По умолчанию. Однако для аплета оно бу­дет равно FlowLayout.)

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

sxct },pro⅝o⅝ee∣ ewntaj jbnhrfpr f_:/nt»rrfrhnrile/srcj«ivn/»ntdiprf 17∕srr∕ιιn1illι>ril 7/fmmpl .java - x,flh ξdl, gaercħ view projact run team wtearda ɪoola window hitp
d-is'(fi∙⅛β"β4[Λ'*⅛'⅜¾ Λ¼⅜⅜i⅜⅛l''⅛ si * ∙⅞⅛∙i<-* *l∙
t> ⅛ f⅞l φ.τ ⅛baanl∣ abeantbaaninsi aframat
jjjeluntriedi 7.jpx ц s*⅛ ∣ swlne cortoawai omabqwaaai hbswinei eera <tβwna i wswatam jld
,.3 3 urrtttledi t ■ a application! jaaa i abaani jana j 4 jbeanloaanlnro-jav jk аяияяий ” ⅛l.....,⅛j,э ∖ so #- ми й- *****,iqlx,*}uπwed17jrame1
≈cjui l
‘ ⅞-gafflg⅝
‘ b ® contenipanj
vbordarq = -~j menu i
cj dataaccess ?
□ other
,£ ««a d-.,⅛n ∣ba⅛ jjmlj doc hleton,⅛⅛7"^-~ mejij
background a,ςπ
itontonipanb 
kuraor i
fdeiaultc lose hide
true!
fenatiled 
№п1 ~κ
horaground he
ilconlmapa 
|<l-_..n_. 

,рис. 33.9. выбор ьеап-компонента в диалоговом окне bean chooser
mtrienirane (bordertayeuq
—beanchooser
рис. 33.8. beanchoosemaxodumcn справа от панели проекта, левее палитры компонент и совсем близко к инструменту выбора

Должно появиться диалоговое окно Bean Chooser (Выбор bean-компонента), с помощью которого можно выбрать нужный bean-компонент из доступных пакетов проекта. На рис. 33.9 я выделил Beanl из проекта untitled17. Конечно же, имя ваше­го проекта может отличаться.

рис. 33.10. экземпляр beanljava располагается на поверхности framel

После того как вы выбрали свой bean-компонент, курсор JBuilder примет вид зна­ка плюс, так же как и при выборе компонента из палитры компонентов. C помощью мыши "нарисуйте" компонент на Framel, Как показано на рис. 33.10. Когда все бу­дет готово, Framel. Java Станет очень похож на Beanl. Java. Это произойдет пото­му, что вся его поверхность теперь покрыта созданным вами bean-компонентом. Однако если вы посмотрите на панель структуры, то увидите, что bean-компонент теперь нахо­дится в верхней части панели содержимого для Framel (Иногда может понадобиться установить значение свойства Constraints bean компонента равным Center.)

На рис. 33.10 изображен инспектор. Как видите, в инспекторе теперь видны два новых свойства, одно из которых называется myString, а другое — yPos. Эти свойства являются видимыми, потому что мы явно указали их в Beanlnfo-файле. Если бы не было Beanlnfo-файла, вы бы все равно могли видеть эти свойства, но также вы виде­ли бы все свойства, унаследованные от JPanel.

Если вы теперь запустите проект на выполнение и щелкнете на кнопке JButtonl, В текстовой области появится строка "This is A Simple Bean" ("Это простой Ьеап-кокпонент"). Для большей уверенности в том, что у вас не возник­нет путаницы насчет того, как все это работает, я включил данный проект в состав сопровождающих книгу материалов под именем BasicBean. В Листинге 33.3 пока­зан код самого bean-компонента, а в листинге 33.4 — Код Framei. Java После того, как на него был помещен Ьеап-компонент

Листинг 33.3. Код простого Ьеап-компонента

Package Basicbean;

Import java. awt.*;

Import javax. swing.*;

Import java. awt. event.*;

Public class Beanl extends JPanel

1

BorderLayout borderLayoutl = new BorderLayout();

JTextArea jTextAreal = new JTextAreaO ;

JButton jButtonl = new JButton(); private String myString;

Private int yPos;

Public Beanl()

Try

{

Jblnit() ;

}

Catch(Exception e)

{

E. PrintStackTrace ();

}

}

Private void jbɪnit() throws Exception {

JTextAreal.βetText CjTextAreal"); jButtonl. setText(”jButtonl");

JButtonl. BddActionListener(new Beanl_jButtonl_actionAdapter(this));

This. SetLayout(borderLayoutl);

This. add(jTextAreal, BorderLayout. CENTER);

This. add(jButtonl, BorderLayout. NORTH);

)

Void jButtonl_actionPerformed(ActionEvent e)

{

JTextAreal. setText("Это Простой BeanКомпонент");

)

Public void SetMyString(String myString)

(

This. myString = myString;

}

Public String getMyString()

<

Return myString;

)

Public void setYPos(int УPos)

{

This. yPos = yPos;

)

Public int getYPos()

{

Return yPos;

}

)

Class Beanl_jButtonl_actionAdapter implements

Java. awt. event. ActionListener

{

Beanl adaptee;

Beanl_jButtonl_actionAdapter(Beanl adaptee)

<

This. adaptee = adaptee;

)

Public void actionPerformed(ActionEvent e)

{

Adaptee. jButtonl_actionPerformed(e);

)

Листинг 33.4. Потомок класса JFrame, в который внедрен простой Ьеап-компонент

Package basicbβan;

Impost java. awt.*;

Impost java. awt.βv∙nt.*;

Impost javax. awing.;

Public class Fsamel extends JFsame

T

JPanel ContentPane;

BosdesLayout bosdesLayoutl = new BosdesLayout();

Beanl beanll = new Beanl();

∕∕ Создание фрейма Public Fsamel()

{

OnableEventS(AWTEvent. WINDOW_EVENT_MASK); tsy {

Jbɪnit() ;

)

Catch(Exception e)

{

E. psintStackTsace();

}

I

∕∕ Инициализация компонент Psivate void jbɪnit() thsowβ Exception {

ContentPane = (JPanel) this. getContentPane();

ContentPane. setLayout(bosdesLayoutl); this.βetSize(new Dimension(400, 300));

This. SetTitle("Fsame Title");

ContentPane. add(beanll, BosdesLayout. CENTER) ;

}

∕∕ Перекрыт, чтобы можно было выйти при закрытии окна Psotected void psocessWindowEvent(WindowEvent e)

{

Supes. psocessWindowEvent(e);

If (e. getID() ≈ WindowEvent-WINDOW-CLOSING)

{

System. exit(О) ;

)

Совершенствование Bean-компонента

Если вы хотите продолжить редактирование bean-компонента, то должны отка­заться от искушения фокусироваться на Fsamel. java. Вместо этого вам следует сфокусироваться на Beanl. java И вносить изменения в сам bean-компонент. Затем, после повторной компиляции, Fsamel. java Примет те изменения, которые вы вне­сли в bean-компонент. Короче говоря, не пытайтесь редактировать экземпляр класса Beanl, Внедренный в Fsamel. java. Вы можете достичь некоторого успеха в этом, однако подобный подход не является правильным.

Прежде чем завершить эту главу, я бы хотел отметить, что мы еще не рассмотрели две важнейших характеристики bean-компонентов — хранение Ьеап-компонента в JAR-файле и внесение Ьеап-компонента в состав палитры компонентов.

Но волноваться не стоит, так как мы рассмотрим обе эти возможности в главе 37. Многие другие возможности bean-компонентов будут охвачены в последующих не­скольких главах.

Упражнения

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

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

1. Добавьте аплет или второе приложение к последнему проекту, разработанно­му в этой главе. Не начинайте новый проект, а продолжите работу с текущим проектом. C помощью BeanChooser добавьте созданный нами Ьеап-компо — нент в свое новое приложение или аплет. Обратите внимание на то, что вы можете использовать этот bean-компонент более чем в одной Java-программе (Если вы работаете с аплетом или JApplet, Убедитесь, что вы установили для свойства Layout значение BorderLayout.)

2. Внесите дополнительные изменения в свой bean-компонент, например, изме­ните имя кнопки с JButtonl На MyButton. Повторно откомпилируйте свой проект и запустите его на выполнение. Обратите внимание на то, что измене­ния, которые вы внесли в bean-компонент, отражаются и в программе. Идея заключается в том, чтобы внести изменения в сам bean-компонент, а не в его реализацию, внедренную в Framei.

3. Удалите свой bean-компонент из Framei.Java, Щелкнув кнопкой мыши на bean-компоненте и нажав на кнопку Delete. Поместите на Frameljava панель и выберите для ее свойства Constraints значение Center. Свойству Layout для панели следует присвоить значение GridLayout и наделить его двумя строками и двумя столбцами. Теперь с помощью BeanChooser поместите на панель два экземпляра своего bean-компонента, один — на верхнюю строку панели, дру­гой — на нижнюю строку. Запустите приложение и протестируйте каждый эк­земпляр Ьеап-компонента.

Среди сопровождающих книгу материалов вы найдете решения для упражнений 1 и 3 в каталоге BasicExercises. В этом каталоге, для того чтобы получить решение упражнения 1, перейдите в каталог BasicBeanOl И откройте проект, который вы там найдете. Щелкните правой кнопкой мыши в панели проекта на элементе Applicationl или AppIetChtmI и выберите в появившемся контекстном меню пункт Run. Вы увидите, что и в аплете, и в приложении присутствует один и тот же Ьеап — компонент.

Чтобы ознакомиться с решением упражнения 3, зайдите в каталог BasicExercises И откройте проект, находящийся в BasicBean02. Щелкните пра­вой кнопкой мыши на элементе AppIicationChtmI и выберите в появившемся контек­стном меню пункт Run.

Свойства типа Bound и constrained

Bound-свойство — это свойство, которое отправляет уведомления в случае изме­нения. Например, если два класса, айв, используют третий класс, с, класс а может захотеть получить уведомление в случае, если класс В Изменит значение некоторого свойства класса с. Свойства, предоставляющие такую услугу, называются Bound- свойствами. Они используют класс Java.Beans.PropertyChangeEvent.

Constrained-свойство похоже на bound-свойство. Рассмотрим пример, который мы упомянули выше, где классы айв используют третий класс, с. Если айв ис­пользуют Constrained-свойство класса с, класс а, например, может наложить вето на внесение изменений в рассматриваемое свойство, которые хочет сделать класс в. Классы данного вида используют еще один класс, который носит название Constrained, Этот класс связан с классом PropertyChangeListener, Который упо­минался в предыдущем абзаце.

В этой книге я не привожу конкретного примера использования bound — и constrained-свойств. Однако JBuilder автоматически генерирует необходимый код для обработки свойств подобного рода. Нужно лишь выбрать закладку Bean среди закладок просмотра файлов, расположенных в нижней части редактора, и перейти на закладку Properties. Создайте хотя бы одно свойство. В правом конце этой зак­ладки вы увидите столбец Binding (Связывание), как показано на рис. 33.11. В выпа­дающем списке вы можете выбрать одно из следующих значений: bound, constrained или none. После того как вы сделали выбор, необходимый код генерируется автома­тически.

При добавлении нового свойства класса с помощью BeansExpress у вас еще есть возможность выбрать требуемый тип связывания, как показано на рис. 33.12.

Более подробное объяснение bound — и constrained-свойств вы можете найти в книге Роберта Инглендера (Robert Englander) "Разработка JavaBean-компонент” (Developing JavaBeans).

рис. 33.11. установка значения binding в bound, constrained или попе с использованием выпадающего списка r jbihlder 7 - ftoocuments and 5ettings∕ebarlie∕jl>∣>rojftc...,* file edit search view project run team wbards jrefactoiy tools window helr
d δ ∙%a 0 *b * u
; hjbegingame ^ ^"^ ⅛ “a ∣ ⅛⅛ * fgfl >∙ ♦ r * h »
,' £
add propetty. i remove property
,untmed30.jpx $ ∙ «project source> ⅛ ∙ untltled30,b⅛., imports j
θ- ∙ framel >∙∙∙ % jframe '■■■ ^framelθ r- ¼ addpropertych: '∙∙ sddvetoabieci -∙ * isdelθteaiidat<
г- ⅜ /pranvoprnnerlj
,'⅛*<jvo zborderlayout!,snurce i dea.gn ' 6ea∏lυml∣ pot j history ∣,g:\jb7\jdkl.3.1∖bin∖java⅛ -classpath "g:\srcjave\jbbootk\javabeenslbe3i

■ » Processfinisneci,

⅛ W⅞,’j.. XiAppllcatiOrtl ιuββd project Iitltllid2β,ft⅛

Рис. 33.12. Во время использования BeansExpressy Вас еще есть возможность выбрать требуемый тип связывания

Резюме

В этой главе мы ознакомились с тем, как создавать простые JavaBean-компо- ненты. Также мы изучили, как пользоваться ключевыми JBuilder-функциями BeansExpress, включая BeanInsight, JavaBean Wizard, а также свойства создания, пе­реименования и управления видимостью.

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

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

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

Глава 34

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

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