Autor Tema: proyecto Ticket enumeraciones clase abstracta final recursiva Swing #codigoJava  (Leído 9539 veces)

Demo8v

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 12
    • Ver Perfil
Re: Ayuda con mi proyecto!
« Respuesta #20 en: 21 de Febrero 2021, 19:55 »
Okay eso lo he hecho, pero cuando intento correrlo me tira un mensaje diciendo: "Error: no se ha encontrado o cargado la clase principal gui.JavaTicket"
No se si es que me hace falta descargar e integrar algo del archivo de google drive ya que ahi me aparece una carpeta con el nombre "bin" y entre otras cosas como ".classpath", una carpeta con el nombre "settings" y ".project".

« Última modificación: 21 de Febrero 2021, 19:57 por Demo8v »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re: Ayuda con mi proyecto!
« Respuesta #21 en: 21 de Febrero 2021, 20:22 »
Pues no se... :-\

Otra forma, más laboriosa pero que debería funcionar..., sería crear los packages y luego crear las clases una a una.
No copiar el archivo .java, sino desde NetBeans ir creando clases con el mismo nombre.

Luego lo que harías sería copiar el texto de los .java del zip, y pegar ese texto en las clases que vas creando dentro de NetBeans.

Es muy laborioso, pero así te aseguras de que las clases creadas, NetBeans las tiene bien registradas en ese proyecto.
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: 989
    • Ver Perfil
Re: Ayuda con mi proyecto!
« Respuesta #22 en: 21 de Febrero 2021, 21:39 »
He tenido algo de tiempo para añadir la funcionalidad de Crear un Evento.

Al igual que con la creación de usuarios, usamos un JDialog con el formulario necesario para introducir los datos.
Pero esta vez es un poco más difícil.
Los eventos tienen una serie de atributos comunes, pero luego hay otros que son propios para cada tipo de evento.
Para no hacer tres formularios distintos, he hecho uno dividido en dos partes.

Una parte contiene los campos para los datos comunes. Son los que rodeo de amarillo en la imagen de abajo.
La otra parte, es un cardLayout que irá alternando entre tres formularios distintos, según el tipo de evento que señalemos en un ComboBox.
Es la parte que señalo en rojo:


Así con una sola clase podemos crear eventos de los tres tipos, pero esto implica que la clase va a tener bastante código debido a la gran cantidad de componentes Swing que intervienen.

Fijémonos en la parte amarilla, los atributos comunes.
Tiene el campo con el ID de evento. Este id no es editable, lo va a generar automáticamente el Gestor de Eventos con el formato EV000000, EV000001, EV000002.., y así sucesivamente
Tiene un campo de texto para el título un area de texto para la descripción.

Luego tiene un panel con tres Spinner para la fecha. Este panel es una clase que he escrito por separado y me ha quedado bastante bien, aunque en realidad lo más fácil habría sido poner un campo de texto y dar por hecho que el usuario va a introducir fechas correctas que podamos leer como simples String.
Pero en el enunciado he visto que para algunas acciones habrá que comparar fechas, así que no he querido dejar este campo sin asegurar "su calidad", es decir, que vamos a tener fechas válidas, nada de 45/23/2020 o alguna burrada similar.

Para esto, he escrito una clase que valiéndose de la clase LocalDate, comprueba en todo momento el año y mes que se está seleccionando, para decidir en tiempo real cuál es el valor límite para el Spinner del día.
Por ejemplo, si se marca mes valor 2 (Febrero) el límite será 28, pero si el año marcado es bisiesto, entonces el límite sería 29.
Es menos difícil de lo que parece, solo hay que manejar LocalDate (que es muy sencilla) y asignarle unos ChangeListener a los Spinner del mes y del año para que actúen sobre día cuando estos reciban algún cambio en su valor.

