Autor Tema: proyecto  (Leído 421 veces)

jose alvarez

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 5
    • Ver Perfil
proyecto
« en: 29 de Junio 2021, 19:17 »
muy buenos dias tengo un proyecto que debo entregar el 1 de julio y aun me falta si alguien puede ayudarme por favor.
conciste en
El proyecto a desarrollar deberá registrar datos relacionados al comportamiento de casos del coronavirus (COVID-19)  para ello se deberá tomar en cuenta lo siguiente:

• El sistema deberá permitir agregar, modificar, eliminar y consultar datos.
• La información deberá ser almacenada de forma permanente a través de archivos.
• Los datos a registrar cada día con respecto a los casos serán los siguientes:
o Casos Nuevos
o Casos Fallecidos
o Casos Recuperados
• El programa será capaz de mostrar la siguiente información a través de una consulta:
o Total de Casos Activos
o Total de Casos Recuperados
o Total de Casos Confirmados
o Total de Casos Fallecidos

Objetivo general.
Diseñar y crear un programa en Java que realice un sistema para el control de casos de coronavirus, el cual debe ser capaz de crear, almacenar, modificar, eliminar, consultar registros y permitir salirse del sistema, bajo el entorno de Java GUI.

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 680
    • Ver Perfil
Re: proyecto
« Respuesta #1 en: 30 de Junio 2021, 00:18 »
Muestra lo que tengas o al menos explica que enfoque le estás dando.
Por ejemplo, supongo que Caso será una clase, pero ¿qué atributos tiene, o has decidido que va a tener?
¿ID de caso?
¿Nombre paciente?
¿DNi/Cedula paciente?
¿Fecha Nacimiento?
...

NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

jose alvarez

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 5
    • Ver Perfil
Re: proyecto
« Respuesta #2 en: 30 de Junio 2021, 01:49 »
lo deseo parecido a este video que esta en: https://www.youtube.com/watch?v=Y74dpssKvgA

quiero ponerle
nombres
apellidos
genero
edad
 
casonuevo       casofallecido,       casorecuperado

todo esto insertado en una tabla

y que despues me de las opciones de los datos ingresados  de


guardar    modificar    eliminar    consultar  y salir



« Última modificación: 30 de Junio 2021, 02:02 por jose alvarez »

jose alvarez

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 5
    • Ver Perfil
Re: proyecto
« Respuesta #3 en: 30 de Junio 2021, 02:04 »
yo lo he trabajado ya un poco solo que no se como subirlo por aca, pero mi correo es jjalvarez317@gmail.com para contactarnos

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 680
    • Ver Perfil
Re: proyecto
« Respuesta #4 en: 02 de Julio 2021, 11:51 »
Veamos.
La clase Caso podría ser algo así:
Código: [Seleccionar]
package casos;

import java.io.Serializable;

