Ayuda con JOptionPane mostrar datos en una única ventana.

Iniciado por rubia28, 9 Diciembre 2020, 19:27 PM

0 Miembros y 1 Visitante están viendo este tema.

rubia28

Buenas tardes a todos,

Estoy desarrollando una aplicación que solicita y muestra los datos por pantalla a través de JOptionPane con ventanas y no por consola como he hecho siempre.

He conseguido poner todo más o menos correctamente, pero a la hora de listar la información introducida por el usuario, el programa me crea una ventana para cada información introducida y me gustaría que sacara toda la información a la vez.

Ejemplo: Si he dado de alta 2 clientes con todos sus datos, que abra una única ventana con los datos de ambos clientes y no una ventana por cliente.

¿Hay alguna forma de que el programa pueda realizar esta función? Os pongo en código como lo tengo actualmente.

Código (java) [Seleccionar]
    /**Método para dar de alta a nuevos clientes en la base de datos del hotel. */
      public void altaCliente(){
       
        String dni = JOptionPane.showInputDialog("NUEVO CLIENTE: \n" +"Escriba el DNI del cliente: \n\n");
       
    /**Llamada al método comprobarDni para comprobar que el cliente que se está dando de alta no ha sido ya creado. */   
        Cliente cliente = comprobarDni(dni);
    /** Si el dni introducido no coincide con el de ningún cliente existente devuelve null y continua con el proceso de alta del cliente nuevo.
    En caso que el dni introducido ya exista significa que el cliente ya ha sido registrado previamente y nos devolverá un mensaje de error. */
        if(cliente == null) {
          String nombre; 
          String apellidos;
          String telefono;
         
          nombre = JOptionPane.showInputDialog("Introduzca el nombre del cliente: ");
          apellidos = JOptionPane.showInputDialog("Introduzca los apellidos del cliente: ");
          telefono = JOptionPane.showInputDialog("Introduzca el núm. de teléfono del cliente: ");
           
        clientes.add(new Cliente(nombre,apellidos,dni,telefono));
       
        JOptionPane.showConfirmDialog(null,"Se ha añadido el siguiente cliente en la base de datos: \n"
        + "\nNombre: " +nombre
        +"\nApellidos: " +apellidos
        +"\nDni: " +dni
        + "\nTeléfono: "+telefono);
   
      }     
        else {
            JOptionPane.showMessageDialog(null, "El DNI introducido ya existe. El cliente que está dando de alta ya se encuentra registrado en el sistema.","ERROR", 0);
      }
       
      }
     
    /** Método para comprobar que si dni introducido por teclado coincide con el de agún cliente ya registrado. */
    public Cliente comprobarDni(String dni){
   
        for (int i=0; i < clientes.size(); i++){
            Cliente cliente = clientes.get(i);
           
            if (dni.equals(cliente.getDni())){
                return cliente;
            }
        }
        return null;   
    }
       
    /** Método para listar los clientes registrados. */
    public void mostrarClientes() {
        JOptionPane.showMessageDialog(null,"LISTA DE CLIENTES: ");
        for (int i=0; i < getClientes().size(); i++) {
            Cliente aux = getClientes().get(i);
           
        JOptionPane.showMessageDialog(null,aux.getNombre() + " " + aux.getApellidos() + ", Dni." + aux.getDni() + ", Telf." + aux.getTelefono());
        }
     
}


Me gustaría que en la Función mostrarClientes() pudiera crear una única ventana que fuera LISTA CLIENTES y en ella aparecieran todos los clientes que se han introducido y no que primero aparezca la ventana de LISTA CLIENTES, Cliente 1 y sus datos, cliente 2 y sus datos por ejemplo.

Mil gracias por la ayuda, saludos.

K-YreX

Supongo que el problema sí lo tienes localizado, no? Cada vez que usas showMessageDialog() creas un cuadro de diálogo nuevo. Si metes este método dentro del for() que se repite n veces, crearás n cuadros de diálogo.

La solución es muy sencilla: concatenar en un string todo el texto que quieres mostrar y llamar a showMessageDialog() una única vez fuera del for():
Código (java) [Seleccionar]

public void mostrarClientes(){
  String mensaje = "LISTA DE CLIENTES"; // Lo inicializamos a una cadena vacia o a un mensaje inicial que queramos mostrar
  Cliente aux;
  for(int i = 0; i < getClientes().getSize(); ++i){
    Cliente = getClientes().get(i);
    // Ahora concatemos la informacion de cada cliente en una linea nueva
    mensaje += "\nNombre: " + aux.getNombre() + " " + aux.getApellidos() + " - DNI: " + aux.getDni(); //... y lo que sea ...
  }
  // Y una vez acabado el for(), mostramos un unico JOptionPane
  JOptionPane.showMessageDialog(null, mensaje);
}


PD: Para concatenar strings es más eficiente usar StringBuffer o StringBuilder por si quieres echar un ojo a esas clases o ya las conoces... :rolleyes:
Suerte  :-X
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

rubia28

Muchisimas gracias por la ayuda!!

Tenía un poco localizado que era por estar dentro de for.. pero no sabía como poder hacerlo.. ahora ya viendo que hay que inicializar una primera variable String fuera como has indicado y sacar el for en mensaje que quieres mostrar final lo veo mucho más claro! y podré modificar todos los puntos del menú para poder listar las funciones que me faltaban y que el resultado se vea como quería  ;D

Le echaré un vistazo a Stringbuffer y StringBuilder como me recomiendas, ahora mismo estoy empezando y estoy viendo todo de nuevas jejej

Mil gracias por la ayuda!!