In questa lezione verrà abilitata l'applicazione My Company Directory per l'aggiunta del record di un nuovo dipendente.
Poiché il comportamento dell'applicazione è più complicato e dinamico per l'aggiunta di un nuovo dipendente, questo esercizio è più complesso e verrà richiesto di effettuare alcune modifiche manuali al codice di origine. Inoltre, questo esercizio mostra alcune funzioni avanzate degli oggetti dati, e fornisce un esempio dei diversi modi in cui è possibile utilizzare i binder e gli oggetti dati.
Il seguente elenco descrive il comportamento previsto dell'applicazione:
Il servizio Web di esempio fornisce un servizio createNewFullEmployeeRecord che a sua volta fornisce un record di dipendente nuovo, vuoto in cui verrà inserito il primo numero di ID dipendente disponibile. In questo record vuoto possono successivamente essere inserite le informazioni relative al nuovo dipendente e inoltrate al servizio Web.
Poiché i campi dei dettagli e il pulsante Aggiorna devono alternare le modalità (sia per eseguire un aggiornamento che per la creazione di un nuovo dipendente), dovranno essere associati a due diversi oggetti dati in due momenti diversi. Per semplificare queste operazioni, aggiungere un oggetto dati di base chiamato switchingDataObject. Tale oggetto verrà utilizzato per alternare il binding per i campi di testo tra selectedEmployeeRecord e newEmployeeRecord.
Anche se i campi dei dettagli del dipendente sono già associati a selectedEmployeeRecord, adesso verranno associati a switchingDataObject. Dopo aver associato i campi, sarà possibile passare dinamicamente da un oggetto dati all'altro per i campi, in base alle modifiche apportate al record di un dipendente esistente o all'aggiunta di un nuovo record.
Il seguente metodo updateMode() controlla se il modo è impostato su Nuovo, quindi modifica alcuni comportamenti dell'applicazione di conseguenza. Per impostazione predefinita, l'indicatore booleano isNewMode è impostato su false, il metodo updateMode() abilita la tabella dipendenti e il campo dei filtri e imposta il testo sul pulsante Aggiorna su "Aggiorna". Se isNewMode è impostato su true, la tabella dei dipendenti viene disabilitata e qualsiasi selezione sarà annullata, il campo filtro viene disabilitato e il testo sul pulsante Aggiorna viene impostato su "Aggiungi".
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"); } }
In questa fase, verrà aggiunto il codice di evento per il pulsante Nuovo. L'evento indica a switchingDataObject di utilizzare l'oggetto dati newEmployeeRecord, imposta l'indicatore di modalità su "new" ed esegue il metodo updateMode() aggiunto precedentemente.
In una delle lezioni precedenti, è stato programmato il pulsante Aggiorna affinché utilizzi il metodo modifyEmployee sul servizio Web. Questa azione viene implementata come una SwingDataServiceAction. Una delle proprietà di SwingDataServiceAction è l'oggetto di origine, che agisce come argomento per il servizio. L'oggetto di origine per l'azione di modifica è al momento impostato su selectedEmployeeRecord. Per programmare il pulsante affinché controlli sia l'aggiornamento che l'aggiunta, è necessario riconfigurare l'azione del pulsante per utilizzare switchingDataObject come argomento nel servizio modifyEmployee.
Dopo aver fatto clic su Aggiorna e una volta che l'azione è stata completata sul servizio Web, ripristinare la modalità e il comportamento predefinito dell'applicazione. Per ottenere questo risultato, aggiungere un listener di eventi al binder di azioni del pulsante che aggiornerà la modalità e aggiornerà la tabella dopo aver eseguito l'aggiornamento o l'aggiunta.
modifyEmployeeAction.addActionBinderListener(new jve.generated.IActionBinder.ActionBinderListener() { public void afterActionPerformed(jve.generated.IActionBinder.ActionBinderEvent e) { if (isNewMode) { //Go back to using the selectedEmployeeRecord getSwitchingDataObject().setSourceObject(getSelectedEmployeeRecord()); //Revert out of new mode isNewMode = false; updateMode(); } // Refresh the table's data object getLightEmployeeRecordRows().refresh(); } public void beforeActionPerformed(jve.generated.IActionBinder.ActionBinderEvent e) {} });