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

Настоящее руководство является введением в поддержку в IDE NetBeans для привязок компонентов Bean и привязок данных в приложениях Java.

Содержание

Содержимое на этой странице применимо к IDE NetBeans 7.1, 7.2, 7.3 и 7.4

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

Программное обеспечение или материал Требуемая версия
IDE NetBeans версия 7.1, 7.2, 7.3 или 7.4
Комплект для разработчика на языке Java (JDK) версия 6 или более поздняя

Введение. Привязка компонентов Bean в IDE NetBeans

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

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

Данное руководство является обзором основных аспектов привязки компонентов в среде IDE.

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

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

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

Для настройки примера:

  1. В среде IDE выберите File ("Файл") > New Project ("Создать проект").
  2. Выберите категорию Java и шаблон приложения Java. Нажмите кнопку "Далее".
  3. На странице Name and Location ("Имя и местоположение") мастера выполните следующие операции:
    • Введите NumberSlider в текстовое поле имени проекта;
    • Не устанавливайте флажок "Использовать отдельную папку для хранения библиотек".

      Страница 'Имя и местоположение' мастера создания приложений Java

    • Снимите флажок "Создать главный класс".
  4. Нажмите кнопку Finish ("Готово"), чтобы выйти из мастера и приступить к настройке проекта.
  5. В окне 'Проекты' щелкните правой кнопкой мыши узел проекта NumberSlider и выберите 'Создать' > 'Форма JFrame'.

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

  6. На странице Name and Location ("Имя и местоположение") мастера выполните следующие операции:
    • Введите NumberSliderFrame в поле имени класса.
    • Введите numberslider в поле имени пакета.

    Страница 'Имя и местоположение' мастера создания JFrame

  7. Нажмите кнопку Finish ("Готово") для выхода из мастера и создания формы.

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

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

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

    Форма с ползунком и текстовым полем добавлена к форме

Источник и целевой объект

Теперь, когда пример настроен, можно создать привязку. Но сперва нужно определить, какой компонент будет источником привязки, а какой — целевым объектом. От компонента источника привязки исходит значение для свойства.

При привязке в редакторе графического интерфейса мы инициализируем привязку на целевом объекте и затем объявляем источник в диалоговом окне Bind ("Привязка").

В данном случае, поскольку у JSlider имеется диапазон значений по умолчанию, мы используем его как источник.

Примечание. Привязки могут быть двусторонними (чтение/запись), при этом обеспечивается автоматическое отражение изменение в элементе назначения в исходном коде. Но исходная привязка всегда производится от источника к целевому объекту. См. сведения о режиме обновления в разделе Расширенные свойства привязок.

Для привязки ползунка к текстовому полю выполните следующие действия.

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

    В поле со списком Binding Source ("Источник привязки") можно выбрать следующие значения

  4. Нажмите кнопку "ОК".

Мы только что привязали свойство компонента ползунка value ("значение") к значению текстового поля text ("текст").

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

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

Выберите Run ("Выполнить") > Run File ("Выполнить файл") для выполнения файла.

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

Выполнение приложения

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

В предыдущем разделе мы выполнили привязку двух стандартных компонентов Swing, которые были добавлены к форме из Palette ("Палитра"). Можно выполнить привязку свойств и для других компонентов. Но для этого необходимо выполнить несколько действий, чтобы сделать доступными функции среды IDE по созданию кода привязки для данного компонента. Чтобы сделать функции привязки среды IDE доступными для компонента, можно использовать один из следующих способов:

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

Чтобы добавить компонент к окну Palette ("Палитра"), выполните следующие действия.

  1. Убедитесь, что компонент скомпилирован.
  2. Выберите Tools ("Сервис") > Palette ("Палитра") > Swing/AWT Components ("Компоненты Swing/AWT").
  3. Если для компонента нужно создать новую категорию палитры, выберите New Category ("Создать категорию") и выберите нужное имя перед добавлением компонента.
  4. Щелкните Add from JAR ("Добавить из файла JAR"), Add from Library ("Добавить из библиотеки") или Add from Project ("Добавить из проекта"), после чего завершите работу мастера, чтобы добавить компонент.

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

  1. В окне 'Проект' щелкните правой кнопкой мыши узел для компонента и выберите 'Компилировать файл'.
  2. Перетащите компонент в форму.

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

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

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

