В этом уроке в приложение My Company Directory будет реализована возможность добавлять новые записи сотрудников.
Поскольку при добавлении нового сотрудника в приложении выполняются более сложные и динамичные действия, это упражнение также сложнее предыдущих, поскольку вам потребуется вручную вносить некоторые изменения в исходный код. Кроме того, в этом упражнении показаны некоторые расширенные возможности объектов данных. Здесь на творческом примере проиллюстрированы такие способы применения редакторов связей и объектов данных, при которых они наилучшим образом выполняют поставленные задачи.
В приведенном ниже списке перечислены обязательные функции приложения:
В примере Web-службы предусмотрена служба createNewFullEmployeeRecord, предоставляющая новую, пустую запись о сотруднике, которая заполняется следующим доступным номером ИД сотрудника. Эту пустую запись можно заполнить сведениями о новом сотруднике и отправить обратно в Web-службу.

Поскольку для полей подробной информации и кнопки Обновить требуется переключение режимов (как для обновления, так и для создания нового сотрудника), они должны быть связаны в разное время с двумя различными объектами данных. Для того чтобы обеспечить эту возможность, нужно добавить простой объект данных с именем switchingDataObject. Простой объект данных будет применяться для переключения привязки текстовых полей между selectedEmployeeRecord и newEmployeeRecord.
Несмотря на то, что все поля подробных сведений о сотрудниках уже связаны с selectedEmployeeRecord, теперь их нужно связать с switchingDataObject. После связывания полей можно динамически переключаться между объектами данных для полей в зависимости от того, редактируете ли вы существующую запись о сотруднике или добавляете новую запись.
Приведенный ниже метод updateMode() проверяет значение флага режима и изменяет соответствующим образом поведение приложения. По умолчанию булевский флаг isNewMode принимает значение false, а метод updateMode() активирует таблицу сотрудников и поле фильтра, а также задает текст "Обновить" в кнопке Обновить. Если isNewMode принимает значение true, то таблица сотрудников неактивна и выделение очищено, поле фильтра неактивно, а в кнопке Обновить отображается текст "Добавить".
private boolean isNewMode = false;
private void updateMode() {
if (isNewMode) {
getEmployeesTable().clearSelection();
getEmployeesTable().setEnabled(false);
getFilterField().setEditable(false);
getUpdateCreateButton().setText("Add");
} else {
getEmployeesTable().setEnabled(true);
getFilterField().setEditable(true);
getUpdateCreateButton().setText("Update");
}
}
В этом шаге добавляется код события, выполняемого при нажатии кнопки Создать. С помощью события switchingDataObject использует объект данных newEmployeeRecord, присваивает флагу режима значение "new" и запускает метод updateMode(), добавленный в предыдущем шаге.
В предыдущем уроке мы программировали применение кнопкой Обновить метода modifyEmployee в Web-службе. Это действие реализовано как SwingDataServiceAction. Одно из свойств действия SwingDataServiceAction является исходным объектом, который выступает в роли аргумента для службы. В качестве исходного объекта для действия редактирования в настоящее время задан selectedEmployeeRecord. Для того чтобы кнопка управляла как обновлением, так и добавлением, нужно перенастроить ее действие для использования switchingDataObject в качестве аргумента в службе modifyEmployee.
После того при нажатии кнопки Обновить действие в Web-службе будет выполнено, приложение должно переключаться в прежний режим. Для этого в редактор связей действия нужно добавить обработчик событий, который будет обновлять режим и обновлять таблицу после добавления или обновления.
modifyEmployeeAction.addActionBinderListener(
new jve.generated.IActionBinder.ActionBinderListener() {
public void afterActionPerformed(jve.generated.IActionBinder.ActionBinderEvent e) {
if (isNewMode) {
//возврат к использованию selectedEmployeeRecord
getSwitchingDataObject().setSourceObject(getSelectedEmployeeRecord());
//Возврат из нового режима
isNewMode = false;
updateMode();
}
// Обновить объект данных таблицы
getLightEmployeeRecordRows().refresh();
}
public void beforeActionPerformed(jve.generated.IActionBinder.ActionBinderEvent e) {}
});