corner imagecorner image
FeaturesPluginsDocs & SupportCommunityPartners

Привязки компонентов и данных в настольном приложении

Данное руководство представляет собой вводный обзор привязок компонентов и данных для настольных приложений на Java в среде IDE NetBeans 6.0.

Содержание

Содержимое на этой странице относится к среде IDE NetBeans 6.0 и 6.1

Для работы с этим руководством требуется программное обеспечение и ресурсы, перечисленные ниже.

Программное обеспечение или ресурс Требуемая версия
Среда IDE NetBeans версия 6.1 или
версия 6.0
Комплект для разработчика на языке Java (JDK) версия 6 или
версия 5

Введение: привязка компонентов в среде IDE NetBeans 6.0

До выхода библиотеки привязки компонентов процесс связывания элементов UI с базами данных или организации хранения значений свойств компонентов с их синхронизацией был несколько громоздким. Так, отображение данных из стандартной базы данных в элементе "JTable" требовало ручного создания служебных классов для обработки соединения между базой данных и этим элементом. Для хранения значений различных свойств компонентов с их синхронизацией (например, значение "JTextField" с визуализацией элемента) приходилось вручную составлять код для прослушивания и обработки событий.

Библиотека привязки компонентов упрощает и стандартизирует все эти операции. От разработчика требуется лишь написать несколько строк программы, определяющих свойства элементов, значения которых должны сохраняться и синхронизироваться, а все остальные действия будут выполнены библиотекой. В среде IDE NetBeans функциональность привязки компонентов интегрирована в GUI Builder, что позволяет быстро проверить поведение написанного приложения после разработки его визуального представления.

В этом руководстве представлен обзор основных аспектов привязки компонентов в среде IDE. Для изучения конкретных примеров по большинству из этих функций см. руководство "Создание настольного приложения на Java для работы с базой данных".

Привязка свойств к другим свойствам

По своей сути привязка компонентов является способом соединения свойств компонентов без использования кода для прослушивания и обработки событий.

Для иллюстрации концепции привязки компонентов и поддержки этой техники в среде IDE рассмотрим простой пример, в котором при изменении положения ползунка пользователем в соседнем текстовом поле изменяется численное значение.

Для работы с примером:

  1. В среде IDE выберите "File > New Project".
  2. Выберите категорию "Java", а затем выберите шаблон приложения на Java. Нажмите кнопку "Next".
  3. На странице мастера "Name and Location" выполните следующие действия:
    • Введите имя проекта NumberSlider.
    • Не устанавливайте флажок "Use Dedicated Folder for Storing Libraries". (При использовании среды IDE NetBeans 6.0 эта возможность недоступна.)
    • Оставьте флажок "Set as Main Project" установленным.
    • Снимите флажок "Create Main Class".
    На рисунке показана страница "Name and Location" мастера создания приложения на Java с заполненной информацией о проекте.
  4. Для выхода из мастера и настройки проекта нажмите кнопку "Finish".
  5. В окне "Projects" щелкните правой кнопкой мыши узел проекта "NumberSlider" и выберите "New > JFrame Form".

    (Если пункт "JFrame Form" в меню "New" недоступен, выберите "Other". После этого в мастере создания файла выберите категорию "Swing GUI Forms", а затем выберите шаблон "JFrame Form".)

  6. На странице мастера "Name and Location" выполните следующие действия:
    • Введите имя класса NumberSliderFrame.
    • Введите имя пакета numberslider.
    На рисунке показана страница "Name and Location" мастера "New JFrame" с заполненной информацией о файле.
  7. Для выхода из мастера и создания формы нажмите кнопку "Finish".

    В области изменения открывается NumberSliderForm.java в режиме проектирования.

  8. В разделе "Swing Controls" окна "Palette" перетащите элемент ползунка в область проектирования. (Если окно "Palette" не открыто, выберите "Window > Palette".)
  9. В окне "Palette" перетащите элемент текстового поля в область проектирования.

    Пример формы, полученной в результате этих действий, представлен на рисунке ниже. Точная выверка расположения элементов для этого примера существенного значения не имеет.

    На рисунке показана форма, к которой добавлен ползунок и текстовое поле.

