Suprimir registro seleccionado

Vamos a ver el código necesario para suprimir de la lista a la persona que se encuentre seleccionada cuando el usuario pulsa el botón Suprimir.

Hay que recordar que en la variable personaSeleccionada se encontrará almacenado el objeto correspondiente a la persona que el usuario haya seleccionado en la lista. Eso es así porque en el método initialize se había asignado el código necesario usando un Listener (oyente) con addListener sobre el TableView.

Todo el código que aparecerá a continuación se inluirá dentro del método onActionButtonSuprimir que se ha asociado a la propiedad On Action del botón Suprimir.

El funcionamiento de este botón será de manera que aparezca una mensaje de aviso al usuario, informándole que se pretende eliminar un determinado registro, mostrando en dicha ventana emergente el nombre y apellidos de la persona a suprimir. Es decir, para este caso, no se utilizará la ventana de detalle que se ha diseñado anteriormente.

Para mostrar esa ventana de confirmación se puede usar un código como el siguiente:

Alert alert = new Alert(AlertType.CONFIRMATION);
alert.setTitle("Confirmar");
alert.setHeaderText("¿Desea suprimir el siguiente registro?");
alert.setContentText(personaSeleccionada.getNombre() + " "
        + personaSeleccionada.getApellidos());
Optional<ButtonType> result = alert.showAndWait();
if (result.get() == ButtonType.OK){
    // Acciones a realizar si el usuario acepta
} else {
    // Acciones a realizar si el usuario cancela
}

Como puedes ver, para ese tipo de ventanas emergentes se utiliza la Clase Alert, indicando el tipo de ventana usando un valor de AltertType, en este caso de confirmación (AlertType.CONFIRMATION), para que se le ofrezca al usuario la posibilidad de Aceptar o Cancelar el mensaje que se le ofrezca. Al objeto Alert se le asignan varias propiedades como el título (setTitle), cabecera (setHeaderText) y mensaje (setContentTexten el que se ha incluido la información referente al nombre y apellidos de la persona seleccionada. El método showAndWait de Alert permite mostrar la ventana, esperar hasta que el usuario pulse algunos de los botones que ofrece, y retorna un identificador del botón que se haya pulsado. Por ello, a continuación se consulta si el usuario ha pulsado el botón Aceptar (ButtonType.OK) o no (botón Cancelar).

Captura de pantalla de 2017 04 20 10 33 48 270a2

En caso de que el usuario pulse el botón Aceptar (dentro del if anterior), se procederá al borrado del objeto personaSeleccionada en la base de datos, al borrado de ese mismo objeto del TableView y se procurará que el TableView vuelva a tener el foco dejando seleccionado uno de los registros (el anterior al eliminado) que permanezcan en él. Antes de hacer la llamada al método remove(), se debe asegurar que el EntityManager esté gestionando el objeto a eliminar (si el objeto es nuevo, no lo estará) por lo que se debe ejecutar previamente el método merge().

entityManager.getTransaction().begin();
personaSeleccionada = entityManager.merge(personaSeleccionada);
entityManager.remove(personaSeleccionada);
entityManager.getTransaction().commit();
tableViewContactos.getItems().remove(personaSeleccionada);
tableViewContactos.getFocusModel().focus(null); tableViewContactos.requestFocus();

Si, en cambio, el usuario pulsa el botón Cancelar (dentro del else anterior), simplemente hay que volver a dejar seleccionado en el TableView la misma fila que estaba seleccionada antes de abrir la ventana de confirmación. Este código ya se usó anteriormente y es conveniente para que no se quede el foco en el botón Suprimir.

int numFilaSeleccionada = tableViewContactos.getSelectionModel().getSelectedIndex();
tableViewContactos.getItems().set(numFilaSeleccionada, personaSeleccionada);
TablePosition pos = new TablePosition(tableViewContactos, numFilaSeleccionada, null);
tableViewContactos.getFocusModel().focus(pos);
tableViewContactos.requestFocus();