Código: [Seleccionar]
public class PanelFecha extends JPanel{

private JSpinner dia;
private SpinnerNumberModel modeloDia;
private JSpinner mes;
private SpinnerNumberModel modeloMes;
private JSpinner anio;
private SpinnerNumberModel modeloAnio;
private Font fuentePlana = new Font("Verdana", Font.PLAIN, 20);
private Font fuenteNegrita = new Font("Verdana", Font.PLAIN, 20);
private LocalDate fechaSelec;

public PanelFecha() {
iniciarFecha();
add(new PanelSpinner("Dia: ", dia));
add(new PanelSpinner("Mes: ", mes));
add(new PanelSpinner("Año: ", anio));
TitledBorder titulo = BorderFactory.createTitledBorder("Fecha");
titulo.setTitleFont(fuentePlana);
setBorder(titulo);
}

/**
* Retorna la fecha actualmente seleccionada
* en este panel.
* @return Fecha seleccionada.
*/
public LocalDate getFecha() {
int diaSel = (int) dia.getValue();
int mesSel = (int) mes.getValue();
int anioSel = (int) anio.getValue();
return LocalDate.of(anioSel, mesSel, diaSel);
}

/**
* El panel de fecha se inicia con la fecha actual
*/
private void iniciarFecha() {
fechaSelec = LocalDate.now();
//Año
anio = new JSpinner();
anio.setFont(fuentePlana);
modeloAnio = new SpinnerNumberModel();
modeloAnio.setMinimum(fechaSelec.getYear());
modeloAnio.setValue(fechaSelec.getYear());
anio.setModel(modeloAnio);
anio.addChangeListener(new ActualizaModeloDia());
//Mes
mes = new JSpinner();
mes.setFont(fuentePlana);
modeloMes = new SpinnerNumberModel();
modeloMes.setMinimum(1);
modeloMes.setMaximum(12);
modeloMes.setValue(fechaSelec.getMonthValue());
mes.setModel(modeloMes);
mes.addChangeListener(new ActualizaModeloDia());
//Dia
dia = new JSpinner();
dia.setFont(fuentePlana);
modeloDia = new SpinnerNumberModel();
modeloDia.setMinimum(1);
modeloDia.setMaximum(calcularMaximoDia());
modeloDia.setValue(fechaSelec.getDayOfMonth());
dia.setModel(modeloDia);
}

/**
* Calcula el máximo valor seleccionable
* para el campo dia.
* Este valor puede ser 31, 30, 28 ó 29 según
* el mes seleccionado y según si el año es
* bisiesto o no.
*/
private int calcularMaximoDia() {
switch((int)mes.getValue()) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
case 2: //Febrero, depende de si es año bisiesto
int year = (int) anio.getValue();
if ((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0)))
return 29;
else
return 28;
default:
return 30;
}
}

private class PanelSpinner extends JPanel {

public PanelSpinner(String texto, JSpinner spinner) {
JLabel etiq = new JLabel(texto);
etiq.setFont(fuenteNegrita);
add(etiq);
add(spinner);
setBorder(BorderFactory.createRaisedSoftBevelBorder());
}
}

/**
* Este Listener se activa cuando se cambian la fecha
* y ajusta el modelo del Spinner del dia según los valores actuales.
* Este modelo ha de cambiar según si selecciona un año bisiesto
* y/o el valor del mes
*/
private class ActualizaModeloDia implements ChangeListener {
@Override
public void stateChanged(ChangeEvent e) {
modeloDia.setMaximum(calcularMaximoDia());
/*
* Tras actualizar valor máximo para dia, comprobamos su
* valor actual por si ha de ser corregido
*/
if ((int) modeloDia.getValue() > (int)modeloDia.getMaximum())
modeloDia.setValue(modeloDia.getMaximum());
}
}

}


Ahora fijémonos en la parte en rojo de la imagen anterior.
Como he dicho, ese panel es un cardLayout que irá cambiando según el tipo de evento seleccionado.
Para el deportivo, tenemos los dos nombres de los equipos, un valor para el aforo y un JComboBox para el tipo de deporte.
Este JComboBox, se construye usando el enum TipoDeporte que escribimos al principio de todo.
Código: [Seleccionar]
tipoDeporte = new JComboBox<TipoDeporte>(TipoDeporte.values());
Si seleccionamos el tipo Musical, la parte inferior cambia y nos muestra tres campos distintos.