Исходный и целевой элементы

Теперь, после настройки примера, можно приступить к созданию привязки. Однако сначала необходимо определить, какой элемент будет в привязке исходным, а какой – целевым. Исходным элементом привязки называется первоначальный источник значения свойства.

При связывании в GUI Editor привязка инициируется в целевом элементе, после чего исходный элемент объявляется в диалоговом окне "Bind".

В рассматриваемом случае элемент "JSlider" уже имеет диапазон значений по умолчанию, поэтому он используется в качестве исходного элемента.

Примечание: Привязка может быть двунаправленной (чтение/запись); при этом изменения в целевом элементе автоматически отражаются в исходном элементе. Однако первоначальное связывание всегда направлено от исходного элемента к целевому. Для получения информации о режиме обновления см. раздел Расширенная настройка привязки.

Для привязки ползунка к текстовому полю:

  1. Щелкните правой кнопкой мыши элемент текстового поля и выберите "Bind > text" для открытия диалогового окна "Bind".
  2. В поле списка "Binding Source" выберите jSlider1.
  3. В поле списка "Binding Expression" выберите value int, как показано на рисунке ниже. На рисунке показаны значения, выбираемые в поле списка "Binding Source".
  4. Нажмите кнопку "OK".

Итак, теперь свойство компонента value ползунка привязано к значению text текстового поля.

В области проектирования текстовое поле должно содержать значение 50. Это значение отражает то, что ползунок находится в среднем положении, а диапазон значений по умолчанию для ползунка составляет от 0 до 100.

Теперь можно запустить приложение и проверить работу привязки.

Для выполнения проекта:

  1. Выберите "Run > Run Main Project".
  2. В диалоговом окне "Run Project" нажмите кнопку "OK" для подтверждения numberslider.NumberSliderForm в качестве главного класса.

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

На рисунке показано работающее приложение с передвинутым ползунком и измененным значением в текстовом поле.

Привязка пользовательских компонентов

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

  • Для обеспечения возможности добавления этого компонента к форме его следует сначала добавить к палитре элементов, аналогично добавлению стандартного компонента Swing.
  • Добавьте класс компонента к проекту и скомпилируйте компонент.

Для добавления компонента к окну "Palette":

  1. Проверьте, что компонент скомпилирован.
  2. Выберите "Tools > Palette Manager".
  3. При необходимости создания новой категории палитр для компонента выберите "New Category" и перед добавлением компонента введите требуемое имя.
  4. Выберите "Add from JAR", "Add from Library" или "Add from Project" и для добавления компонента запустите мастер.

Для добавления компонента из проекта:

  1. В окне "Projects" щелкните правой кнопкой мыши узел для компонента и выберите "Compile File".
  2. Перетащите компонент в форму.

    Теперь компонент должен отображаться в окне "Inspector". После этого можно вызвать диалоговое окно "Bind" для любого из свойств компонента.

Расширенная настройка привязки

В приведенном выше примере была продемонстрирована простая привязка с некоторыми настройками по умолчанию. Однако в некоторых случаях возникает необходимость в другом поведении привязки. В этом случае можно использовать вкладку "Advanced" в диалоговом окне "Binding".