public class Caso implements Serializable{

private String nombre;
private String apellidos;
private String genero;
private int edad;
private boolean confirmado; //India si la infeccion ha sido confirmada por algún test COVID
private String estado; //Activo, Recuperado, Fallecido

public Caso(String nombre, String apellidos, String genero,
int edad, boolean confirmado, String estado) {
this.nombre = nombre;
this.apellidos = apellidos;
this.genero = genero;
this.edad = edad;
this.confirmado = confirmado;
this.estado = estado;
}

public String getNombre() {
return nombre;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

public String getApellidos() {
return apellidos;
}

public void setApellidos(String apellidos) {
this.apellidos = apellidos;
}

public String getGenero() {
return genero;
}

public void setGenero(String genero) {
this.genero = genero;
}

public int getEdad() {
return edad;
}

public void setEdad(int edad) {
this.edad = edad;
}

public boolean isConfirmado() {
return confirmado;
}

public void setConfirmado(boolean confirmado) {
this.confirmado = confirmado;
}

public String getEstado() {
return estado;
}

public void setEstado(String estado) {
this.estado = estado;
}

/**
* Retorna los datos del Caso reunidos en un array.<br>
* Este array se usará para construir la tabla de datos.
* @return Array de String con los datos de este Caso.
*/
public String[] datosArray() {
return new String[] {nombre, apellidos, genero, Integer.toString(edad),
confirmado?"SI":"NO", estado};
}
}

Solo tiene dos cosas "especiales" a destacar.
Una es que implementa la interfaz Serializable. Esto lo necesitaremos porque los casos que se van a registrar hay que guardarlos en disco para que sean persistentes.
Puesto que los iremos registrando en un ArrayList o colección similar, una forma rápida de guardar los datos es hacer una copia directa del ArrayList tal cuál está en memoria.
Y para eso, hay que poder "serializarlo".

Otra cosa a destacar es el último método. Construye un array con los datos de este caso y lo retorna.
Esto facilitará luego poder mostrar los datos en una tabla, porque con este método cada Caso será capaz de darnos el array que debemos insertar en la tabla.

Ahora necesitaríamos una clase que disponga de un ArrayList para guardar los casos y además se encargue de gestionarlos.
Funciones como guardar un nuevo caso, modificar, eliminar o guardar/leer los datos guardados en disco..., las realizará esta clase que podemos llamar GestionCasos
Código: [Seleccionar]
package casos;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;

import javax.swing.JOptionPane;

public class GestionCasos{

private final File fichero = new File("registroCovid/covid.dat"); //Archivo donde se guardan los datos
public ArrayList<Caso> registroCasos = new ArrayList<Caso>();

public GestionCasos() {
cargarRegistro();
}

public Caso getCaso(int indice) {
return registroCasos.get(indice);
}

public void registrarCaso(Caso caso) {
registroCasos.add(caso);
}

public void modificarCaso(Caso caso, int posicion) {
registroCasos.set(posicion, caso); //Sustituimos Caso anterior por el mismo Caso, pero modificado
}

public void eliminarCaso(int indice) {
registroCasos.remove(indice);
}

/**
* Hace una copia en disco del ArrayList
*/
public void guardarRegistro() {
try {
if (!fichero.exists())
crearFichero();

ObjectOutputStream escritor = new ObjectOutputStream(new FileOutputStream(fichero));
escritor.writeObject(registroCasos);
escritor.close();
} catch (FileNotFoundException e) {
JOptionPane.showMessageDialog(null, "No se encuentra fichero de registros",
"Guardar Registro", JOptionPane.WARNING_MESSAGE);
} catch (IOException e) {
JOptionPane.showMessageDialog(null, "No se puede acceder a: " + fichero.getAbsolutePath()
, "Guardar Registro", JOptionPane.WARNING_MESSAGE);
}
}

/**
* Recupera los datos del ArrayList guardado en disco
*/
private void cargarRegistro() {
try {
ObjectInputStream lector = new ObjectInputStream(new FileInputStream(fichero));
registroCasos = (ArrayList<Caso>) lector.readObject();
lector.close();
} catch (FileNotFoundException e) {
JOptionPane.showMessageDialog(null, "No existe fichero con registros.\n"
+ "Se creará uno nuevo", "Cargar Registro", JOptionPane.WARNING_MESSAGE);
crearFichero();
} catch (IOException e) {
JOptionPane.showMessageDialog(null, "No se puede acceder a: " + fichero.getAbsolutePath()
, "Cargar Registro", JOptionPane.WARNING_MESSAGE);
} catch (ClassNotFoundException e) {
JOptionPane.showMessageDialog(null, "Los datos registrados no son válidos.\n"
+ "El programa iniciará con un registro vacío", "Cargar Registro", JOptionPane.WARNING_MESSAGE);
}
}

/**
* Si no existe el archivo de datos, ya sea porque se ha borrado
* o porque es la primera vez que se ejecuta el programa, este método
* intentará crearlo.
*/
private void crearFichero() {
File directorio = new File(fichero.getParent());
directorio.mkdirs(); //Primero creamos la ruta de carpetas donde se ha de guardar el archivo
try {
fichero.createNewFile(); //Luego intentamos crear el archivo
if (!fichero.exists())
JOptionPane.showMessageDialog(null, "No se pudo crear: " + fichero.getAbsolutePath()
, "Crear Registro", JOptionPane.WARNING_MESSAGE);
} catch (IOException e) {
JOptionPane.showMessageDialog(null, "No se pudo crear: " + fichero.getAbsolutePath()
, "Crear Registro", JOptionPane.WARNING_MESSAGE);
}
}

}

Estas dos clases en principio ya cubrirían lo que sería el "Modelo" del proyecto, es decir, la gestión de datos internos, las tareas que el usuario no ve.

Ahora nos pondremos con lo que sí ve el usuario, lo que se llama la "Vista". O sea, la interfaz gráfica(GUI). Esto lo vemos en el siguiente mensaje.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 680
    • Ver Perfil
Re: proyecto
« Respuesta #5 en: 02 de Julio 2021, 12:40 »
La interfaz podría ser algo así:



La ventana está dividida en tres partes.
Arriba simplemente se muestra la imagen de Covid, para darle un poquito más de vistosidad a la aplicación.

Debajo hay un formulario para insertar y modificar los datos, junto con botones para las distintas funciones.

Abajo de todo, una tabla (no editable, para simplificar el código) en la que se muestran los casos registrados.

Al pinchar en uno de esos casos, los datos se muestran en los campos del formulario.
Si se pulsa el botón "Modificar" entonces se permite modificar los valores en el formulario y con el botón "Guardar" se aceptan los cambios.
Sin embargo, este botón solo guarda los cambios en memoria (en el ArrayList). Si se quiere hacerlos persistentes hay que pulsar el botón "Grabar" para que se guarden los cambios en disco.

Bien, estas tres partes de la ventana, están creadas con tres clases distintas que heredan de JPanel.

La primera clase, PanelImagen, es muy sencilla, se encarga simplemente de "pintar" un panel con la imagen que le indiquemos por su constructor:
Código: [Seleccionar]
package gui;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class PanelImagen extends JPanel{

private Image imagen;

public PanelImagen(String rutaImagen) {
imagen = new ImageIcon(getClass().getClassLoader().getResource(rutaImagen)).getImage();
setPreferredSize(new Dimension(599, 158));
}

@Override
public void paint(Graphics g){
g.drawImage(imagen, 0, 0, 599, 158, this);
setOpaque(false);
super.paint(g);
}
}

La segunda, PanelDatos, muestra el formulario y los botones de funciones.
Está a su vez dividida en dos subpaneles, uno con los campos de texto, combobox, el checkbox, etc ..
Y otro con la línea de botones.

Algunos botones, sus acciones (ActionListener) están escritos en esta misma clase porque son acciones sencillas que no necesitan interactuar con otras partes del código.
Por ejemplo el botón "SALIR" para cerrar la aplicación o el botón "Nuevo Registro" que lo único que hace es limpiar los campos y activarlos para que se pueda escribir en ellos.

Otros botones, sus acciones se escribirán desde otra parte del código, porque si tendrán que interactuar con el "gestor de casos" y/o con el panel que mostrará la tabla.

Hay que destacar que este panel tiene un objeto Caso como atributo. Este atributo es una referencia al Caso que consta como seleccionado en la tabla. Tener esta referencia facilita saber de quién son los datos que hay que mostrar y/o modificar en los campos.

Código: [Seleccionar]
package gui;

import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;

import casos.Caso;

public class PanelDatos extends JPanel{

//Referencia a caso seleccionado en tabla
private Caso casoSeleccionado = null;

private JTextField jtNombre;
private JTextField jtApellidos;
private JComboBox<String> comboGenero;
private JSpinner jsEdad;
private JCheckBox checkConfirmado;
private JComboBox<String> comboEstado;
private JButton btNuevo;
public JButton btModificar;
public JButton btEliminar;
public JButton btGuardar;
public JButton btGrabar;
private JButton btSalir;

public PanelDatos() {
iniciarComponentes();
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
add(new PanelRegistro());
add(new PanelBotones());
nuevoRegistro(); //Formulario inicia listo para crear un nuevo registro
}

private void iniciarComponentes() {
jtNombre = new JTextField(12);
jtApellidos = new JTextField(18);
comboGenero = new JComboBox<String>(new String[] {"Hombre", "Mujer"});
jsEdad = new JSpinner(new SpinnerNumberModel(18, 0, 99, 1));
checkConfirmado = new JCheckBox("Confirmado");
comboEstado = new JComboBox<String>(new String[] {"Activo", "Recuperado", "Fallecido"});
btNuevo = new JButton("<html><p style=\"text-align:center\">Nuevo<br>Registro</p></html>");
btNuevo.addActionListener(new AccionNuevo());
btModificar = new JButton("Modificar");
btModificar.addActionListener(new AccionModificar());
btEliminar = new JButton("Eliminar");
btGuardar = new JButton("Guardar");
btGrabar = new JButton("Grabar");
btSalir = new JButton("SALIR");
btSalir.addActionListener(new AccionSalir());
}

//Paneles
private class PanelRegistro extends JPanel {

public PanelRegistro() {
setLayout(new GridLayout(3,2,5,10));
add(new PanelConLabel("Nombre", jtNombre));
add(new PanelConLabel("Apellidos", jtApellidos));
add(new PanelConLabel("Genero", comboGenero));
add(new PanelConLabel("Edad", jsEdad));
add(new PanelConLabel("Estado", comboEstado));
add(new PanelConLabel("Prueba COVID", checkConfirmado));

setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createEmptyBorder(10, 10, 5, 10),
BorderFactory.createTitledBorder("Datos del Caso")));
}
}