El aforo máximo, un ComboBox para el tipo de musica (también construido a partir del enum TipoMusica) y un campo que muestra el valor del seguro que se ha de pagar como extra.
Este campo no es editable y se autocalcula según el valor del campo renta.
El enunciado dice que es el 30% del importe de la renta, así que cada vez que el usuario cambia el valor del campo renta, este campo se actualiza con el nuevo cálculo.
Este valor es informativo, no se guardará cuando vayamos a crear el evento, porque la clase evento Musical ya la escribimos con un método que calcula por su propia cuenta el importe de este seguro.
Por eso le pusimos un valor constante llamado CUOTA_SEGURO, con valor 30 (30%) para hacer los cálculos con dicha constante.
De hecho, esta constante es pública y estática:
Citar
public final class Musical extends Evento{

   //Constante que establece el limite de personas que pueden asistir a este evento
   private final int AFORO_MAXIMO = 25000;
   //Constante que establece el % de cuota de seguro que se cobra sobre la renta acordada
   //Es publica y estática para que la interfaz gráfica conozca el valor de esta cuota
   public static final double CUOTA_SEGURO = 30d; //30%

Así, en este formulario, podemos acceder a esta constante para que se autocalcule el valor del seguro en pantalla.
Esto lo conseguimos con un FocusListener.
Cuando el campo renta pierde "el foco", es decir, hemos escrito algo y nos hemos pasado a otro campo, entonces se recuperar lo que se haya escrito y se calcula el importe del seguro.
Así siempre está actualizado.
Marco en negrita la línea donde llamamos a la constante de la clase Musical para saber el porcentaje de cuota que ha de pagarse por el seguro.
Además controlamos una posible excepción que ocurriría en el caso de que el campo renta estuviera vacío o tuviera letras en lugar de números y por tanto fallaría la conversión a double.

Citar
   private class AccionCalcularSeguroMusical implements FocusListener {
      @Override
      public void focusGained(FocusEvent e) {
         //Nada que hacer aquí
      }
      @Override
      public void focusLost(FocusEvent e) {
         /*
          * Cuando el campo renta pierde el foco,
          * se calcula el importe del seguro para
          * el evento musical en base al valor de la renta   
          */
         try {
            double renta = Double.parseDouble(campoRenta.getText());
            double importe = renta * Musical.CUOTA_SEGURO / 100;
            campoSeguroMusical.setText(String.format("%.2f", importe));
         }
         catch(Exception ex) {
            //Si renta no tiene valor numérico, se produce excepcion
            campoSeguroMusical.setText(null);
         }
      }
   }

Para los eventos religiosos, tenemos solo dos campos:

Un Spinner para el aforo y un campo de texto para el importe del seguro. En los eventos religiosos, este importe es siempre el mismo, independientemente de la renta.
En su clase, figura también como una constante pública y estática.

Citar
public final class Religioso extends Evento{