Вкладка "Advanced" этого диалогового окна содержит следующие поля:

  • Name. Позволяет присвоить привязке имя, что обеспечивает дополнительную гибкость при управлении привязками. Имя добавляется к конструктору привязки и может быть использовано в методе getName().
  • Update Mode. Указывает способ синхронизации свойств. Возможные значения:
    • Always sync (read/write). При каждом изменении исходного или целевого элемента второй элемент обновляется.
    • Only read from source (read only). Целевой элемент обновляется только при первоначальной установке исходного элемента. Изменения исходного элемента распространяются на целевой элемент. Изменения целевого элемента не отражаются в исходном элементе.
    • Read from source once (read once). Целевой элемент обновляется только при первоначальном связывании целевого и исходного элемента.
  • Update Source When (доступно только для свойства text элементов "JTextField" и "JTextArea"). Позволяет выбрать частоту синхронизации свойств.
  • Ignore Adjusting (доступно для свойства value элемента "JSlider", для свойства selectedElement элементов "JTable" и "JList", а также для свойства selectedElements этих двух элементов). Если этот флажок установлен, любые изменения одного свойства не распространяются на другое свойство до завершения процесса внесения изменений пользователем. Например, если пользователь приложения изменяет положение ползунка, то значение свойства, к которому привязано значение value этого ползунка, обновляется только в тот момент, когда пользователь отпускает кнопку мыши.
  • Converter. Если привязка затрагивает свойства с различными типами данных, можно указать код для преобразования значений в соответствующие типы. Библиотека привязки компонентов обрабатывает большое количество часто используемых преобразований, однако для различных комбинаций типов свойств могут потребоваться собственные преобразования. Такие преобразования должны расширять класс org.jdesktop.beansbinding.Converter.

    Раскрывающийся список "Converter" заполняется любыми преобразованиями, добавленными в форму в качестве компонентов. Можно также добавить код преобразования напрямую путем нажатия кнопки с многоточием (...) и выбора "Custom Code" из раскрывающегося списка "Select Converter Property Using".

  • Validator. Позволяет указать код для проверки изменения целевого значения свойства перед его распространением на исходное свойство. Например, эту функцию можно использовать для проверки того, что целое значение свойства находится в пределах определенного диапазона.

    Такие проверки должны расширять класс org.jdesktop.beansbinding.Validator.

    Раскрывающийся список "Validator" заполняется любыми проверками, которые были добавлены в форму в качестве компонентов. Можно также непосредственно добавить код проверки путем нажатия кнопки с многоточием (...) и выбора "Custom Code" из раскрывающегося списка "Select Validator Property Using".

  • Null Source Value. Позволяет указать другое значение, которое будет использоваться в случае обнаружения значения null исходного свойства при попытке связывания. Это поле соответствует методу setSourceNullValue() класса org.jdesktop.beansbinding.Binding.
  • Unreadable Source Value. Позволяет указать другое значение, которое будет использоваться в случае невозможности разрешения выражения привязки при попытке связывания. Это поле соответствует методу setSourceUnreadableValue() класса org.jdesktop.beansbinding.Binding.

Примечание: Для получения более полного представления о перечисленных выше классах и методах см. документацию Javadoc по связыванию компонентов непосредственно в среде IDE. Выберите "Help > Javadoc References > Beans Binding". В открывшемся окне обозревателя щелкните ссылку org.jdesktop.beansbinding для перехода к документации по этим классам.

Привязка данных к элементам

После создания новой формы Java и добавления к ней элементов можно создать код для привязки этих элементов к данным. В IDE можно быстро настроить привязку данных к элементам "Swing JTable", "JList" и "JComboBox".

Перед привязкой элемента к данным из базы данных необходимо выполнить следующие действия:

  • Подключитесь к базе данных в среде IDE.
  • Добавьте элемент к форме в GUI Builder.
  • Создайте классы, представляющие таблицы базы данных, к которым требуется выполнить привязку. Описание действий по созданию классов объектов для привязки данных к элементу приводятся ниже.

Создание классов объектов

Для создания классов объектов для представления базы данных, которую требуется привязать к JTable:

  1. В окне "Projects" щелкните правой кнопкой мыши проект и выберите "New > Other". Далее выберите категорию "Persistence", а затем – "Entity Classes" из шаблона "Database".
  2. На странице "Database Tables" мастера выберите подключение к базе данных (Database Connection).
  3. После заполнения столбца "Available Tables" выберите таблицы, которые требуется использовать в приложении, и нажмите кнопку "Add" для их перемещения в столбец "Selected Tables". Нажмите кнопку "Next". На рисунке показана страница "Database Tables" мастера "New Entity Classes from Database" с выбранными таблицами CUSTOMER и DISCOUNT_CODE.
  4. Проверьте, что на странице мастера "Entity Classes" установлен флажок "Generate Named Query Annotations for Persistent Fields".
  5. Выполните все требуемые настройки имен создаваемых классов и их местоположений. На рисунке показана страница "Entity Classes" мастера "New Entity Classes from Database".
  6. Нажмите кнопку "Create Persistence Unit".
  7. В диалоговом окне "Create Persistence Unit" проверьте следующее:
    • Для параметра "Persistence Library" выбрано значение "TopLink".
    • Для параметра "Table Generation Strategy" выбрано значение "None".
    • На рисунке показано диалоговое окно "Create Persistence Unit".
  8. Нажмите кнопку "Finish".

    В окне "Projects" должны появиться узлы, соответствующие классам объектов.

