在這一課,您將要啟動 My Company Directory 應用程式以新增員工記錄。
由於應用程式新增新員工的行為動態而複雜,因此,這個練習先天上就比較複雜,程式碼必須進行一些手動變更。 另外,這個練習也示範了資料物件的一些進階功能,且提供了可配合您的需求來使用連結程式和資料物件的創造性的方式範例。
下列清單說明應用程式的必要行為:
Web 服務範例提供一項 createNewFullEmployeeRecord 服務,這項服務則提供一份將移入下個可用的員工 ID 號碼的新空白員工記錄。 然後,就可以在這份空白記錄中填入新員工的資訊,並送回至 Web 服務。
由於詳細資料欄位和「更新」按鈕需要切換模式(用來執行更新和建立新員工),因此,它們必須在不同時間連結至兩個不同資料物件。 為了使這個步驟更容易執行,您將新增一個名稱為 switchingDataObject 的基本資料物件。 您將利用這個「基本資料物件」在 selectedEmployeeRecord 和 newEmployeeRecord 之間切換文字欄位的連結。
雖然每個員工詳細資料欄位都已經連結至 selectedEmployeeRecord,現在,您仍要將它們連結至 switchingDataObject。 連結欄位之後,您可以動態切換欄位的資料物件,視您在修改現有的員工記錄或新增員工記錄而定。
下列 updateMode() 方法會檢查模式旗標是否設為新建,再據此變更應用程式的行為。 依預設,Boolean 旗標 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() 方法。
在上一個,您已設計更新按鈕來使用 Web 服務的 modifyEmployee 方法。 這個動作實作成 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) {} });