   //Constante que establece el limite de personas que pueden asistir a este evento
   private final int AFORO_MAXIMO = 30000;
   //Constante que establece el importe fijado como seguro por desgaste de la grama
   public static final int CUOTA_SEGURO = 2000; //Public y estático, no será necesario usar getter para acceder a este valor

La intención de hacer constantes públicas para estos valores es porque, si esto fuera un programa real, en caso de que estas cuotas quisieran ser modificadas bastaría con cambiar el valor solo dentro de sus clases para que los cambios automáticamente se replicaran en el resto de clases.
Si pusiéramos "a mano" estos valores en los formularios, habría que recorrer las clases que usen estos valores para actualizarlos las nuevas cuotas.

En un programa real, donde pueden haber decenas de clases y formularios, esto daría mucho trabajo y pie a errores si algunas clases no fueran actualizadas respecto a las demás.
(Sigue a continuación...)
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: 989
    • Ver Perfil
Re: Ayuda con mi proyecto!
« Respuesta #23 en: 21 de Febrero 2021, 21:49 »
En fin, he explicado como funciona la interfaz de este formulario.
Pongo ahora el código, que como dije, es bastante extenso ya que es un formulario con muchos componentes.
Podría haberlo separado en más clases, pero no se si sería más enrevesado que ponerlo todo junto en una sola (a excepcion del PanelFecha)

Explicarlo al completo puede ser muy tedioso, no tanto por escribirlo, si no para quien luego quiera leerlo.
Así que mejor lo pongo y si alguien tiene preguntas concretas que las haga.

Código: [Seleccionar]
public class DialogoCrearEvento extends JDialog{

private GestorEventos gestorEventos;
private Usuario usuario; //Usuario que va a crear un evento
private Font fuentePlana = new Font("Verdana", Font.PLAIN, 20);
private Font fuenteNegrita = new Font("Verdana", Font.PLAIN, 20);
private JComboBox<String> comboTipoEvento;
//Datos comunes a todos los eventos
private CampoTextoAzul campoCodigo;
private CampoTextoAzul campoTitulo;
private JTextArea areaDescripcion;
private PanelFecha fechaEvento;
private CampoTextoAzul campoRenta;
//Panel y CardLayout para altenar entre los datos extra de cada tipo evento
private PanelExtras panelExtras;
private CardLayout cardLayout = new CardLayout();
//Datos para evento deportivo
private JSpinner maximoDeporte;
private CampoTextoAzul campoEquipo1;
private CampoTextoAzul campoEquipo2;
private JComboBox<TipoDeporte> tipoDeporte;
//Datos para evento musical
private JSpinner maximoMusical;
private JComboBox<TipoMusica> tipoMusical;
private CampoTextoAzul campoSeguroMusical;
//Datos para evento religios
private JSpinner maximoReligioso;
private CampoTextoAzul campoSeguroReligioso;
//Boton para crear
private JButton btCrear;

public DialogoCrearEvento(Frame padre, boolean modal, GestorEventos gestor, Usuario user) {
super(padre, modal);
gestorEventos = gestor;
usuario = user;

iniciarComponentes();
setLayout(new BorderLayout());
add(new PanelTitulo(), BorderLayout.NORTH);
JPanel pnCentro = new JPanel();
pnCentro.setLayout(new BoxLayout(pnCentro, BoxLayout.Y_AXIS));
pnCentro.add(new PanelSelector());
pnCentro.add(new PanelDatosComunes());
pnCentro.add(panelExtras);
add(pnCentro, BorderLayout.CENTER);
add(new PanelBotonCrear(), BorderLayout.SOUTH);

setTitle("Crear Evento");
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
pack();
setResizable(false);
setLocationRelativeTo(null);
setVisible(true);
}

//Métodos
private void iniciarComponentes() {
comboTipoEvento = new JComboBox<String>(new String[] {"Deportivo", "Musical", "Religioso"});
comboTipoEvento.setFont(fuenteNegrita);
comboTipoEvento.setForeground(Color.BLUE);
comboTipoEvento.setBackground(Color.WHITE);
comboTipoEvento.addActionListener(new AccionSeleccionarTipoEvento());
//Componentes comunes
campoCodigo = new CampoTextoAzul(14);
campoCodigo.setEditable(false);
campoCodigo.setText(gestorEventos.getNuevoId());//Este valor lo decide el sistema
campoTitulo = new CampoTextoAzul(14);
areaDescripcion = new JTextArea(5, 22);
areaDescripcion.setFont(fuentePlana);
areaDescripcion.setForeground(Color.BLUE);
fechaEvento = new PanelFecha();
campoRenta = new CampoTextoAzul(10);
campoRenta.addFocusListener(new AccionCalcularSeguroMusical());
//Componentes deportivo
maximoDeporte = new JSpinner();
SpinnerNumberModel modeloDeporte = new SpinnerNumberModel();
modeloDeporte.setMinimum(1);
modeloDeporte.setMaximum(20000);
modeloDeporte.setValue(100);
maximoDeporte.setModel(modeloDeporte);
maximoDeporte.setFont(fuentePlana);
campoEquipo1 = new CampoTextoAzul(14);
campoEquipo2 = new CampoTextoAzul(14);
tipoDeporte = new JComboBox<TipoDeporte>(TipoDeporte.values());
tipoDeporte.setFont(fuenteNegrita);
tipoDeporte.setForeground(Color.BLUE);
tipoDeporte.setBackground(Color.WHITE);
//Componentes musical
maximoMusical = new JSpinner();
SpinnerNumberModel modeloMusical = new SpinnerNumberModel();
modeloMusical.setMinimum(1);
modeloMusical.setMaximum(25000);
modeloMusical.setValue(100);
maximoMusical.setModel(modeloMusical);
maximoMusical.setFont(fuentePlana);
tipoMusical = new JComboBox<TipoMusica>(TipoMusica.values());
tipoMusical.setFont(fuenteNegrita);
tipoMusical.setForeground(Color.BLUE);
tipoMusical.setBackground(Color.WHITE);
campoSeguroMusical = new CampoTextoAzul(8);
campoSeguroMusical.setEditable(false); //Este valor se autocalcula según la renta
//Componentes religioso
maximoReligioso = new JSpinner();
SpinnerNumberModel modeloReligioso = new SpinnerNumberModel();
modeloReligioso.setMinimum(1);
modeloReligioso.setMaximum(30000);
modeloReligioso.setValue(100);
maximoReligioso.setModel(modeloReligioso);
maximoReligioso.setFont(fuentePlana);
campoSeguroReligioso = new CampoTextoAzul(12);
campoSeguroReligioso.setEditable(false);
campoSeguroReligioso.setText(String.valueOf(Religioso.CUOTA_SEGURO)); //El valor del seguro es fijo
//Inicializamos panel de datos extra
panelExtras = new PanelExtras();
//Boton crear
btCrear = new JButton("Crear Evento");
btCrear.setFont(fuenteNegrita);
btCrear.setForeground(Color.BLUE);
btCrear.setFocusPainted(false);
btCrear.addActionListener(new AccionCrearEvento());
}

public void cerrarDialogo() {
dispose();
}

//Clases de componentes Swing
private class CampoTextoAzul extends JTextField {

public CampoTextoAzul(int columnas) {
super(columnas);
setFont(fuentePlana);
setForeground(Color.BLUE);
}
}

//Clases para los distintos paneles
private class PanelTitulo extends JPanel {

public PanelTitulo() {
JLabel titulo = new JLabel("Crear Nuevo Evento");
titulo.setFont(new Font("Verdana", Font.ITALIC, 32));
JPanel pnBienvenido = new JPanel();
pnBienvenido.add(titulo);
pnBienvenido.setBorder(BorderFactory.createLoweredSoftBevelBorder());
add(pnBienvenido);
}
}

private class PanelSelector extends JPanel {
public PanelSelector() {
add(comboTipoEvento);
TitledBorder bordeTitulo = new TitledBorder("Escoja tipo de Evento");
bordeTitulo.setTitleFont(fuentePlana);
setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20),
bordeTitulo));
}
}

