Login-Logout e cambio dei pannelli

di il
5 risposte

Login-Logout e cambio dei pannelli

Ragazzi ho un problema con il login ed il logout.

In pratica quando avvio la mia applicazione richiede un login. Una volta verificate le credenziali di accesso si accede all'applicazione.

Ora ho un problema,una volta effettuato l'accesso con le credenziali esatta vorrei cambiare il JPannel del login con il mio JPannel principale.

Ho scritto un po' di codice,ma il JPannel del login non scompare ma si affianca nel mio JFrame all'altro JPanel.

Posto il codice per farvi capire meglio

JFrame

p
ublic class Vista extends javax.swing.JFrame {

    private Logger logger = LoggerFactory.getLogger(this.getClass().getName());
    
    private final Modello modello;
    private final Applicazione applicazione;
    private final Map<String,Object> mappaSottoViste = new HashMap<String,Object>();
       
    public Vista(Applicazione applicazione,Modello modello) {
        logger.info("\nCreo e Visualizzo La Vista\n"+"Classe:" +" " + this.getClass().getName()+"\n");
        this.modello = modello;
        this.applicazione = applicazione;
        initComponents();
        inizializza();
        InizializzaSottoViste();
        schermoLogin();
        this.setDefaultCloseOperation(Vista.DO_NOTHING_ON_CLOSE);
        this.addWindowListener(new WindowAdapter() {
            
            @Override
            public void windowClosing(WindowEvent e) {
                int conferma = JOptionPane.showConfirmDialog(null,"Sicuro Di Voler Uscire Dal Programma ?","Esci", JOptionPane.YES_OPTION);
                if (conferma == JOptionPane.YES_OPTION) {
                    logger.info("\nUscita dall'Applicazione Avvenuta con Successo\n"+""+this.getClass().getName()+"\n");
                System.exit(0);
                }
            }
        });
    
    }

 
    public Object getSottoViste(String nome) {
        return this.mappaSottoViste.get(nome);
    }
    
    public void visualizzaFinestraWarning(String err) {
        JOptionPane.showMessageDialog(this,err,"Attenzione", JOptionPane.WARNING_MESSAGE);
    }

    private void inizializza() {
        this.mappaSottoViste.put(Costanti.PANNELLO_PRINCIPALE, new PannelloPrincipale(this));
        this.mappaSottoViste.put(Costanti.PANNELLO_LOGIN, new PannelloLogin(this));
        this.mappaSottoViste.put(Costanti.FINESTRA_AGGIUNGI_PRODOTTO, new FinestraAggiungiProdotto(this));
        this.mappaSottoViste.put(Costanti.FINESTRA_RIFORNISCI, new FinestraRifornisci(this));
        this.mappaSottoViste.put(Costanti.FINESTRA_SCONTRINO, new FinestraScontrino(this));
        this.mappaSottoViste.put(Costanti.FINESTRA_VISUALIZZA_CONFRONTO_SCONTRINO, new FinestraVisualizzaConfrontoSContrino(this));
        this.mappaSottoViste.put(Costanti.FINESTRA_VISUALIZZA_PRODOTTI, new FinestraVisualizzaProdotti(this));
        
        
    }

    private void InizializzaSottoViste() {
        this.setTitle("Benvenuto in Catena Supermercato");
        AzioneEsci ae = (AzioneEsci) this.getApplicazione().getAction(Costanti.AZIONE_ESCI);
        this.itemEsci.setAction(ae);
        AzioneLogout alo = (AzioneLogout) this.getApplicazione().getAction(Costanti.AZIONE_LOGOUT);
        this.itemLogout.setAction(alo);
        AzioneInformazioni ai= (AzioneInformazioni) this.getApplicazione().getAction(Costanti.AZIONE_INFORMAZIONI);
        this.itemiInformazioni.setAction(ai);
        AzioneVisualizzaFinestraScontrino avfs = (AzioneVisualizzaFinestraScontrino) this.getApplicazione().getAction(Costanti.AZIONE_VISUALIZZA_FINESTRA_SCONTRINO);
        this.itemScontrino.setAction(avfs);
        AzioneVisualizzaFinestraProdotto avfp = (AzioneVisualizzaFinestraProdotto) this.getApplicazione().getAction(Costanti.AZIONE_VISUALIZZA_FINESTRA_PRODOTTO);
        this.itemProdotti.setAction(avfp);
    }

    public void schermoPrincipale() {
        PannelloPrincipale pp = (PannelloPrincipale) this.getSottoViste(Costanti.PANNELLO_PRINCIPALE);
        JScrollPane scroll = new JScrollPane(pp);
        this.getContentPane().add(scroll);
        pp.inizializzaPannelloSupermercato();
        this.validate();
        this.pack();
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }

    public void schermoLogin() {
        PannelloLogin pl = (PannelloLogin) this.getSottoViste(Costanti.PANNELLO_LOGIN);
        JScrollPane scroll = new JScrollPane(pl);
        this.getContentPane().add(scroll);
        this.pack();
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }
    
 }   
