Bueno. Ya tengo una mínima parte hecha que pueda servir de ejemplo/inspiración.
Lo primero que quiero mostrar es cómo he distribuido los
packages.
Esta distribución no es obligatoria ni tampoco los nombres que le he puesto a los
packages. De hecho no creo que ningún profesional lo haga así.
Pero viene bien para propósitos didácticos, refleja muy bien la aplicación del patrón MVC(Modelo-Vista-Controlador).
Un "patrón" es una forma de organizar el código, el más habitual es el MVC porque es el más sencillo y sirve para prácticamente cualquier proyecto sea cuál sea su propósito.
En el paquete llamado "modelo" es donde escribiríamos las clases que se encargan de las entidades que "no vemos": Pacientes, Citas, Expedientes,Vacunas,....
Y también las clases que se encarguen de trabajar con estas entidades. Ahí junto a la clase
Paciente, podemos ver otra clase llamada
GestorPaciente.
Esta clase "gestora" será la que contenga el HashMap con los pacientes y los métodos necesarios para añadir, buscar, eliminar o lo que se nesecite.
En el paquete llamado "vista" es donde codificaremos las clases que representan las entidades que "sí vemos". Es decir, los elementos gráficos que van a componer la interfaz.
Ahí escribiremos las "pantallas" para mostrar los datos de Pacientes, Vacunas, Citas....
Estas "pantallas" serán clases JPanel, ya que como dije anteriormente, lo correcto es que solo exista un único JFrame para toda la aplicación.
Ahí en el paquete "vista", también de podrían escribir otras clases que pudiéramos necesitar para componer la interfaz.
Si por ejemplo quisiéramos diseñar un botón con un tamaño, color y fuente concretos, y que además pudiéramos usar ese diseño para todos los botones de la interfaz, pues podríamos crear una clase JButton con el diseño que nos guste y así poder usarlo en distintos paneles.
Bueno, tenemos el paquete "modelo", el paquete "vista" y por último el paquete "controlador".
Aquí es donde vamos a tener la clase principal, que será el JFrame y entre sus atributos tendrá objetos del "modelo" y también de la "vista".
De esta forma, el "controlador" hace de nexo entre esas dos partes y permite que interactúen entre ellas a pesar de que se han escrito por separado.
Veamos, el código que he podido escribir. Empecemos por la parte del "modelo".
Tenemos la clase
Paciente, que es la que tú escribiste pero con el añadido de un ArrayList para guardar las vacunas que se le apliquen a este paciente.
Ahora mismo este ArrayList no está usándose, y de hecho, puede que luego surja un cambio de opinión y no se le de uso.
Pues otra posible forma de asociar pacientes con vacunas es crear una única colección (en otra clase fuera de
Paciente) que contenga un identificador de paciente y el objeto
Vacuna asociado.
Es decir, tendríamos dos propuestas:
1) Cada paciente tiene su propia lista de vacunas
2) Habrá una única lista donde se asociarán identificadores de pacientes y vacunas.
Ambas son válidas, elegir una u otra es cuestión de gustos y también puede depender de lo que queramos hacer y mostrar en la "pantalla" para las vacunas.
Por ahora, el código de
Paciente es este:
public class Paciente {
private String numIdentificacionPaciente;
private String nombrePaciente;
private int edadPaciente;
private String sexoPaciente;
private double alturaPaciente;
private double pesoPaciente;
private String fechaNacPaciente;
//Vacunas
private ArrayList<Vacuna> vacunas; //Provisional, sin funcionalidad actualmente
public Paciente() {
}
public Paciente(String numIdentificacionPaciente, String nombrePaciente, int edadPaciente, String sexoPaciente, double alturaPaciente, double pesoPaciente, String fechaNacPaciente) {
this.numIdentificacionPaciente = numIdentificacionPaciente;
this.nombrePaciente = nombrePaciente;
this.edadPaciente = edadPaciente;
this.sexoPaciente = sexoPaciente;
this.alturaPaciente = alturaPaciente;
this.pesoPaciente = pesoPaciente;
this.fechaNacPaciente = fechaNacPaciente;
vacunas = new ArrayList<Vacuna>();
}
public String getNumIdentificacionPaciente() {
return numIdentificacionPaciente;
}
public String getNombrePaciente() {
return nombrePaciente;
}
public int getEdadPaciente() {
return edadPaciente;
}
public String getSexoPaciente() {
return sexoPaciente;
}
public double getAlturaPaciente() {
return alturaPaciente;
}
public double getPesoPaciente() {
return pesoPaciente;
}
public String getFechaNacPaciente() {
return fechaNacPaciente;
}
public void setNumIdentificacionPaciente(String numIdentificacionPaciente) {
this.numIdentificacionPaciente = numIdentificacionPaciente;
}
public void setNombrePaciente(String nombrePaciente) {
this.nombrePaciente = nombrePaciente;
}
public void setEdadPaciente(int edadPaciente) {
this.edadPaciente = edadPaciente;
}
public void setSexoPaciente(String sexoPaciente) {
this.sexoPaciente = sexoPaciente;
}
public void setAlturaPaciente(double alturaPaciente) {
this.alturaPaciente = alturaPaciente;
}
public void setPesoPaciente(double pesoPaciente) {
this.pesoPaciente = pesoPaciente;
}
public void setFechaNacPaciente(String fechaNacPaciente) {
this.fechaNacPaciente = fechaNacPaciente;
}
@Override
public String toString() {
return "Paciente{" + "numIdentificacionPaciente=" + numIdentificacionPaciente + ", nombrePaciente=" + nombrePaciente + ", edadPaciente=" + edadPaciente + ", sexoPaciente=" + sexoPaciente + ", alturaPaciente=" + alturaPaciente + ", pesoPaciente=" + pesoPaciente + ", fechaNacPaciente=" + fechaNacPaciente + '}';
}
}
Luego tenemos la clase
GestorPacientes, que como dije antes, alberga y gestiona un HashMap de tipo
Pacientepublic class GestorPacientes {
private HashMap<String, Paciente> pacientes = new HashMap<>();
public void agregarPaciente(Paciente paci) {
pacientes.put(paci.getNumIdentificacionPaciente(), paci);
}
public void modificarPaciente(Paciente paci) {
if (pacientes.containsKey(paci.getNumIdentificacionPaciente())) {
int respuesta = JOptionPane.showConfirmDialog(null,
"¿Modificar paciente?", "Modificar", JOptionPane.YES_NO_OPTION);
if (respuesta == JOptionPane.YES_OPTION) {
pacientes.replace(paci.getNumIdentificacionPaciente(), paci);
JOptionPane.showMessageDialog(null, "Paciente modificado");
}
}
}
public boolean borrarPaciente(String id) {
if (pacientes.containsKey(id)) {
int respuesta = JOptionPane.showConfirmDialog(null,
"¿Eliminar paciente?", "Eliminar", JOptionPane.YES_NO_OPTION);
if (respuesta == JOptionPane.YES_OPTION) {
pacientes.remove(id);
JOptionPane.showMessageDialog(null, "Paciente eliminado");
return true;
}
}
else
JOptionPane.showMessageDialog(null, "No existe paciente con ese identificador.");
return false;
}
public Paciente getPaciente(String id) {
if (pacientes.containsKey(id))
return pacientes.get(id);
else {
JOptionPane.showMessageDialog(null, "No existe paciente con ese identificador.");
return null;
}
}
public String[] getListaId() {
String[] lista = new String[pacientes.size()];
int i = 0;
for (Entry<String, Paciente> entry : pacientes.entrySet()) {
lista[i] = entry.getKey();
i++;
}
return lista;
}
}
Entre sus métodos para añadir, modificar y eliminar pacientes, vemos también uno que genera un array con la lista de identificadores de los pacientes registrados.
Esto nos será útil para luego mostrar estos identificadores en la pantalla y que el usuario pueda seleccionarlos y consultar sus datos.
Hay otro método que nos retorna un
Paciente, según el identificador que le proporcionemos.
Por último está la clase
Vacuna, que es exactamente igual a la tuya, no he hecho nada con ella.
public class Vacuna {
private String numIdentificacionVacuna;
private String fechaAplicacion;
private String nombreVacuna;
public Vacuna() {
}
public Vacuna(String numIdentificacionVacuna, String fechaAplicacion, String nombreVacuna) {
this.numIdentificacionVacuna = numIdentificacionVacuna;
this.fechaAplicacion = fechaAplicacion;
this.nombreVacuna = nombreVacuna;
}
public String getNumIdentificacionVacuna() {
return numIdentificacionVacuna;
}
public String getFechaAplicacion() {
return fechaAplicacion;
}
public String getNombreVacuna() {
return nombreVacuna;
}
public void setNumIdentificacionVacuna(String numIdentificacionVacuna) {
this.numIdentificacionVacuna = numIdentificacionVacuna;
}
public void setFechaAplicacion(String fechaAplicacion) {
this.fechaAplicacion = fechaAplicacion;
}
public void setNombreVacuna(String nombreVacuna) {
this.nombreVacuna = nombreVacuna;
}
@Override
public String toString() {
return "Vacuna"
+ " NumI dentificacion Vacuna: " + numIdentificacionVacuna + "\n"
+ " Fecha de Aplicacion: " + fechaAplicacion + "\n"
+ " Nombre Vacuna: " + nombreVacuna + "\n";
}
}
En el siguiente post vemos la parte de la "vista".