private class PanelConEtiqueta extends JPanel {

public PanelConEtiqueta(String textoEtiq, JComponent componente, int flotar) {
JLabel etiqueta = new JLabel(textoEtiq);
etiqueta.setFont(fuenteNegrita);
setLayout(new FlowLayout(flotar));
add(etiqueta);
add(componente);
}
}

private class PanelDatosComunes extends JPanel {

public PanelDatosComunes() {

//Panel superior tendra codigo y titulo evento
JPanel pnSuperior = new JPanel();
pnSuperior.setLayout(new GridLayout(1, 2, 5, 5));
pnSuperior.add(new PanelConEtiqueta("Código: ", campoCodigo, FlowLayout.CENTER));
pnSuperior.add(new PanelConEtiqueta("Título: ", campoTitulo, FlowLayout.CENTER));
//Panel inferior tendrá descripción, fecha y renta
JPanel pnInferior = new JPanel();
pnInferior.setLayout(new GridLayout(1, 2, 5, 5));
//A la izquierda, el area de texto
JPanel pnIzq = new JPanel();
JScrollPane sp = new JScrollPane(areaDescripcion);
pnIzq.add(sp);
TitledBorder titulo = BorderFactory.createTitledBorder("Descripción");
titulo.setTitleFont(fuentePlana);
pnIzq.setBorder(titulo);
//A la derecha, panel fecha y debajo panel renta
JPanel pnDer = new JPanel();
//pnDer.setLayout(new GridLayout(2, 1, 5, 5));
pnDer.setLayout(new BoxLayout(pnDer, BoxLayout.Y_AXIS));
pnDer.add(fechaEvento);
pnDer.add(new PanelConEtiqueta("Renta: ", campoRenta, FlowLayout.CENTER));
pnInferior.add(pnIzq);
pnInferior.add(pnDer);
//Añadimos ambos paneles, uno sobre el otro
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
add(pnSuperior);
add(pnInferior);
setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));
}
}