private class PanelBotones extends JPanel {

public PanelBotones() {
add(btNuevo);
add(Box.createHorizontalStrut(20));
add(btModificar);
add(btEliminar);
add(btGuardar);
add(Box.createHorizontalStrut(20));
add(btGrabar);
add(btSalir);

setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createEmptyBorder(5, 10, 10, 10),
BorderFactory.createLoweredSoftBevelBorder()));
}
}

private class PanelConLabel extends JPanel {

public PanelConLabel(String textoLabel, JComponent componente) {
setLayout(new FlowLayout(FlowLayout.LEFT));
add(new JLabel(textoLabel));
add(componente);
}
}

//Acciones
private class AccionNuevo implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
nuevoRegistro();
}
}

private class AccionModificar implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
btModificar.setEnabled(false);
btGuardar.setEnabled(true);
btGrabar.setEnabled(false);
activarCampos(true);
}
}

private class AccionSalir implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
int resp = JOptionPane.showConfirmDialog(null, "¿Cerrar Programa?"
+ "\nSe perderán los datos no GRABADOS.", "Cerrar Programa", JOptionPane.YES_NO_OPTION);
if (resp == JOptionPane.YES_OPTION)
System.exit(0);
}
}

//Métodos
/**
* Activa o desactiva los campos del formulario.<br>
* Los campos solo se activan cuando se está haciendo un nuevo
* registro o cuando se va a modificar un Caso existente.
* @param activar True para activar, False para desactivar
*/
private void activarCampos(boolean activar) {
jtNombre.setEditable(activar);
jtApellidos.setEditable(activar);
comboGenero.setEnabled(activar);
jsEdad.setEnabled(activar);
checkConfirmado.setEnabled(activar);
comboEstado.setEnabled(activar);
}