Questo è il codice del JPanel per il login

public final class PannelloLogin extends javax.swing.JPanel {
    
    private final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); 
    private final Vista vista;
    private Applicazione applicazione;
 
    public PannelloLogin(Vista vista) {
        logger.info("\nCreo e Visualizzo il Pannello Principale\n"+"Classe:"+" "+ this.getClass().getName()+"\n");
        this.vista = vista;
        initComponents();
        inizializza();
    }

    public void inizializza() {
        this.bottoneLogin.setAction((Action) this.vista.getApplicazione().getAction(Costanti.AZIONE_LOGIN));
        this.textUser.setAction((Action) this.vista.getApplicazione().getAction(Costanti.AZIONE_LOGIN));
        this.jPass.setAction((Action) this.vista.getApplicazione().getAction(Costanti.AZIONE_LOGIN));
    }
    
    public void ripulisciCampi() {
        this.textUser.setText("");
        this.jPass.setText("");
    }

    public String getUsername() {
        return this.textUser.getText();
    }

    public String getPassword() {
        return new String(this.jPass.getPassword());
    }
    
    public void finestraErrore(String titolo,String messaggio) {
       JOptionPane.showMessageDialog(this,messaggio,titolo,JOptionPane.OK_OPTION);
    }
}
Questo è il codice del JPannel principale


public class PannelloPrincipale extends javax.swing.JPanel {

    private final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); 
    private Vista vista;
    private Applicazione applicazione;
    private Modello modello;
 
    public PannelloPrincipale(Vista vista) {
        logger.info("\nCreo e Visualizzo il Pannello Principale\n"+"Classe:"+" "+ this.getClass().getName()+"\n");
        this.vista = vista;
        this.applicazione = vista.getApplicazione();
        this.modello = vista.getModello();
        initComponents();
        inizializza();
        this.textNome.setEditable(false);
        this.textVia.setEditable(false);
        this.textCittà.setEditable(false);
        this.textCap.setEditable(false);
        this.textTelefono.setEditable(false);
    }
    
    public void inizializza() {
        inizializzaBottoni();
    }
    
 
    private void inizializzaBottoni() {
        this.bottoneScontrino.setAction((Action) this.vista.getApplicazione().getAction(Costanti.AZIONE_VISUALIZZA_FINESTRA_SCONTRINO));
        this.bottoneProdotti.setAction((Action) this.vista.getApplicazione().getAction(Costanti.AZIONE_VISUALIZZA_FINESTRA_PRODOTTO));
        this.bottoneLogout.setAction((Action) this.vista.getApplicazione().getAction(Costanti.AZIONE_LOGOUT));
    }

    public void inizializzaPannelloSupermercato() {
        Modello modello = (Modello) this.applicazione.getModello();
        Supermercato s = (Supermercato) modello.getBean(Costanti.SUPERMERCATO);
        this.textNome.setText(s.getNome());
        this.textVia.setText(s.getVia());
        this.textCittà.setText(s.getCittà());
        this.textCap.setText(s.getCap());
        this.textTelefono.setText(s.getTelefono());
    }
    
    public void finestraErrore(String titolo,String messaggio) {
       JOptionPane.showMessageDialog(this,messaggio,titolo,JOptionPane.OK_OPTION);
    }

    public int finestraConferma ( String messaggio ) {
       return JOptionPane.showConfirmDialog(this, messaggio, " Conferma ", JOptionPane.INFORMATION_MESSAGE);
    }

    public void finestraInformazioni(String messaggio) {
        JOptionPane.showConfirmDialog(this, messaggio, " Conferma ", JOptionPane.CLOSED_OPTION);
    }
}