Вкладка Advanced ("Дополнительно") диалогового окна состоит из следующих полей:

  • Имя. Позволяет создать имя для привязки, которая обеспечивает более высокий уровень гибкости при управлении привязками. Данное имя добавляется к конструктору привязки, и на него можно сослаться с помощью метода getName() привязки.
  • Режим обновления. Указывается способ синхронизации свойств. Возможны следующие значения:
    • Всегда синхр. (чтение/запись). При каждом внесении изменения в исходный или целевой элемент, другой элемент обновляется.
    • Только чтение из источника (только чтение). Целевой элемент обновляется только при первом задании исходного значения. Изменения, внесенные в источник, отражаются в целевом объекте. Изменения, внесенные в целевой объект, не отражаются в источнике.
    • Чтение из источника один раз (чтение один раз). Целевой элемент обновляется только при исходной привязке целевого и исходного элементов.
  • Update Source When ("Обновить источник когда") (доступно только для свойства text компонентов JTextField и JTextArea). Позволяет выбрать частоту синхронизации свойств.
  • Ignore Adjusting ("Игнорировать подстройку") (доступно свойству value JSlider; свойству selectedElement JTable и JList; а также свойству selectedElements JTable и JList). Если установлен этот флажок, то изменения, внесенные в одно из свойств, не отражаются другим свойством, пока пользователь не завершит вносить изменение. Например, когда пользователь приложения перетаскивает ползунок, значение свойства, к которому привязано свойство ползункаvalue, обновляется только тогда, когда пользователь отпускает кнопку мыши.
  • Средство преобразования. Если привязка включает в себя свойства с различными типами данных, вы можете указать код для преобразования значений между типами. Библиотека привязок компонентов обрабатывает многие часто используемые преобразования, но для других комбинаций типов свойств может быть необходимо предоставить собственные преобразователи. Такие преобразователи должны расширять класс org.jdesktop.beansbinding.Converter.

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

    Ниже приведен список преобразований, для которых не нужно специального преобразователя:

    • BigDecimal в String, String в BigDecimal
    • BigInteger в String, String в BigInteger
    • Boolean в String, String в Boolean
    • Byte в String, String в Byte
    • Char в String, String в Char
    • Double в String, String в Double
    • Float в String, String в Float
    • Int в String, String в Int
    • Long в String, String в BigDecimal
    • Short в String, String в Short
    • Int в Boolean, Boolean в Int
  • Средство проверки. Позволяет указать код для проверки изменения целевого значения свойства перед распространением этого изменения обратно к свойству источника. Например, средство проверки можно использовать, чтобы убедиться, что значение целочисленного свойства находится в определенном диапазоне.

    Средства проверки должны расширять класс org.jdesktop.beansbinding.Validator.
    В раскрывающемся списке Validator ("Средство проверки") перечислены средства проверки, которые добавлены как компоненты к создаваемой форме. Код проверки также можно добавить напрямую, нажав кнопку многоточия (...) и выбрав Custom Code ("Особый код") из раскрывающегося списка Select Converter Property Using ("Выбрать средство проверки, используемое свойством").

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

Примечание. Чтобы лучше понять классы и методы, упомянутые выше, можно получить доступ к документации по Javadoc привязок компонентов Beans напрямую из IDE. Выберите Help ("Справка") > Javadoc ("Ссылки на документацию Java") > Beans Binding ("Привязка компонентов"). В открывшемся окне браузера щелкните org.jdesktop.beansbinding, чтобы получить доступ к документации для этих классов.

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

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

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

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

Создание сущностных классов

Чтобы создать сущностные классы для представления таблицы, которая будет привязана к JTable, выполните следующие действия.

  1. В окне 'Проекты' щелкните правой кнопкой мыши проект и выберите 'Создать' > 'Другие', выберите категорию 'Сохраняемость' и выберите 'Классы сущностей' в шаблоне 'База данных'.
  2. На странице Database Tables ("Таблицы базы данных") мастера выберите подключение к базе данных.
  3. После того как столбец Available Tables ("Доступные таблицы") заполнен, выберите таблицы, которые следует использовать в приложении, и нажмите кнопку Add ("Добавить"), чтобы переместить их в столбец Selected Tables ("Выбранные таблицы"). Нажмите кнопку "Далее".

    Выбраны таблицы CUSTOMER и DISCOUNT_CODE

  4. На странице мастера Entity Classes ("Сущностные классы") убедитесь, что установлены флажки Generate Named Query Annotations for Persistent Fields ("Создать аннотации именованных запросов для полей ") и Create Persistence Unit ("Создать блок сохранения состояния").

    Страница 'Классы сущностей' мастера создания классов сущностей на основе баз данных.

  5. Внесите любые необходимые изменения в имена и местоположение созданных классов.
  6. Нажмите кнопку "Завершить".

    Узлы для сущностных классов можно будет увидеть в окне Projects ("Проекты").

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