/**
* Prepara el formulario para registrar un nuevo caso.
*/
public void nuevoRegistro() {
casoSeleccionado = null; //Anulamos cualquier referencia a un caso ya existente
jtNombre.setText(null);
jtApellidos.setText(null);
comboGenero.setSelectedIndex(0);
jsEdad.setValue(18);
checkConfirmado.setSelected(false);
comboEstado.setSelectedIndex(0);
activarCampos(true);
btModificar.setEnabled(false);
btEliminar.setEnabled(false);
btGuardar.setEnabled(true);
btGrabar.setEnabled(false);
}

/**
* Comprueba que el formulario tenga los datos necesarios
* para crear un Caso y lo retorna.<br>Este método se invoca
* cuando se pulsa el botón "Guardar" de la interfaz.
* @return Un Caso con los datos del formulario
*/
public Caso getCaso() {
//Construimos un Caso con los datos del formulario
String nombre = jtNombre.getText();
if (nombre.isBlank()) {
JOptionPane.showMessageDialog(null, "Campo NOMBRE no puede estar vacío",
"Guardar Caso", JOptionPane.WARNING_MESSAGE);
return null;
}
String apellidos = jtApellidos.getText();
if (apellidos.isBlank()) {
JOptionPane.showMessageDialog(null, "Campo APELLIDOS no puede estar vacío",
"Guardar Caso", JOptionPane.WARNING_MESSAGE);
return null;
}
String genero = (String) comboGenero.getSelectedItem();
int edad = (int) jsEdad.getValue();
boolean confirmado = checkConfirmado.isSelected();
String estado  = (String) comboEstado.getSelectedItem();

Caso caso = new Caso(nombre, apellidos, genero, edad, confirmado, estado);

//Antes de retornar el Caso, cambiamos configuración de botones interfaz
btModificar.setEnabled(true);
btEliminar.setEnabled(true);
btGuardar.setEnabled(false);
btGrabar.setEnabled(true);
activarCampos(false);

return caso;
}