e questo è il codice della mia azione login

//

public class AzioneLogin extends AbstractAction{
    
    private final Applicazione applicazione;
    
    private final Logger logger = ( Logger ) LoggerFactory.getLogger(AzioneLogin.class);
    
    public AzioneLogin(Applicazione applicazione) {
        this.applicazione = applicazione;
        this.putValue(NAME, "Login");
        this.putValue(SHORT_DESCRIPTION, "Inserisci Credenziali");
        this.putValue(MNEMONIC_KEY,KeyEvent.VK_L);
        this.putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke("alt l"));
    }

    public void actionPerformed(ActionEvent e) {
        PannelloLogin pl = (PannelloLogin) this.applicazione.getVista().getSottoViste(Costanti.PANNELLO_LOGIN);
        String username = pl.getUsername();
        String password = pl.getPassword();
        Modello modello = this.applicazione.getModello();
        CatenaSupermercati catena = (CatenaSupermercati) this.applicazione.getModello().getBean(Costanti.CATENA_SUPERMERCATI);
        String errori = convalidaDati(catena, username, password);
        if (!errori.isEmpty()) {
            pl.finestraErrore("ATTENZIONE", errori);
            return;
        }
        Supermercato s = catena.getSupermercato(username);
        modello.addBean(Costanti.SUPERMERCATO, s);
        applicazione.abilitaAzione(Costanti.AZIONE_LOGOUT);
        applicazione.abilitaAzione(Costanti.AZIONE_VISUALIZZA_FINESTRA_PRODOTTO);
        applicazione.abilitaAzione(Costanti.AZIONE_VISUALIZZA_FINESTRA_SCONTRINO);
        applicazione.getVista().schermoPrincipale();
    }
    
    private String convalidaDati(CatenaSupermercati catena, String user, String password) {
        Supermercato s = catena.getSupermercato(user);
        String errori = "";
        if( user.equals("")) {
            errori += " Il Campo User Non Può Essere Vuoto";
        }else if (s == null) {
            errori += "Utente inesistente";
        } else if (!s.getPassword().equals(password)) {
            errori += "Password scorretta";

        }
        return errori;
    }

    
    
}

Ovviamente vorrei anche che quando effetto il logout l'applicazione mi riportasse al JPanel di login, questo in parte avviene ma non come vorrei io. Cioè dopo che il JPannel di login si affianca a quello principale quando effetto il logout non ritorno a JPanel di login ma scompare solo quello principale è la cosa è al quando brutta da vedere. Ed inoltre se provo a rieffettuare il login non succede nulla

posto il codice della mia azione logout

public class AzioneLogout extends AbstractAction{
    
    private final Applicazione applicazione;
    
    private final Logger logger = ( Logger ) LoggerFactory.getLogger(AzioneLogout.class);
    
    public AzioneLogout(Applicazione applicazione) {
        this.applicazione = applicazione;
        this.putValue(NAME, "Logout");
        this.putValue(SHORT_DESCRIPTION, "Disconnettiti");
        this.putValue(MNEMONIC_KEY,KeyEvent.VK_O);
        this.putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke("alt o"));
    }

    public void actionPerformed(ActionEvent e) {
        Modello modello = (Modello) this.applicazione.getVista().getModello();
        modello.addBean(Costanti.SUPERMERCATO,null);
        PannelloLogin pl = (PannelloLogin) this.applicazione.getVista().getSottoViste(Costanti.PANNELLO_LOGIN);
        pl.ripulisciCampi();
        applicazione.getVista().getSottoViste(Costanti.PANNELLO_LOGIN);
        PannelloPrincipale pp = (PannelloPrincipale) this.applicazione.getVista().getSottoViste(Costanti.PANNELLO_PRINCIPALE);
        FinestraVisualizzaProdotti fvp = (FinestraVisualizzaProdotti) this.applicazione.getVista().getSottoViste(Costanti.FINESTRA_VISUALIZZA_PRODOTTI);
        FinestraScontrino fs = (FinestraScontrino) this.applicazione.getVista().getSottoViste(Costanti.FINESTRA_SCONTRINO);
        pp.setVisible(false);
        fvp.setVisible(false);
        fs.setVisible(false);
        applicazione.abilitazioniIniziali();
    }
}
Sapete dirmi come faccio a risolvere?