Привязка элементов к компонентам, представляющим данные

Для привязки данных к элементу "JTable":

  1. Щелкните правой кнопкой мыши элемент в GUI Builder и выберите "Bind > elements".
  2. Нажмите кнопку "Import Data to Form". В диалоговом окне "Import Data to Form" выберите таблицу базы данных, с которой требуется связать элементы. Нажмите кнопку "OK".
  3. В поле списка "Binding Source" выберите элемент, представляющий список результатов для класса объектов. Например, если класс объектов называется Customer.java, то список объектов будет иметь имя customerList.
  4. В поле "Binding Expression" оставьте значение null.
  5. Если имеются столбцы базы данных, которые не должны отображаться в элементе "JTable", выберите эти столбцы в списке "Selected" и переместите их в список "Available".
  6. Для дальнейшей настройки привязки перейдите на вкладку "Advanced". На этой вкладке можно настроить проверку или преобразование, а также определить поведение в случае нулевого или недоступного значения исходного элемента привязки.
  7. Нажмите кнопку "OK".

Для привязки данных к элементу "JList":

  1. Щелкните правой кнопкой мыши элемент в GUI Builder и выберите "Bind > elements".
  2. Нажмите кнопку "Import Data to Form". В диалоговом окне "Import Data to Form" выберите таблицу базы данных, с которой требуется связать элементы. Нажмите кнопку "OK".
  3. В поле списка "Binding Source" выберите элемент, представляющий список результатов для класса объектов. Например, если класс объектов называется Customer.java, то список объектов будет иметь имя customerList.
  4. В поле "Binding Expression" оставьте значение null.
  5. В раскрывающемся списке "Display Expression" выберите свойство, представляющее столбец базы данных со значениями, которые должны отображаться в списке.
  6. Для дальнейшей настройки привязки перейдите на вкладку "Advanced".
  7. Нажмите кнопку "OK".

Можно также настроить привязку данных к элементу "JComboBox". Однако в Beans Binding 1.2.1 не существует класса "DetailBinding", который позволяет определить способ получения значений display для элемента "JComboBox". Поэтому необходимо создать соответствующий код самостоятельно. Одной из возможностей является создание средства визуализации ячейки (см. ниже).

Для привязки данных к элементу "JComboBox":

  1. Выберите поле списка.
  2. На вкладке "Properties" окна "Properties" выберите свойство средства визуализации.
  3. Нажмите кнопку с многоточием (...).
  4. В поле списка в верхней части редактора свойств выберите "Custom Code".
  5. В текстовой области введите код, сходный с приведенным ниже (где jComboBox1 является именем экземпляра "JComboBox", MyEntityClass является классом объектов, и getPropertyFromMyEntityClass() – методом получения для свойства в классе объектов, для которого выполняется привязка).
jComboBox1.setRenderer(new DefaultListCellRenderer() {
           @Override
           public Component getListCellRendererComponent(
                   JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
               super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
               if (value instanceof MyEntityClass) {
                   MyEntityClass mec = (MyEntityClass)value;
                   setText(mec.getPropertyFromMyEntityClass());
               }
               return this;
           }
         })

Примечание: Для быстрого создания целого рабочего приложения с функциями CRUD (Create, Read, Update, Delete – создание, чтение, обновление и удаление) также можно воспользоваться мастером "New Java Desktop Application". Однако рекомендуется создавать все классы объектов заранее для обеспечения правильности учета в них всех отношений между объектами.

Особые свойства привязки

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

Ниже представлен список синтетических свойств, добавляемых библиотеками привязки компонентов:

Элемент Свойство Описание
AbstractButton selected Выбранное состояние кнопки.
JComboBox selectedItem Выбранный элемент компонента "JComboBox".
JSlider value Значение JSlider; уведомление обо всех изменениях.
value_IGNORE_ADJUSTING Аналогично "value", но без уведомления об изменении при регулировке значения ползунка.
JList selectedElement Выбранный элемент компонента "JList"; уведомление обо всех изменениях. Если имеется "JListBinding" с "JList" в качестве целевого элемента, о выбранном элементе сообщается как об элементе из исходного списка привязки. В противном случае о выбранном элементе сообщается как об объекте из модели списка. Если ничего не выбрано, свойство рассматривается как имеющее значение null.
selectedElements Список, содержащий выбранные элементы компонента "JList"; уведомление обо всех изменениях. Если имеется "JListBinding" с "JList" в качестве целевого элемента, о выбранных элементах сообщается как об элементах из исходного списка привязки. В противном случае о выбранных элементах сообщается как об объектах из модели списка. Если ничего не выбрано, свойство рассматривается как пустой список.
selectedElement_IGNORE_ADJUSTING Аналогично "selectedElement", но без уведомления об изменении при обновлении выбора списка.
selectedElements_IGNORE_ADJUSTING Аналогично "selectedElements", но без уведомления об изменении при обновлении выбора списка.
JTable selectedElement Выбранный элемент компонента "JTable"; уведомление обо всех изменениях. Если имеется "JTableBinding" с "JTable" в качестве целевого элемента, о выбранном элементе сообщается как об элементе из исходного списка привязки. В противном случае о выбранном элементе сообщается как о карте, ключи которой составлены из строки "column" плюс индекс столбца, а значения являются значениями модели для этого столбца. Пример: {column0=column0value, column1=column1value, ...} Если ничего не выбрано, свойство рассматривается как имеющее значение null.
selectedElements Список, содержащий выбранные элементы компонента "JTable"; уведомление обо всех изменениях. Если имеется "JTableBinding" с "JTable" в качестве целевого элемента, о выбранных элементах сообщается как об элементах из исходного списка привязки. В противном случае о каждом выбранном элементе сообщается как о карте, ключи которой составлены из строки "column" плюс индекс столбца, а значения являются значениями модели для этого столбца. Пример: {column0=column0value, column1=column1value, ...} Если ничего не выбрано, свойство рассматривается как пустой список.
selectedElement_IGNORE_ADJUSTING Аналогично "selectedElement", но с уведомлением об изменении при обновлении выбора таблицы.
selectedElements_IGNORE_ADJUSTING Аналогично "selectedElements", но без уведомления об изменении при обновлении выбора таблицы.
Элемент "JTextComponent" (в том числе подклассы "JTextField", "JTextArea" и "JEditorPane") text Текстовое свойство элемента "JTextComponent"; уведомление обо всех изменениях (в том числе ввод данных пользователем).
text_ON_FOCUS_LOST Текстовое свойство элемента "JTextComponent"; уведомление об изменении только в случае потери фокусировки на элементе.
text_ON_ACTION_OR_FOCUS_LOST Текстовое свойство элемента "JTextComponent"; уведомление об изменении только в случае сообщения элементом об actionPerformed или при потере фокусировки на элементе.

Дополнительная информация

Для ознакомления с более общим обзором работы с GUI Builder в среде IDE см. Введение в разработку графического интерфейса.

Для получения информации об использовании шаблона проекта настольного приложения на Java с целью создания приложения для работы с базой данных с основным/подробным представлением см. Создание настольного приложения на Java для работы с базой данных.

Для получения дополнительных сведений о привязке компонентов см. страницу проекта "Beans Binding" на java.net.

Для получения общей информации об элементах JavaBeans см. Руководство по компонентам Java Beans.

Для ознакомления с общими советами и рекомендациями по использованию GUI Builder в среде IDE NetBeans см. часто задаваемые вопросы по GUI Editor и блог Патрика Кигэна (Patrick Keegan).

Bookmark this page

del.icio.us furl simpy slashdot technorati digg
Companion
Projects:
MySQL Database Server   GlassFish Community: an Open Source Application Server   Open Solaris  Open JDK: an Open SourceJDK   Mobile & Embedded Community     Sponsored by 
Sponsored by Sun Microsystems