/**
* Indica si estamos modificando un caso existente
* o creando uno nuevo.
* @return True si estamos modificando, False si es nuevo.
*/
public boolean esModificacion() {
//Si hay un caso seleccionado, es que SÍ estamos modificando.
return casoSeleccionado != null;
}

/**
* Recibe el Caso que ha de constar como seleccionado y por
* tanto muestra los datos del dicho Caso en el formulario.
* Si se recibe un valor null, es que en este momento
* no hay ningún caso seleccionado y los campos vuelven a su
* estado por defecto.<br>Este método se invoca cuando se pulsa
* en un registro de la tabla de casos.
* @param caso El Caso que se ha seleccionado.
*/
public void seleccionarCaso(Caso caso) {
casoSeleccionado = caso;
if (casoSeleccionado == null) {
jtNombre.setText(null);
jtApellidos.setText(null);
comboGenero.setSelectedIndex(0);
jsEdad.setValue(18);
checkConfirmado.setSelected(false);
comboEstado.setSelectedIndex(0);
}
else {
jtNombre.setText(casoSeleccionado.getNombre());
jtApellidos.setText(casoSeleccionado.getApellidos());
comboGenero.setSelectedItem(casoSeleccionado.getGenero());
jsEdad.setValue(casoSeleccionado.getEdad());
checkConfirmado.setSelected(casoSeleccionado.isConfirmado());
comboEstado.setSelectedItem(casoSeleccionado.getEstado());
}
activarCampos(false);
btModificar.setEnabled(true);
btEliminar.setEnabled(true);
btGuardar.setEnabled(false);
btGrabar.setEnabled(true);
}
}

La tercera clase, PanelTabla, es solo un panel que muestra una tabla con los datos de los casos registrados.
Esta tabla se construye a partir de los datos del ArrayList que pusimos en la clase GestionCasos, así que para facilitar esta comunicación recibirá una referencia a este ArrayList mediante el constructor de la clase.

Para simplificar el código, el modelo de la tabla está diseñado para que las celdas no se puedan editar.
La tabla solo mostrará los Casos y permitirá seleccionarlos. Pero para modificar los valores, habrá que usar los campos del formulario.

Código: [Seleccionar]
package gui;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.MouseListener;
import java.util.ArrayList;

import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingConstants;
import javax.swing.border.BevelBorder;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;

import casos.Caso;

public class PanelTabla extends JPanel{

private ArrayList<Caso> casos; //Referencia al ArrayList de GestionCasos
private MiTabla tablaCovid;

public PanelTabla(ArrayList<Caso> casosCovid) {
casos = casosCovid;
construirTabla();

JScrollPane sp = new JScrollPane(tablaCovid);
sp.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
sp.setPreferredSize(new Dimension(630, 300));
sp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

add(sp);
setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createEmptyBorder(10, 10, 10, 10),
BorderFactory.createRaisedSoftBevelBorder()));
}

private class MiTabla extends JTable {

public MiTabla(String[][] datos, String[] nombresColumna) {
super(new DefaultTableModel(datos, nombresColumna) {
@Override
public boolean isCellEditable(int row, int column) {
return false; //Las celdas de esta tabla NO serán editables
}
});
//Pedimos al render que centre los textos en sus celdas.
DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment(SwingConstants.CENTER);
setDefaultRenderer(Object.class, centerRenderer);
//Cambiamos alguna fuente y color para los datos de la tabla
setFont(new Font("Verdana", Font.PLAIN , 12));
setForeground(Color.BLUE);
//También cambiamos estilo de fuente a la cabecera
JTableHeader cabecera = getTableHeader();
cabecera.setFont(new Font("Verdana", Font.BOLD , 14));
setAutoResizeMode(AUTO_RESIZE_OFF);
getColumnModel().getColumn(0).setPreferredWidth(135);
getColumnModel().getColumn(1).setPreferredWidth(160);
getColumnModel().getColumn(2).setPreferredWidth(80);
getColumnModel().getColumn(3).setPreferredWidth(50);
getColumnModel().getColumn(4).setPreferredWidth(50);
getColumnModel().getColumn(5).setPreferredWidth(130);
}
}