5 Risposte

  • Re: Login-Logout e cambio dei pannelli

    Da quello che ho capito i pannelli dovrebbero essere cambiati dopo le chiamate di schermoLogin() e schermoPrincipale(). Giusto?

    Quando cambi i pannelli, subito dopo minimizza la finestra (dal pulsante in altro a dx se sei su Windows). Se i pannelli si vedono correttamente occorre fare un repaint() della JFrame dopo aver effettuato il cambio dei pannelli.
  • Re: Login-Logout e cambio dei pannelli

    xneo ha scritto:


    Da quello che ho capito i pannelli dovrebbero essere cambiati dopo le chiamate di schermoLogin() e schermoPrincipale(). Giusto?

    Quando cambi i pannelli, subito dopo minimizza la finestra (dal pulsante in altro a dx se sei su Windows). Se i pannelli si vedono correttamente occorre fare un repaint() della JFrame dopo aver effettuato il cambio dei pannelli.
    e come faccio a farlo il repaint()?
  • Re: Login-Logout e cambio dei pannelli

    @CRTVLB: non ho letto tutto il tuo codice iniziale ... ho poco tempo in questi giorni da dedicare ai forum.

    In generale, quando si vuole che più componenti condividano lo stesso spazio fisico, mostrandone solo uno per volta, ci sono svariate tecniche:

    a) usare un layout manager apposito: CardLayout che è fatto apposta per questo.

    b) "giocare" sulla visibilità dei componenti (solo uno è visibile, gli altri in esclusione sono invisibili). Si può fare sia con sia senza un layout manager. Questa in sostanza è proprio la tecnica usata sotto-sotto da CardLayout.

    c) "giocare" sulla sostituzione fisica del componente. Quello corrente lo si rimuove proprio dal contenitore e se ne inserisce un altro. Se c'è un layout manager, bisogna anche rivalidarlo (vale almeno per i layout manager più semplici).

    Scegli la tecnica e implementala.
    E se il numero di componenti da gestire in questo modo è noto a priori e li puoi costruire in anticipo, la scelta più pratica e semplice è l'opzione a), il CardLayout.
  • Re: Login-Logout e cambio dei pannelli

    Il repaint lo fai chiamando il metodo repaint() della JFrame.
    Subito dopo l'istruzione che cambia il pannello ti basta scrivere repaint() se sei nella classe JFrame, altrimenti dovresti memorizzarti un riferimento alla JFrame in cui il pannello è aggangiato.
  • Re: Login-Logout e cambio dei pannelli

    Ho modificato il mio codice in questo modo:

    nella classe JFrame
    
    public void schermoPrincipale() {
            PannelloPrincipale pp = (PannelloPrincipale) this.getSottoViste(Costanti.PANNELLO_PRINCIPALE);
            PannelloLogin pl = (PannelloLogin) this.getSottoViste(Costanti.PANNELLO_LOGIN);
            JScrollPane scroll = new JScrollPane(pp);
            JScrollPane scroll2 = new JScrollPane(pl);
            this.getContentPane().add(pp);
            this.getContentPane().remove(pl);
            pp.inizializzaPannelloSupermercato();
            pp.inizializzaButtonRadio();
            pp.aggiornaComboProdotti();
            pp.bottoneSelezionato();
            this.validate();
            this.pack();
            this.setLocationRelativeTo(null);
            this.setVisible(true);
        }
    
        public void schermoLogin() {
            PannelloPrincipale pp = (PannelloPrincipale) this.getSottoViste(Costanti.PANNELLO_PRINCIPALE);
            PannelloLogin pl = (PannelloLogin) this.getSottoViste(Costanti.PANNELLO_LOGIN);
           // this.setContentPane(pl);
            JScrollPane scrol2 = new JScrollPane(pp);
            JScrollPane scroll = new JScrollPane(pl);
            this.getContentPane().add(pl);
            this.getContentPane().remove(pp);
            this.pack();
            this.setLocationRelativeTo(null);
            this.setVisible(true);
    }
    
    ed il cambio dei panelli funziona. Solo che ho un altro problema, quando faccio il logout e ritorno alla finestra del login quando riprovo a loggarmi invece di passare esce un pannello vuoto e non capisco come mai.

    Edit

    Risolto, ho cambiato il layout del mio JFrame.
Devi accedere o registrarti per scrivere nel forum
5 risposte