В данном разделе показано, как можно выполнить привязку данных к компонентам Swing JTable, JList и JComboBox.

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

  1. Откройте окно "Services".
  2. Подключитесь к базе данных, содержащей таблицу, которую следует добавить к форме. (Для подключения к базе данных щелкните правой кнопкой мыши узел для подключения к базе данных и выберите 'Подключение').

    Примечание. В этом учебном курсе используется тестовая база данных sample [app on App]. Для подключения к этой базе данных откройте окно 'Службы', разверните узел 'Базы данных', щелкните правой кнопкой мыши узел подключения к базе данных (jdbc:derby://localhost:1527/sample[app on APP]) и выберите пункт 'Подключение' в контекстном меню.
    При появлении соответствующего запроса укажите значение app в качестве идентификатора пользователя и то же значение app в качестве пароля.

  3. Разверните узел для подключения и разверните его узел Tables ("Таблицы").
  4. Перетащите узел для таблицы на форму и нажмите клавишу Ctrl при завершении перетаскивания таблицы.

    Будет создана таблица JTable, и ее столбцы будут привязаны к столбцам в таблице базы данных.

Чтобы привязать таблицу базы данных к существующему компоненту JTable, выполните следующие действия.

  1. Щелкните правой кнопкой мыши компонент в конструкторе графических интерфейсов и выберите Bind ("Привязка") > elements ("элементы").

    Выбранные значения в диалоговом окне "Привязка".

  2. Нажмите кнопку Import Data to Form ("Импортировать данные в форму"). В диалоговом окне Import Data to Form ("Импортировать данные в форму") выберите таблицу данных, к которой следует привязать свои компоненты. Нажмите кнопку "ОК".
  3. Из поля со списком Binding Source ("Источник привязки") выберите элемент, представляющий результирующий список сущностного класса. Например, если сущностный класс называется Customer.java, объект списка будет создан как customerList.

    Выбран источник привязки

  4. Значением выражения привязки оставьте null.
  5. При наличии столбцов баз данных, которые не следует включать в JTable, выберите эти столбцы в списке Selected ("Выбранные") и переместите их в список Available ("Доступные").
  6. Выберите вкладку Advanced ("Дополнительные") для расширенной настройки привязки. Там, например, можно указать средство проверки или преобразователь, либо поведение в случае, если источник привязки не читается или имеет значение null.
  7. Нажмите кнопку "ОК".

Для привязки данных к компоненту JList выполните следующие действия.

  1. Щелкните правой кнопкой мыши компонент в конструкторе графических интерфейсов и выберите Bind ("Привязка") > elements ("элементы").
  2. Нажмите кнопку Import Data to Form ("Импортировать данные в форму"). В диалоговом окне Import Data to Form ("Импортировать данные в форму") выберите таблицу данных, к которой следует привязать свои компоненты. Нажмите кнопку "ОК".
  3. Из поля со списком Binding Source ("Источник привязки") выберите элемент, представляющий результирующий список сущностного класса. Например, если сущностный класс называется Customer.java, объект списка будет создан как customerList.

    Выбран источник привязки

  4. Значением выражения привязки оставьте null.
  5. В раскрывающемся списке Display Expression ("Отображаемое выражение") выберите свойство, представляющее столбец базы данных, содержащий значения, которые необходимо отобразить в списке.
  6. Выберите вкладку Advanced ("Дополнительные") для расширенной настройки привязки.
  7. Нажмите кнопку "ОК".

Для привязки данных к компоненту JComboBox выполните следующие действия.

  1. Щелкните правой кнопкой мыши поле со списком и выберите "Bind > elements".
  2. Нажмите кнопку Import Data to Form ("Импортировать данные в форму"). В диалоговом окне Import Data to Form ("Импортировать данные в форму") выберите таблицу данных, к которой следует привязать свои компоненты. Нажмите кнопку "ОК".
  3. Из поля со списком Binding Source ("Источник привязки") выберите элемент, представляющий результирующий список сущностного класса. Например, если сущностный класс называется Customer.java, объект списка будет создан как customerList.

    Выбран источник привязки

  4. Оставьте значением Binding Expression ("Выражение привязки") null и нажмите кнопку "OК".
  5. Вновь щелкните правой кнопкой мыши поле со списком и выберите "Bind > selectedItem".
  6. Выполните привязку к свойству, на котором должен сказываться выбор пользователя

    Выбран источник привязки

  7. Нажмите кнопку "ОК", чтобы сохранить изменения.

У библиотеки привязки компонентов (версии 1.2.1 и более ранних) нет класса DetailBinding, позволяющего указать, как следует извлекать отображаемые значения для 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;
           }
            })

Пользовательский визуализатор ячеек

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

Специальные свойства привязок

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

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

Элемент Свойство Описание
AbstractButton выбрано Выбранное состояние кнопки.
JComboBox selectedItem Выбранный элемент JComboBox.
JSlider значение Значение 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) или после потери фокуса.

Дополнительные сведения

get support for the NetBeans

Support


By use of this website, you agree to the NetBeans Policies and Terms of Use. © 2013, Oracle Corporation and/or its affiliates. Sponsored by Oracle logo