private class PanelExtras extends JPanel {

private JPanel pnActivo = new JPanel();

public PanelExtras() {
pnActivo.setLayout(cardLayout);
pnActivo.add(new PanelDatosExtraDeportivos(), "Deportivo");
pnActivo.add(new PanelDatosExtraMusical(), "Musical");
pnActivo.add(new PanelDatosExtraReligioso(), "Religioso");
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
add(new JSeparator(JSeparator.HORIZONTAL));
add(pnActivo);
}

public void mostrarPanel(String idPanel) {
cardLayout.show(pnActivo, idPanel);
}
}

private class PanelDatosExtraDeportivos extends JPanel {

public PanelDatosExtraDeportivos() {

setLayout(new GridLayout(2, 2, 5, 10));
add(new PanelConEtiqueta("Equipo 1: ", campoEquipo1, FlowLayout.CENTER));
add(new PanelConEtiqueta("Equipo 2: ", campoEquipo2, FlowLayout.CENTER));
add(new PanelConEtiqueta("Aforo Máximo: ", maximoDeporte, FlowLayout.CENTER));
add(new PanelConEtiqueta("Tipo Deporte: ", tipoDeporte, FlowLayout.CENTER));
setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));
}
}

private class PanelDatosExtraMusical extends JPanel {

public PanelDatosExtraMusical() {
setLayout(new GridLayout(1, 2, 5, 10));
add(new PanelConEtiqueta("Aforo Máximo: ", maximoMusical, FlowLayout.CENTER));
add(new PanelConEtiqueta("Tipo de Música: ", tipoMusical, FlowLayout.CENTER));
add(new PanelConEtiqueta("Seguro contratado: ", campoSeguroMusical, FlowLayout.CENTER));
setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));
}
}

private class PanelDatosExtraReligioso extends JPanel {

public PanelDatosExtraReligioso() {
setLayout(new GridLayout(1, 2, 5, 10));
add(new PanelConEtiqueta("Aforo Máximo: ", maximoReligioso, FlowLayout.CENTER));
add(new PanelConEtiqueta("Seguro contratado: ", campoSeguroReligioso, FlowLayout.CENTER));
setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));

}
}

private class PanelBotonCrear extends JPanel {
public PanelBotonCrear() {
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
add(new JSeparator(SwingConstants.HORIZONTAL));
JPanel pnBoton = new JPanel();
pnBoton.add(btCrear);
pnBoton.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));
add(pnBoton);
}
}

//Clases para los Listener
private class AccionCalcularSeguroMusical implements FocusListener {
@Override
public void focusGained(FocusEvent e) {
//Nada que hacer aquí
}
@Override
public void focusLost(FocusEvent e) {
/*
* Cuando el campo renta pierde el foco,
* se calcula el importe del seguro para
* el evento musical en base al valor de la renta
*/
try {
double renta = Double.parseDouble(campoRenta.getText());
double importe = renta * Musical.CUOTA_SEGURO / 100;
campoSeguroMusical.setText(String.format("%.2f", importe));
}
catch(Exception ex) {
//Si renta no tiene valor numérico, se produce excepcion
campoSeguroMusical.setText(null);
}
}
}