private void construirTabla() {

final String[] CABECERA = new String[] {"NOMBRE", "APELLIDOS", "GENERO", "EDAD",
"CONF.", "ESTADO"};
//Matriz para datos de la tabla
String[][] datos = new String[casos.size()][6];
for (int fila = 0; fila < datos.length; fila++) {
datos[fila] = casos.get(fila).datosArray();
}
tablaCovid = new MiTabla(datos, CABECERA);
}

public void actualizarTabla() {
DefaultTableModel modelo = (DefaultTableModel) tablaCovid.getModel();
modelo.setRowCount(0);

for (Caso caso: casos)
modelo.addRow(caso.datosArray());
tablaCovid.setModel(modelo);
}

public int getSeleccionado() {
return tablaCovid.getSelectedRow();
}

/**
* Recibe el "listener" que ha aplicarse en esta tabla.<br>
* Este listener detectará que registro de la tabla ha sido seleccionado y
* está escrito en la clase Main, desde donde se puede
* interactuar con las clases necesarias.
* @param listener MouseListener para detectar que registro ha recibido un click de raton.
*/
public void setTablaListener(MouseListener listener) {
tablaCovid.addMouseListener(listener);
}

}

Con estas tres clases, que son tres paneles, se construye el JFrame de la aplicación.
Este JFrame se crea en la clase Main principal y lo vemos en el siguiente mensaje.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 680
    • Ver Perfil
Re: proyecto
« Respuesta #6 en: 02 de Julio 2021, 12:58 »
La clase Main reúne los tres paneles de la "Vista" y el gestor de casos del "Modelo" en una única clase para que puedan interactuar entre ellos, así que esta clase cumpliría la función de "Controlador".

Es un JFrame y además tiene el código de los listeners que aplicaremos a algunos botones y a la tabla. Estos listeners es necesario escribirlos aquí porque es donde Vista y Modelo comparten el mismo ámbito y es posible interactuar entre ellos.

Por ejemplo, cuando pulsamos el botón "Eliminar":
- hay que pedirle al gestor de casos que elimine el caso seleccionado del ArrayList
- hay que pedirle a la tabla que se actualice para dejar de mostrar el caso eliminado
- hay que pedirle al panel de datos (formulario) que deje de mostrar los datos del caso eliminado.

Si la acción (ActionListener) que hace todo esto la hubieramos escrito en la clase PanelDatos, donde se encuentra el botón que ha de realizar esta acción, no sería posible porque desde PanelDatos no hay referencia con la tabla, por ejemplo, y no se le podría pedir que se actualizase.

Por eso estos Listeners conviene escribirlos en la clase que haga la función de "Controlador", la clase Main en nuestro caso.

Código: [Seleccionar]
package gui;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.SwingUtilities;

import casos.*;

public class Main extends JFrame{

private GestionCasos gestor;
private PanelDatos pnDatos;
private PanelTabla pnTabla;

public Main() {

gestor = new GestionCasos();
pnDatos = new PanelDatos();
pnDatos.btEliminar.addActionListener(new AccionEliminar());
pnDatos.btGuardar.addActionListener(new AccionGuardar());
pnDatos.btGrabar.addActionListener(new AccionGrabar());
pnTabla = new PanelTabla(gestor.registroCasos);
pnTabla.setTablaListener(new TablaListener());

JPanel pnNorte = new JPanel(); //Este panel contendrá el panel con imagen
pnNorte.add(new PanelImagen("gui/covid.png"));

JPanel pnCentro = new JPanel(); //Este panel reune el formulario y la tabla
pnCentro.setLayout(new BoxLayout(pnCentro, BoxLayout.Y_AXIS));
pnCentro.add(pnDatos);
pnCentro.add(new JSeparator());
pnCentro.add(pnTabla);
pnCentro.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));

setLayout(new BorderLayout());
add(pnNorte, BorderLayout.NORTH);
add(pnCentro, BorderLayout.CENTER);

setTitle("Registro Covid-19");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setResizable(false);
setLocationRelativeTo(null);
setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Main();
}
});
}

//Listeners
private class AccionGuardar implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
//Pedimos Caso al formulario
Caso caso = pnDatos.getCaso();
if (caso != null) { //Si datos de formulario son incompletos, no habría Caso

if (pnDatos.esModificacion())
gestor.modificarCaso(caso, pnTabla.getSeleccionado());
else
gestor.registrarCaso(caso);

pnTabla.actualizarTabla();
}
}
}

