En esta ocasión nos hemos centrado en la creación y gestión de un formulario completo para asignaturas utilizando JDBC en Java, integrando funcionalidades de listado, edición, inserción y borrado, además de manejar las relaciones con profesores mediante DAOs y modelos personalizados para interfaces gráficas con Swing.
Para comenzar, hemos creado un frame llamado ListAsignaturasFrame que nos permite listar las asignaturas. Este frame utiliza un diseño con BorderLayout para incorporar una tabla que mostrará las asignaturas. Para alimentar esta tabla, diseñamos un modelo personalizado llamado AsignaturasDelModel que extiende de AbstractTableModel. En este modelo, simplificamos la vista mostrando únicamente dos columnas: el identificador y el nombre de la asignatura. Implementamos los métodos esenciales como getRowCount, getColumnCount, getColumnName y getValueAt, y añadimos un método update que recarga los datos desde el DAO correspondiente.
public class AsignaturasDelModel extends AbstractTableModel {
private List<Asignatura> asignaturas = new ArrayList<>();
private AsignaturaDAO dao;
public AsignaturasDelModel(AsignaturaDAO dao) {
this.dao = dao;
}
public void update() throws DAOException {
asignaturas = dao.obtenerTodos();
fireTableDataChanged();
}
@Override
public int getRowCount() {
return asignaturas.size();
}
@Override
public int getColumnCount() {
return 2; // ID y nombre
}
@Override
public String getColumnName(int column) {
return column == 0 ? "Identificador" : "Nombre de la asignatura";
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Asignatura asignatura = asignaturas.get(rowIndex);
return columnIndex == 0 ? asignatura.getId() : asignatura.getNombre();
}
}
Una vez conectado el modelo con la tabla, implementamos la lógica para que al seleccionar una fila se activen los botones de editar y borrar. Para ello, añadimos un listener al SelectionModel de la tabla que habilita o deshabilita estos botones según la selección.
El siguiente paso fue diseñar el panel de detalle, DetalleAsignaturaPanel, que permite visualizar y editar los datos de una asignatura. Este panel contiene un campo de texto para el nombre de la asignatura y un combo box para seleccionar el profesor que la imparte. La gestión del combo box es especialmente interesante porque requiere cargar los profesores desde otro DAO y mostrar sus nombres de forma amigable.
Para manejar el combo box, creamos un modelo personalizado ProfesoresComboModel que extiende de DefaultComboBoxModel<Profesor>. Este modelo carga la lista de profesores desde el DAO y actualiza el combo box con estos elementos.
public class ProfesoresComboModel extends DefaultComboBoxModel<Profesor> {
private List<Profesor> profesores = new ArrayList<>();
private ProfesorDAO dao;
public ProfesoresComboModel(ProfesorDAO dao) {
this.dao = dao;
}
public void update() throws DAOException {
profesores = dao.obtenerTodos();
removeAllElements();
for (Profesor p : profesores) {
addElement(p);
}
}
}
Para mejorar la presentación en el combo box, implementamos un adaptador llamado ProfesorComboView que envuelve un objeto Profesor y redefine el método toString para mostrar el nombre y apellidos de forma clara, sin alterar la lógica de igualdad y hashcode, lo que es crucial para el correcto funcionamiento del combo box.
public class ProfesorComboView {
private Profesor profesor;
public ProfesorComboView(Profesor profesor) {
this.profesor = profesor;
}
public Profesor getProfesor() {
return profesor;
}
@Override
public String toString() {
return profesor.getApellidos() + " " + profesor.getNombre();
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof ProfesorComboView)) return false;
ProfesorComboView other = (ProfesorComboView) obj;
return profesor.equals(other.profesor);
}
@Override
public int hashCode() {
return profesor.hashCode();
}
}
En el panel de detalle, al cargar los datos de una asignatura, asignamos el profesor seleccionado en el combo box utilizando este adaptador, y al guardar, extraemos el profesor seleccionado para actualizar la asignatura con el identificador correcto.
La gestión de los botones sigue un patrón claro: al pulsar Nuevo, activamos la edición y limpiamos el formulario; al pulsar Editar, cargamos los datos de la asignatura seleccionada y permitimos su modificación; al pulsar Guardar, validamos y guardamos los cambios en la base de datos, diferenciando entre inserción y actualización según si la asignatura tiene o no un identificador asignado; y al pulsar Cancelar, desactivamos la edición y limpiamos la selección.
Para la eliminación, implementamos un diálogo de confirmación que, si es aceptado, elimina la asignatura seleccionada y actualiza la tabla para reflejar los cambios.
Durante el desarrollo, surgieron algunos retos, especialmente con el combo box para seleccionar profesores, donde inicialmente no se permitía cambiar la selección correctamente. Esto nos llevó a revisar la implementación del modelo y el adaptador para asegurar que el combo box funcionara como se espera. También se destacó la importancia de llamar a los métodos update o load para refrescar los datos en los modelos y evitar inconsistencias en la interfaz.
Finalmente, se mencionó que el siguiente paso será implementar el CRUD para matrículas, que se centrará más en búsquedas y visualización de datos relacionados con alumnos matriculados en asignaturas, completando así la gestión integral de la aplicación.
Este enfoque nos permite manejar formularios complejos con relaciones entre entidades, utilizando DAOs para acceder a la base de datos y modelos personalizados para una interfaz gráfica más limpia y funcional con Swing.