private class AccionSeleccionarTipoEvento implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
panelExtras.mostrarPanel((String) comboTipoEvento.getSelectedItem());
}
}

private class AccionCrearEvento implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
//Recuperamos primero DATOS COMUNES
String idEv = campoCodigo.getText();
String titulo = campoTitulo.getText();
String descripcion = areaDescripcion.getText();
LocalDate fecha = fechaEvento.getFecha();
//A continuación, posible excepcion sin controlar si campoRenta no tiene un valor numérico
double renta = Double.parseDouble(campoRenta.getText());

//Ahora, según el tipo de evento, recuperamos unos datos u otros.
String tipoEvento = (String) comboTipoEvento.getSelectedItem();
switch(tipoEvento) {
case "Deportivo":
int aforoDep = (int) maximoDeporte.getValue();
String nomEquipo1 = campoEquipo1.getText();
String nomEquipo2 = campoEquipo2.getText();
TipoDeporte tipoDep = (TipoDeporte) tipoDeporte.getSelectedItem();
//Podemos crear evento
if (gestorEventos.agregarEvento(new Deportivo(idEv, titulo, descripcion, fecha, renta,
aforoDep, nomEquipo1, nomEquipo2, tipoDep))) {
gestorEventos.guardarEventos();
JOptionPane.showMessageDialog(null, "Evento Deportivo creado", "Nuevo Evento",
JOptionPane.INFORMATION_MESSAGE);
agregarIdAlUsuario(idEv);
dispose();
}
else
eventoRechazado();
break;
case "Musical":
int aforoMus = (int) maximoMusical.getValue();
TipoMusica tipoMus = (TipoMusica) tipoMusical.getSelectedItem();
//Podemos crear evento
if (gestorEventos.agregarEvento(new Musical(idEv, titulo, descripcion, fecha, renta,
aforoMus, tipoMus))) {
gestorEventos.guardarEventos();
JOptionPane.showMessageDialog(null, "Evento Musical creado", "Nuevo Evento",
JOptionPane.INFORMATION_MESSAGE);
agregarIdAlUsuario(idEv);
dispose();
}
else
eventoRechazado();
break;
case "Religioso":
int aforoRel = (int) maximoReligioso.getValue();
//Podemos crear evento
if (gestorEventos.agregarEvento(new Religioso(idEv, titulo, descripcion, fecha, renta,
aforoRel))) {
gestorEventos.guardarEventos();
JOptionPane.showMessageDialog(null, "Evento Religioso creado", "Nuevo Evento",
JOptionPane.INFORMATION_MESSAGE);
agregarIdAlUsuario(idEv);
dispose();
}
else
eventoRechazado();
}

}

private void agregarIdAlUsuario(String id) {
/*
* Para agregar, antes tenemos que castear
* a su clase hija, ya que ahora mismo
* al usuario lo tenemos instanciado
* bajo la clase padre Usuario, que
* no tiene registro de Eventos.
* Solo Administrador y DeContenidos lo tienen
*/
if (usuario instanceof Administrador)
((Administrador) usuario).agregarIdEvento(id);
else
((DeContenidos) usuario).agregarIdEvento(id);
}

private void eventoRechazado() {
JOptionPane.showMessageDialog(null, "No se pudo agregar el Evento", "Nuevo Evento",
JOptionPane.ERROR_MESSAGE);
}

}
}

En la clase principal JavaTicket añadimos un nuevo ActionListener que se encargaría de lanzar este JDialog:
Código: [Seleccionar]
//Acciones para los botones del menu gestionar eventos
private class AccionCrear implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
new DialogoCrearEvento(null, true, gestorEventos, usuarioLogueado);

}
}

Esta acción, se la hacemos llegar al panel de eventos:
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.setAccionCrear(new AccionCrear());
      pnEventos.setAccionVolver(new AccionVolver());
      //Composicion panel usuarios

Quien para poder recibirlo y asignar la acción al botón de Crear, la clase PanelEventos necesita este método:
Código: [Seleccionar]
public void setAccionCrear(ActionListener accion) {
btNuevo.addActionListener(accion);
}