private class AccionGrabar implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
gestor.guardarRegistro();
}
}

private class AccionEliminar implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
int respuesta = JOptionPane.showConfirmDialog(null, "¿Eliminar el registro seleccionado?",
"Eliminar Registro", JOptionPane.YES_NO_OPTION);
if (respuesta == JOptionPane.YES_OPTION) {
int seleccionado = pnTabla.getSeleccionado();
gestor.eliminarCaso(seleccionado);
pnTabla.actualizarTabla();
pnDatos.seleccionarCaso(null);
JOptionPane.showMessageDialog(null, "Registro Eliminado."
+ "\nRecuerde grabar en disco para que el cambio sea persistente",
"Eliminar Registro", JOptionPane.INFORMATION_MESSAGE);
}
}
}

/**
* Este es el Listener para la tabla.
* Simplemente detecta que Caso de la tabla ha sido clickado
* y se lo comunica al panel de datos para que configure ese Caso
* como seleccionado.
*/
private class TablaListener implements MouseListener {
@Override
public void mouseClicked(MouseEvent e) {
int seleccionado = pnTabla.getSeleccionado();
pnDatos.seleccionarCaso(gestor.getCaso(seleccionado));
}

@Override
public void mousePressed(MouseEvent e) { }

@Override
public void mouseReleased(MouseEvent e) { }

@Override
public void mouseEntered(MouseEvent e) { }

@Override
public void mouseExited(MouseEvent e) { }
}
}


Y con esto ya tendríamos la aplicación completada.
No he comentado detalladamente cada aspecto del programa porque llevaría mucho tiempo, aquello que no se entienda, haced aquí la pregunta y lo explico.

Adjunto un zip con los packages del código.

La imagen que utilicé es esta: https://i.ibb.co/TgG6QK0/covid.png

Un saludo.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

jose alvarez

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 5
    • Ver Perfil
Re: AYUDA
« Respuesta #7 en: 17 de Julio 2021, 02:53 »
tengo este nuevo programa en netbeans y necesito de sus ayuda

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 680
    • Ver Perfil
Re: proyecto
« Respuesta #8 en: 17 de Julio 2021, 11:25 »
Pues es similar al anterior, solo que con Productos en lugar de Casos

Comienza por pensar como será la clase para modelar los productos.
Hay varios productos: juguetes, equipos, celulares, muebles...

Se podría hacer una clase para cada tipo, pero como son todos exactamente iguales en cuanto atributos y métodos, parece más eficiente hacer una sola clase llamada Producto y usar un atributo String para distinguir el tipo de producto del que se trata.
Estos podrían ser los atributos:
Código: [Seleccionar]
String codigo;
String tipoProducto; //juguetes, equipos, celulares, muebles...
String marca;
String modelo;
float precioCompra;
float precioVenta;
int stock;

Escribe esta clase y vamos continuando a partir de ahí.

De hecho, se pueden replicar los pasos que yo seguí en el ejercicio anterior.
- Hacer clase Producto.
- Hacer clase que gestiona los Productos
- Diseñar la interfaz
- Aplicar funcionalidad a la interfaz para que interactue con la gestión de productos.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

jose alvarez

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 5
    • Ver Perfil
Re: proyecto
« Respuesta #9 en: 17 de Julio 2021, 17:28 »
buen dia. he tratado de hacer paso a paso el proyecto sobre covid 19 pero aun asi no me lo ejecuta me aprece error,  solo que no se como subirlo por aca para que lo revicen y me orienten como hacerlo

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 680
    • Ver Perfil
Re: proyecto
« Respuesta #10 en: 18 de Julio 2021, 00:28 »
Puedes crear un zip con tus clases .java y adjuntarla a tu mensaje.
O prueba a copiar y pegar el mensaje de error que te aparece, quizás con eso baste para saber que está ocurriendo.

Al margen de esto,  puedes escribir igualmente la clase Producto y una clase que gestione los productos.

La clase que gestione los productos (con un ArrayList de Productos) es posible que no quede completa y se modifique posteriormente según se va construyendo la interfaz.
Pero funciones como añadir un Producto, eliminarlo, guardar y leer de disco... se pueden hacer ya, porque su código es independiente de si luego se usa o no una interfaz, ni de que diseño tendrá.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".