501
Aprender a programar desde cero / Re: Ayuda con mi proyecto!
« en: 21 de Febrero 2021, 01:04 »
El siguiente paso sería crea el PanelEventos, con los botones para crear evento, cancelar, modificar, visualizar y volver al menú principal.
Será prácticamente igual que PanelUsuarios, pero con 5 botones en lugar de 4.
![](https://i.ibb.co/rFc0SwW/imagen-2021-02-21-003935.png)
De momento, solo funcionará el botón para regresar al menú principal:
Para poder visualizar este nuevo panel en la interfaz, primero nos vamos a la clase PanelPrincipal y le añadimos un método para poder dotar de un ActionListener al botón "Gestionar Eventos"
Esta acción que recibirá, ha de ser escrita en la clase principal JavaTicket
Pero claro, para que esto funcione, primero hay que declarar este panel en la zona de atributos de esta clase:
Inicializar este panel, en el método iniciarVista() y de paso hacerle llegar el único ActionListener del que disponemos para él, el de volver al menú principal.
Que ya lo tenemos escrito porque es el mismo que el del botón "volver" del panel de gestión de usuarios.
Además lo agregamos al cardLayout del "panelActivo", etiquetándolo como "evento" para identificarlo
Bien, ya tenemos panel para gestionar eventos. Ahora necesitamos un Gestor de Eventos, una clase que será casi idéntica a la clase GestionUsuarios.
Un ArrayList para añadir Eventos y poder guardarlos en disco para luego recuperarlos.
No le he añadido un método para eliminar eventos, porque leyendo el enunciado (cada vez que lo leo descubro algo nuevo) resulta que los eventos no se borran, SE CANCELAN.
Es decir, un evento que no se va a producir, se marca como cancelado, pero ha de seguir existiendo en el ArrayList.
Esto me ha hecho cambiar, otra vez más, la clase Evento a quién le he añadido un boolean para poder marcar como cancelado un evento.
Además del atributo, dos métodos para interactuar con él.
Y no solo eso, puesto que vamos a guardarlos en disco, ha de implementarse la interfaz Serializable
Todos estos cambios están en Google Drive
Será prácticamente igual que PanelUsuarios, pero con 5 botones en lugar de 4.
![](https://i.ibb.co/rFc0SwW/imagen-2021-02-21-003935.png)
De momento, solo funcionará el botón para regresar al menú principal:
Código: [Seleccionar]
public final class PanelEventos extends JPanel{
private JButton btNuevo;
private JButton btCancelar;
private JButton btEditar;
private JButton btVisualizar;
private JButton btVolver;
public PanelEventos() {
iniciarBotones();
setLayout(new BorderLayout());
add(new PanelTitulo(), BorderLayout.NORTH);
JPanel pnCentro = new JPanel();
pnCentro.setLayout(new BoxLayout(pnCentro, BoxLayout.Y_AXIS));
//Tres botones en la fila superior
JPanel filaSup = new JPanel();
filaSup.setLayout(new GridLayout(1, 3, 10, 10));
filaSup.add(new PanelBoton(btNuevo, "Crear Evento"));
filaSup.add(new PanelBoton(btCancelar, "Cancelar Evento"));
filaSup.add(new PanelBoton(btEditar, "Editar EVento"));
//Dos botones en la fila inferior
JPanel filaInf = new JPanel();
filaInf.setLayout(new GridLayout(1, 2, 10, 10));
filaInf.add(new PanelBoton(btVisualizar, "Visualizar Evento"));
filaInf.add(new PanelBoton(btVolver, "Volver a menú principal"));
pnCentro.add(filaSup);
pnCentro.add(filaInf);
pnCentro.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
add(pnCentro, BorderLayout.CENTER);
}
private void iniciarBotones() {
btNuevo = new JButton();
btNuevo.setIcon(
new ImageIcon(PanelPrincipal.class.getClassLoader().getResource("img/crearTicket.png")));
btNuevo.setFocusPainted(false);
btCancelar = new JButton();
btCancelar.setIcon(
new ImageIcon(PanelPrincipal.class.getClassLoader().getResource("img/cancelarTicket.png")));
btCancelar.setFocusPainted(false);
btEditar = new JButton();
btEditar.setIcon(
new ImageIcon(PanelPrincipal.class.getClassLoader().getResource("img/modificarTicket.png")));
btEditar.setFocusPainted(false);
btVisualizar = new JButton();
btVisualizar.setIcon(
new ImageIcon(PanelPrincipal.class.getClassLoader().getResource("img/visualizarTicket.png")));
btVisualizar.setFocusPainted(false);
btVolver = new JButton();
btVolver.setIcon(
new ImageIcon(PanelPrincipal.class.getClassLoader().getResource("img/volver.png")));
}
public void setAccionVolver(ActionListener accion) {
btVolver.addActionListener(accion);
}
private class PanelTitulo extends JPanel {
public PanelTitulo() {
JLabel titulo = new JLabel("Administrar Eventos");
titulo.setFont(new Font("Verdana", Font.ITALIC, 32));
JPanel pnBienvenido = new JPanel();
pnBienvenido.add(titulo);
pnBienvenido.setBorder(BorderFactory.createLoweredSoftBevelBorder());
add(pnBienvenido);
}
}
private class PanelBoton extends JPanel {
public PanelBoton(JButton boton, String texto) {
setLayout(new BorderLayout());
add(boton, BorderLayout.CENTER);
JLabel etTexto = new JLabel(texto);
etTexto.setFont(new Font("Verdana", Font.BOLD ,18));
JPanel pnTexto = new JPanel();
pnTexto.add(etTexto);
add(pnTexto, BorderLayout.SOUTH);
setBorder(
BorderFactory.createCompoundBorder(BorderFactory.createRaisedSoftBevelBorder(),
BorderFactory.createEmptyBorder(15, 15, 15, 15)));
}
}
}
Para poder visualizar este nuevo panel en la interfaz, primero nos vamos a la clase PanelPrincipal y le añadimos un método para poder dotar de un ActionListener al botón "Gestionar Eventos"
Código: [Seleccionar]
public void setAccionGestionEventos(ActionListener accion) {
btEventos.addActionListener(accion);
}
Esta acción que recibirá, ha de ser escrita en la clase principal JavaTicket
Código: [Seleccionar]
private class AccionGestionarEventos implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
cardLayout.show(panelActivo, "evento");
}
}
Esta acción consiste en pedir al cardLayout, que en el "panel activo" muestre el panel de eventos, que está etiquetado como "evento".Pero claro, para que esto funcione, primero hay que declarar este panel en la zona de atributos de esta clase:
Citar
public final class JavaTicket extends JFrame{
//Partes del MODELO
private GestorUsuarios gestorUsuarios;
private Usuario usuarioLogueado;
//Partes de la VISTA
private DialogoLogin dialogoLogin;
private PanelPrincipal pnPrincipal;
private PanelEventos pnEventos;
private PanelUsuarios pnUsuarios;
private CardLayout cardLayout;
private JPanel panelActivo;
Inicializar este panel, en el método iniciarVista() y de paso hacerle llegar el único ActionListener del que disponemos para él, el de volver al menú principal.
Que ya lo tenemos escrito porque es el mismo que el del botón "volver" del panel de gestión de usuarios.
Además lo agregamos al cardLayout del "panelActivo", etiquetándolo como "evento" para identificarlo
Citar
private void iniciarVista() {
//composicion panel principal
pnPrincipal = new PanelPrincipal();
pnPrincipal.setAccionGestionEventos(new AccionGestionarEventos());
pnPrincipal.setAccionGestionUsuario(new AccionGestionarUsuarios());
//Composicion panel eventos
pnEventos = new PanelEventos();
pnEventos.setAccionVolver(new AccionVolver());
//Composicion panel usuarios
pnUsuarios = new PanelUsuarios();
pnUsuarios.setAccionNuevo(new AccionNuevo());
pnUsuarios.setAccionModificar(new AccionModificar());
pnUsuarios.setAccionEliminar(new AccionBorrar());
pnUsuarios.setAccionVolver(new AccionVolver());
cardLayout = new CardLayout();
panelActivo = new JPanel();
panelActivo.setLayout(cardLayout);
panelActivo.add(pnPrincipal, "principal");
panelActivo.add(pnEventos, "evento");
panelActivo.add(pnUsuarios, "usuarios");
dialogoLogin = new DialogoLogin(this, true, gestorUsuarios);
dialogoLogin.setAccionEnviar(new AccionEnviarLogin());
dialogoLogin.setVisible(true);
}
Bien, ya tenemos panel para gestionar eventos. Ahora necesitamos un Gestor de Eventos, una clase que será casi idéntica a la clase GestionUsuarios.
Un ArrayList para añadir Eventos y poder guardarlos en disco para luego recuperarlos.
Código: [Seleccionar]
public final class GestorEventos {
private final File FICHERO_EVENTOS = new File("C:/JavaTicket/eventos.dat");
private ArrayList<Evento> eventos;
public GestorEventos() {
cargarEventos();
}
@SuppressWarnings("unchecked")
private void cargarEventos() {
if (FICHERO_EVENTOS.exists()) {
ObjectInputStream ois;
try {
ois = new ObjectInputStream(new FileInputStream(FICHERO_EVENTOS));
Object aux = ois.readObject();
if (aux instanceof ArrayList) {
eventos = (ArrayList<Evento>) aux;
}
else {
JOptionPane.showMessageDialog(null, "No se reconocen los tipos de dato del fichero: "
+ FICHERO_EVENTOS.getPath(), "Leer eventos", JOptionPane.WARNING_MESSAGE);
eventos = new ArrayList<Evento>();
}
ois.close();
} catch (FileNotFoundException e) {
JOptionPane.showMessageDialog(null, "No se encuentra fichero de Eventos en ruta: "
+ FICHERO_EVENTOS.getPath(), "Leer eventos", JOptionPane.WARNING_MESSAGE);
} catch (IOException e) {
JOptionPane.showMessageDialog(null, "No se puede acceder a fichero de Eventos en ruta: "
+ FICHERO_EVENTOS.getPath(), "Leer eventos", JOptionPane.WARNING_MESSAGE);
} catch (ClassNotFoundException e) {
JOptionPane.showMessageDialog(null, "Objeto de clase desconocida en fichero: "
+ FICHERO_EVENTOS.getPath(), "Leer eventos", JOptionPane.WARNING_MESSAGE);
}
}
else
eventos = new ArrayList<Evento>();
}
public void guardarUsuarios() {
try {
if (!FICHERO_EVENTOS.exists()) {
File carpeta = new File("C:/JavaTicket");
carpeta.mkdirs();
FICHERO_EVENTOS.createNewFile();
}
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FICHERO_EVENTOS));
oos.writeObject(eventos); //Guardamos el ArrayList
oos.close();
} catch (FileNotFoundException e) {
JOptionPane.showMessageDialog(null, "No se encuentra fichero de Eventos en ruta: "
+ FICHERO_EVENTOS.getPath(), "Guardar Eventos", JOptionPane.WARNING_MESSAGE);
} catch (IOException e) {
JOptionPane.showMessageDialog(null, "No se puede acceder a fichero de Eventos en ruta: "
+ FICHERO_EVENTOS.getPath(), "Guardar Eventos", JOptionPane.WARNING_MESSAGE);
}
}
public boolean agregarEvento(Evento evento) {
if (eventos.contains(evento)) {
JOptionPane.showMessageDialog(null, "Este Evento ya está registrado",
"Registrar nuevo Evento", JOptionPane.WARNING_MESSAGE);
return false;
}
else
return eventos.add(evento);
}
}
No le he añadido un método para eliminar eventos, porque leyendo el enunciado (cada vez que lo leo descubro algo nuevo) resulta que los eventos no se borran, SE CANCELAN.
Es decir, un evento que no se va a producir, se marca como cancelado, pero ha de seguir existiendo en el ArrayList.
Esto me ha hecho cambiar, otra vez más, la clase Evento a quién le he añadido un boolean para poder marcar como cancelado un evento.
Además del atributo, dos métodos para interactuar con él.
Y no solo eso, puesto que vamos a guardarlos en disco, ha de implementarse la interfaz Serializable
Citar
public abstract class Evento implements Serializable{
private String codigo;
private String titulo;
private String descripcion;
private LocalDate fecha;
protected double renta; //Protected porque algunas clases hijas necesitan verla para calcular seguro
private boolean cancelado;
public Evento(String codigo, String titulo, String descripcion, LocalDate fecha, double renta) {
this.codigo = codigo;
this.titulo = titulo;
this.descripcion = descripcion;
this.fecha = fecha;
this.renta = renta;
cancelado = false;
}
public String getCodigo() {
return codigo;
}
public void setCodigo(String codigo) {
this.codigo = codigo;
}
public String getTitulo() {
return titulo;
}
public void setTitulo(String titulo) {
this.titulo = titulo;
}
public String getDescripcion() {
return descripcion;
}
public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
}
public LocalDate getFecha() {
return fecha;
}
public void setFecha(LocalDate fecha) {
this.fecha = fecha;
}
public double getRenta() {
return renta;
}
public void setRenta(double renta) {
this.renta = renta;
}
public boolean estaCancelado() {
return cancelado;
}
public void setCancelar(boolean cancelar) {
cancelado = cancelar;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Evento) {
Evento otroEvento = (Evento)obj;
return otroEvento.codigo.equals(codigo);
}
else
return false;
}
}
Todos estos cambios están en Google Drive