W tej lekcji użytkownik umożliwi dodanie nowego rekordu pracownika w aplikacji Firmowa książka adresowa.
Ponieważ zachowanie aplikacji jest bardziej skomplikowane i dynamiczne podczas dodawania nowego pracownika, to ćwiczenie jest również bardziej złożone i wymaga ręcznego wprowadzenia pewnych zmian w kodzie źródłowym. Ponadto to ćwiczenie prezentuje pewne zaawansowane możliwości obiektów danych oraz stanowi kreatywny przykład jednego ze sposobów zastosowania konsolidatorów i obiektów danych w celu realizacji konkretnych wymagań.
Poniższa lista opisuje wymagane zachowanie aplikacji:
Przykładowa usługa Web Service udostępnia usługę createNewFullEmployeeRecord zapewniającą nowy, pusty rekord zapełniany kolejnym dostępnym numerem identyfikatora pracownika. Ten pusty rekord można następnie zapełnić informacjami o pracowniku i przesłać z powrotem do usługi Web Service.

Ponieważ pola szczegółów i przycisk Aktualizacja wymagają przełączania trybów (w celu dokonania aktualizacji i utworzenia nowego pracownika), wymagają one powiązania z dwoma różnymi obiektami danych w różnym czasie. W celu ułatwienia tej czynności zostanie dodany podstawowy obiekt danych o nazwie switchingDataObject. Ten podstawowy obiekt danych będzie służył do przełączania powiązania pól tekstowych między obiektami selectedEmployeeRecord i newEmployeeRecord.
Chociaż każde z pól szczegółów pracownika jest już powiązane z obiektem selectedEmployeeRecord, należy teraz powiązać je z obiektem switchingDataObject. Po powiązaniu pól można dynamicznie przełączać się między obiektami danych tych pól w zależności od tego, czy następuje modyfikacja istniejącego rekordu pracownika czy też dodawany jest nowy rekord pracownika.
Poniższa metoda updateMode() sprawdza, czy flaga trybu jest ustawiona na tworzenie nowego rekordu, a następnie odpowiednio zmienia zachowanie aplikacji. Domyślnie flaga boolowska isNewMode ma wartość false, a metoda updateMode() włącza tabelę pracowników i pole filtru oraz ustawia tekst przycisku Aktualizuj na "Aktualizuj". Jeśli flaga isNewMode ma wartość true, tabela pracowników jest wyłączana, są anulowane wszystkie wybory, jest wyłączane pole filtru, a tekst na przycisku Aktualizuj jest zmieniany na "Dodaj".
private boolean isNewMode = false;
private void updateMode() {
if (isNewMode) {
getEmployeesTable().clearSelection();
getEmployeesTable().setEnabled(false);
getFilterField().setEditable(false);
getUpdateCreateButton().setText("Dodaj");
} else {
getEmployeesTable().setEnabled(true);
getFilterField().setEditable(true);
getUpdateCreateButton().setText("Aktualizuj");
}
}
W tym kroku zostanie dodany kod zdarzenia wywoływanego po kliknięciu przycisku Nowy. To zdarzenie informuje obiekt switchingDataObject o konieczności użycia obiektu danych newEmployeeRecord, ustawia flagę trybu na "new" i uruchamia metodę updateMode() dodaną w poprzednim kroku.
W poprzedniej lekcji przycisk Aktualizacja został zaprogramowany do korzystania z metody modifyEmployee usługi Web Service. Ta czynność jest zaimplementowana jako SwingDataServiceAction. Jedną z właściwości czynności SwingDataServiceAction jest obiekt źródłowy działający jako argument usługi. Obiekt źródłowy dla czynności modyfikacji jest obecnie ustawiony na obiekt selectedEmployeeRecord. Aby zaprogramować ten przycisk do sterowania zarówno aktualizacją, jak i dodawaniem, należy ponownie skonfigurować czynność tego przycisku w celu używania obiektu switchingDataObject jako argumentu dla usługi modifyEmployee.
Po kliknięciu przycisku Aktualizacja i zakończeniu czynności w usłudze Web Service aplikacja powinna powrócić do swojego domyślnego trybu i zachowania. W tym celu należy dodać procedurę nasłuchiwania zdarzeń w konsolidatorze działań związanych z przyciskiem, która będzie aktualizować tryb i odświeżać tabelę po zakończeniu aktualizacji lub dodawania.
modifyEmployeeAction.addActionBinderListener(new jve.generated.IActionBinder.ActionBinderListener() {
public void afterActionPerformed(jve.generated.IActionBinder.ActionBinderEvent e) {
if (isNewMode) {
// wróć do używania obiektu selectedEmployeeRecord
getSwitchingDataObject().setSourceObject(getSelectedEmployeeRecord());
// wycofaj tryb nowego rekordu
isNewMode = false;
updateMode();
}
// odśwież obiekt danych tabeli
getLightEmployeeRecordRows().refresh();
}
public void beforeActionPerformed(jve.generated.IActionBinder.ActionBinderEvent e) {}
});