javaauthenticationjframejbuttonactionlistener

Showing JButtons after login in JFrame


I just getting started in Java, and I'm developing an applet which after the login shows me certain JButtons. My problem is that I don't know to use the actionListener. Here's the code:

public class Menu extends JFrame {

    private JTextField f_usuario;
    private JPasswordField f_pass;
    private JList lista_libros;
    private JButton b_ingreso;
    private Usuario[] usuarios = new Usuario[5];
    private Libro[] libros = new Libro[20];
    private Object JPanel;

    public static void main(String args[]) {
        Menu application = new Menu();
        //inicializa los usuarios
        application.usuarios[0] = new Usuario("admin", "admin", true);
        application.usuarios[1] = new Usuario("usuario1", "123", false);
        application.usuarios[2] = new Usuario("usuario2", "123", false);
        application.usuarios[3] = new Usuario("usuario3", "123", false);
        application.usuarios[4] = new Usuario("usuario4", "123", false);
        application.libros[0] = new Libro(1, "Igna", "Vicio", true, "");
        application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public Menu() {
        super("Menu");
        final boolean f = true;
        JLabel e_usuario = new JLabel("Usuario");
        JLabel e_pass = new JLabel("Pass");
        JButton b_ingreso = new JButton("Entrar");
        JList lista_libros = new JList();

        b_ingreso.addActionListener(
                new ActionListener() {
                    public boolean b;

                    public void actionPerformed(ActionEvent evento) {
                        validar();
                    }

                }
        );
        f_usuario = new JTextField(15);
        f_pass = new JPasswordField(15);

        JScrollPane lista = new JScrollPane();
        lista_libros = new JList(libros);
        lista_libros.setVisibleRowCount(5);
        lista_libros.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        lista.add(lista_libros);

        JPanel ingreso = new JPanel();
        ingreso.add(e_usuario);
        ingreso.add(f_usuario);
        ingreso.add(e_pass);
        ingreso.add(f_pass);
        ingreso.add(b_ingreso);

        JPanel handler = new JPanel();
        handler.add(new JScrollPane(lista_libros));

        Container contenedor = getContentPane();
        contenedor.setLayout(new FlowLayout());

        contenedor.add(ingreso);
        //if(b) JOptionPane.showMessageDialog(this, "");

        Container contenedor1 = getContentPane();
        contenedor.add(lista);

        setSize(400, 250);

        setVisible(true);

    }

    private boolean validar() {
        int i;
        boolean f = false;
        String pass = new String(f_pass.getPassword());
        if (f_usuario.getText().equals("") || pass.equals("")) {
            JOptionPane.showMessageDialog(this, "Por favor complete todos los campos");
        }

        for (i = 0; i < 5; i++) {
            if (f_usuario.getText().equals(usuarios[i].getUsuario()) && pass.equals(usuarios[i].getPass())) {
                f = true;
            }
        }

        if (f) {
            JOptionPane.showMessageDialog(this, "Logueo exitoso");
        } else {
            JOptionPane.showMessageDialog(this, "La combinación de usuario y contraseña no existe");
        }
        return (true);
    }
}

If I use an "If" it says that it's not possible, so how should I recode my program to let validar() show the buttons I'll add later. For example if validar() = true, I want to make visible a JButton that allows me to list the books of a library. Maybe it's a little confusing, so any questions and answers will help. Thanks!

Code Usuario:

class Usuario {
       private String usuario;
       private String pass;
       private boolean admin;

   // constructor
   public Usuario(String usuario, String pass, boolean admin) {
      this.usuario = usuario;
      this.pass = pass;
      this.admin = admin;
   }

       // getter
       public String getUsuario() { return usuario; }
       public String getPass() { return pass; }
       public boolean getAdmin() { return admin; }
       // setter

       public void setUsuario(String usuario) { this.usuario = usuario; }
       public void setPass(String pass) { this.pass = pass; }
       public void setAdmin(Boolean admin) {this.admin = admin;}
    }

Code Libro:

class Libro {
       private int numero_id;
       private String titulo;
       private String autor;
       private boolean reservado;
       private String nombre_usuario_reserva;

   // constructor
   public Libro(int numero_id, String titulo, String autor, boolean reservado, String nombre_usuario_reserva) {
      this.numero_id = numero_id;
      this.titulo = titulo;
      this.autor = autor;
      this.reservado = reservado;
      this.nombre_usuario_reserva = nombre_usuario_reserva;
   }

       // getter
       public int getNumero_id() { return numero_id; }
       public String getTitulo() { return titulo; }
       public String getAutor() { return autor; }
       public boolean getReservado() { return reservado; }
       public String getNombre_usuario_reserva() {return nombre_usuario_reserva;}
       // setter

       public void setNumero_id() { this.numero_id = numero_id; }
       public void setTitulo() { this.titulo = titulo; }
       public void setAutor() { this.autor = autor; }
       public void setReservado() { this.reservado = reservado; }
       public void setNombre_usuario_reserva() {this.nombre_usuario_reserva = nombre_usuario_reserva;}
    }

Solution

  • The only problem I found was a missing semicolon at the end of addActionListener.

    b_ingreso.addActionListener(new ActionListener() {
        public boolean b;
    
        public void actionPerformed(ActionEvent evento) {
            if(validar() == true){ // possible to use if here
               // show buttons if true    
            } else {
               // show something else if false    
            }
        }
    }); // missing semicolon
    

    But I need to warn you that your validar() method will always return true, take a look at the last line:

    private boolean validar() {
        int i;
        boolean f = false;
        String pass = new String(f_pass.getPassword());
        if (f_usuario.getText().equals("") || pass.equals(""))
            JOptionPane.showMessageDialog(this, "Por favor complete todos los campos");
    
        for (i = 0; i < 5; i++) {
            if (f_usuario.getText().equals(usuarios[i].getUsuario()) && pass.equals(usuarios[i].getPass()))
                f = true;
        }
    
        if (f)
            JOptionPane.showMessageDialog(this, "Logueo exitoso");
        else
            JOptionPane.showMessageDialog(this, "La combinación de usuario y contraseña no existe");
        return (true); // always return true
    }
    

    As validar() is always returning true, the validar() == false block on actionPerformed will never execute.