Статьи

Как создать и импортировать компонент JavaBean в IDE NetBeans (часть 1)

Эта статья представляет собой простое введение в создание и использование компонентов JavaBean в IDE NetBeans.

Зачем читать этот учебник?

В среде IDE NetBeans имеется действительно интуитивно понятная панель (палитра компонентов), которая позволяет пользователям легко создавать и создавать прототипы компонентов без необходимости писать много кода. Если у вас есть визуальный компонент, и вы хотите сделать его как можно более простым для разработчиков, добавить его на эту панель на удивление легко. Вот как мы это сделали …

Учебник разделен на две части.

  • В части 1 показано, как превратить существующие стандартные компоненты Swing в компонент JavaBean.
  • Во второй части описывается, как после создания JavaBean импортировать в Matisse GUI Builder.

Часть 1 — Создание JavaBean

Вступление

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

Преобразование компонента Swing в JavaBean

В моем примере PdfHelpPanel расширяет JPanel, однако для создания JavaBean все, что вам нужно сделать, это расширить JComponent или любой подкласс JComponent.

Единственное предостережение в том, что ваш класс должен реализовывать простой конструктор. Это конструктор, который принимает нулевые аргументы. Это потому, что когда вы создаете экземпляр JavaBean (то есть когда вы добавляете его в форму через палитру Матисса), необходим базовый конструктор, который можно вызывать.

Вот так выглядит моя пустая PdfHelpPanel.

public class PdfHelpPanel extends JPanel implements Serializable {public PdfHelpPanel() {}}

Чтобы конечный пользователь мог настраивать ваш JavaBean извне, вам нужно добавить в свой компонент Swing свойства, соответствующие архитектуре JavaBean — именно здесь поле доступно через соответствующие методы получения и установки. Например, фрагмент кода ниже предоставит свойство field

private int field;public void setField(int field) {this.field = field;}public int getField() {return field;}

В моем случае я только создаю очень простой JavaBean, который содержит одно свойство. Это массив типа String, который будет содержать список файлов, которые появятся в списке файлов пользователя.

Добавление этого свойства в мой существующий класс PdfHelpPanel дает следующий класс.

public class PdfHelpPanel extends JPanel implements Serializable {public PdfHelpPanel() {}/**  * fileLocations property which can be accessed through the * JavaBean architecture.  */private String[] fileLocations = {""};/** * Sets the locations of the files which will be displayed in the File * List. *  * @param fileLocations Array of locations for the PDF files.<br/><br/> *  * Elements can be: -  * <ul> * <li>An absolute file path of a local location on disk</li> * <li>A directory path which will be scanned recursively,  * adding all PDFs found to the file list</li> * <li>A URL</li> * <li>A classpath location</li> * </ul> *  * Examples: -  * <ul> * <li>"C:/file.pdf"</li> *<li>"C:/PdfFiles/"</li> * <li>"http://www.jpedal.org/jpedal.pdf"</li> * <li>"jar:/com/idrsolutions/pdf/pdfhelp/res/jpedal.pdf"</li> * </ul> */public void setFileLocations(String[] fileLocations) {/** * Add code here to parse fileLocations list, and  * add any valid locations to the File List */}}

Создание реализации BeanInfo

Однако простое использование JavaBean в наиболее упрощенной форме редко является приемлемым решением. Это потому, что вы не можете контролировать, какие свойства доступны конечному пользователю. NetBeans просто предоставит все свойства вашего компонента Swing, которые соответствуют архитектуре JavaBean, независимо от того, хотите ли вы, чтобы все эти свойства были доступны или нет.

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

В моем случае это не то, что я хочу. Я пытаюсь сделать PdfHelpPanel настолько простым, насколько это возможно, чтобы разработчики добавляли свои существующие приложения Swing, поэтому я хочу предоставить только минимальное количество свойств. На самом деле, я хочу предоставить только одно свойство — свойство fileLocations.

Чтобы контролировать, какие свойства доступны для GUI-компоновщика, а какие нет, нам нужно связать реализацию интерфейса BeanInfo с нашим JavaBean-компонентом.

Существует два основных способа создания реализации BeanInfo: реализовать класс «вручную» с помощью редактора кода или с помощью редактора BeanInfo, поставляемого с NetBeans. Из двух я определенно предпочитаю более поздний вариант. После выпуска NetBeans 6.1 функциональность Java Beans, которая была удалена в NetBeans 6.0, была восстановлена ​​с некоторыми новыми функциями. Статья об использовании редактора BeanInfo представлена здесь

Как упоминалось ранее, я хочу скрыть все свойства, кроме fileLocations. Это означает, что в моем PdfHelpPanelBeanInfo единственным свойством PropertyDescriptor, которое я хочу вернуть в своем массиве PropertyDescriptor из метода getPropertyDescriptors (), является свойство fileLocations, которое связано с методом установки setFileLocations. Полный список классов PdfHelpPanelBeanInfo показан ниже.

public class PdfHelpPanelBeanInfo extends SimpleBeanInfo {                   private static final int PROPERTY_locations = 0;private static final int defaultPropertyIndex = -1;private static final int defaultEventIndex = -1;public BeanDescriptor getBeanDescriptor() {BeanDescriptor beanDescriptor = new BeanDescriptor(PdfHelpPanel.class, null);return beanDescriptor;}public PropertyDescriptor[] getPropertyDescriptors() {PropertyDescriptor[] properties = new PropertyDescriptor[1];try {properties[PROPERTY_locations] = new PropertyDescriptor("fileLocations",PdfHelpPanel.class, null,"setFileLocations");} catch (IntrospectionException e) {e.printStackTrace();}return properties;}public EventSetDescriptor[] getEventSetDescriptors() {EventSetDescriptor[] eventSets = new EventSetDescriptor[0];return eventSets;}public MethodDescriptor[] getMethodDescriptors() {MethodDescriptor[] methods = new MethodDescriptor[0];return methods;}public int getDefaultPropertyIndex() {return defaultPropertyIndex;}public int getDefaultEventIndex() {return defaultEventIndex;}}

Создание распространяемого JAR

После того, как вы реализовали свой компонент JavaBean и соответствующий ему класс BeanInfo, вы готовы создать свой JAR-файл. Чтобы отметить тот факт, что PdfHelpPanel является JavaBean, и позволить приложениям-разработчикам, таким как NetBeans, уловить этот факт, необходимо сделать запись в файле манифеста JAR. Если, как и я, вы используете ANT для создания своих JAR-файлов, вы можете очень легко добавить необходимую информацию. В рамках задачи «jar» -> «manifest» вы можете пометить определенный класс как JavaBean. Фрагмент ANT ниже показывает, как в моем примере я отмечаю класс PdfHelpPanel.

<jar destfile="${dist.dir}/${pdfhelp.jar}" index="true" basedir="${bin.dir}">  <manifest>     <attribute name="Main-Class" value="${default.class}" />     <section name="PdfHelpPanel.class">          <attribute name="Java-Bean" value="true"/>     </section>  </manifest></jar>

 

Этот урок будет завершен в другой статье завтра!