Todo está actualizado en Google Drive

También puede descargarse a partir del archivo adjunto srctopic7890.zip que contiene tanto el código fuente como las imágenes (es necesario estar logado en los foros para poder descargarlo)
« Última modificación: 17 de Abril 2022, 19:06 por Alex Rodríguez »
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

Demo8v

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 12
    • Ver Perfil
Re: Ayuda con mi proyecto!
« Respuesta #24 en: 22 de Febrero 2021, 00:18 »
Disculpa, me aparece un error constante con el metodo isBlank, que puedo hacer al respecto?
No tengo idea del por que no me deja llamarlo, pero por ahora solo lo termine borrando...

Parte de código:

public Usario getusuarioLogin() {
   String username = campoNombre.getText();
   String password = String.valueOf(campoPass.getPassword());
   if (userName == null || userName.isblank() || userName.isEmpty()) {
      java.awt.Toolkit.getDefaultToolkit().beep();
« Última modificación: 17 de Abril 2022, 18:54 por Alex Rodríguez »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re: Ayuda con mi proyecto!
« Respuesta #25 en: 22 de Febrero 2021, 01:39 »
El método isBlank() es relativamente nuevo, fue añadido en Java versión 11 creo..
Si tienes un JDK anterior a esa versión, no lo reconocerá.

Puedes borrarlo, tampoco es vital. Este método lo que hace es comprobar si el String solo contiene espacios en blanco.., por ejemplo, si el usuario si para el nombre solo ha pulsado unas cuantas veces la barra espaciadora.
En ese caso, el String no está vacío (empty) pero tampoco tiene un dato que resulte realmente útil y puede que queramos rechazarlo.
Por eso se incluyo ese método, para comprobar esta posibilidad de forma fácil.

Pero vamos, para un ejercicio como este, nos da igual comprobar esto o no.
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

Demo8v

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 12
    • Ver Perfil
Re: Ayuda con mi proyecto!
« Respuesta #26 en: 22 de Febrero 2021, 01:49 »
Asi estuve leyendo en mi investigación, ahorita que conseguí prestado otro computador intentaré descargar versiones más recientes de jdk para implementarlo, si no solo lo borraré.
Aparte resulta que tengo que grabar un video explicatorio del proyecto ya que no pude defenderlo en tiempo de clase, considerando que ya no queda más tiempo(menos de 5 horas en mi lado del mundo) e imagino que estás ocupado no esperaré más actualizaciones y procederé a hacer el video y entregarlo.

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re: Ayuda con mi proyecto!
« Respuesta #27 en: 23 de Febrero 2021, 02:06 »
Suerte con la entrega.

Yo igualmente intentaré seguir actualizándolo (hoy no he podido hacer nada...) hasta completarlo, para que sirva de futuras referencias para todo el que pase por aquí.

Y bueno, a mi también me sirve para seguir aprendiendo, la verdad es que es un ejercicio bastante completo, se está usando gran cantidad de componentes Swing.
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

amci

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Re: Ayuda con mi proyecto!
« Respuesta #28 en: 09 de Febrero 2022, 23:07 »
Hola Kabuto, termino el proyecto? me interesa mucho lo que sigue!

amci

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Re: Ayuda con mi proyecto!
« Respuesta #29 en: 09 de Febrero 2022, 23:08 »
Hola, mi proyecto es super parecido a este y estoy un poco perdida, me ayudaría el resto del proyecto!

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re: Ayuda con mi proyecto!
« Respuesta #30 en: 09 de Febrero 2022, 23:59 »
Hola.
Lamento decir que no, no pude continuarlo en su momento al tratarse de un proyecto de tanta magnitud.
De hecho, ahora he leído un poco este hilo y yo mismo me abrumo :o por la cantidad de código que publiqué, hace ya casi 1 año.

 :( Ojalá me sobrara tiempo para dedicar a ejercicios como este
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

amci

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Re: Ayuda con mi proyecto!
« Respuesta #31 en: 10 de Febrero 2022, 00:53 »
Si entiendo. Muchas gracias de igual forma

 

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".