Salve a tutti, ho un problema nella visualizzazione dei jframe; più precisamente, quando utilizzo il metodo setVisible(false) o dispose(), il frame rimane aperto e mi lancia infatti un'eccezione di NullPointerException nella riga del metodo .
Questo problema però accade solo quando avvio l'applicazione dalla classe principale, avviandola invece direttamente dalla seconda classe (la classe autenticazione) non mi lancia nessuna eccezione e l'applicazione funziona correttamente.
Vi allego il codice:
codice:
==>classe SchermataIniziale (classe principale dell'applicazione) <==
package InterfacceGrafiche.SchermataIniziale;
import Autenticazione.Autenticazione;
import Registrazione.Registrazione;
import Control.*;
/**
*
* @author me
*/
public class SchermataIniziale extends javax.swing.JFrame {
private AutenticazioneControl control;
private RegistrazioneControl control1;
/**
* Creates new form SchermataIniziale
*/
public SchermataIniziale() {
initComponents();
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
//codice del frame auto-generato da netbeans
pack();
}// </editor-fold>
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
Registrazione finestra3 = new Registrazione();
finestra3.setVisible(true);
frame.dispose();
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
Autenticazione finestra2 = new Autenticazione();
finestra2.setVisible(true);
//frame.setVisible(false);
frame.dispose();
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
frame = new SchermataIniziale();
frame.setVisible(true);
}
});
}
static SchermataIniziale frame;
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JPanel jPanel1;
// End of variables declaration
}
==>classe Autenticazione <==
package Autenticazione;
import Control.AutenticazioneControl;
import Control.RecuperoPasswordControl;
import InterfacceGrafiche.SchermataIniziale.SchermataIniziale;
import Entity.Account;
import javax.swing.JTextField;
import RecuperoPassword.*;
import javax.swing.JFrame;
/**
*
* @author me
*/
public class Autenticazione extends javax.swing.JFrame {
private AutenticazioneControl control;
private RecuperoPasswordControl control1;
private Autenticazione frm;
/**
* Creates new form Autenticazione
*/
public Autenticazione() {
initComponents();
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
//codice del frame auto-generato da netbeans
pack();
}// </editor-fold>
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
try{
control = new AutenticazioneControl(frame);
String email= jTextField1.getText().toLowerCase();
String password=jTextField2.getText();
Account account = new Account(email,password,"-","-","-","-","-");
if(control.richiediCredenziali(account,frame)==true){
Account account1 = new Account(email,"-","-","-","-","-","-");
control.schermataIniziale(account1,frame);
frame.dispose();
}
}catch(Exception e){
System.out.println("Errore");
e.printStackTrace();
}
}
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
RecuperoPassword1 frmRP = new RecuperoPassword1();
frmRP.setVisible(true);
frame.setVisible(false);
//control1 = new RecuperoPasswordControl(frmRP);
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tu...feel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(Autenticazione.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(Autenticazione.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(Autenticazione.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(Autenticazione.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
frame = new Autenticazione();
frame.setVisible(true);
}
});
}
public void setControl(Autenticazione frame){
this.frame= frame;
}
static Autenticazione frame;
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JDesktopPane jDesktopPane1;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JPanel jPanel1;
private javax.swing.JPopupMenu jPopupMenu1;
private javax.swing.JTextField jTextField1;
private javax.swing.JTextField jTextField2;
// End of variables declaration
}
==>classe AutenticazioneControl <==
codice:
package Control;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import Entity.Account;
import Entity.Connessione;
import Entity.Dipendente;
import Autenticazione.Autenticazione;
import InterfacceGrafiche.SchermataCustode.SchermataCustode;
import InterfacceGrafiche.SchermataAmministratore.SchermataAmministratore;
import InterfacceGrafiche.SchermataCliente.SchermataCliente;
import InterfacceGrafiche.SchermataAutista.SchermataAutista;
/**
* @author me
*La classe AutenticazioneControl si occupa dell'autentiazione degli impiegati.
*/
public class AutenticazioneControl extends GenericaControl {
private JFrame finestraAttuale ;
private Connessione connessione;
private List<Account> credenziali= new ArrayList<Account>();
private Dipendente imp;
private Account datiAcount;
private Account account;
private AutenticazioneControl control;
private Autenticazione frm;
private String codiceID;
private Account Dati;
/*private SchermataCliente frmCl;
private SchermataAmministratore frmAmm;
private SchermataCustode frmC;
private SchermataAutista frmA;*/
private AutenticazioneControl control1;
/**
* Inizializza AutenticazioneControl, settando la finestra attuale col frame passato.
* @param frame
*/
public AutenticazioneControl(JFrame frame) {
setFinestraAttuale(frame);
connessione= new Connessione();
}
/**
* Crea il frame Login.
*/
/*public void creaLogin() {
Autenticazione form = new Autenticazione();
form.setControl(this);
form.setVisible(true);
}/*
/**
* Richiede al DBMS le credenziali, per verificare l'account.
* Se l'autenticazione va a buon fine viene creato il frame PannelloDiControllo relativo all'account.
* @param credenziali
* @param frame
*/
public boolean richiediCredenziali(Account credenziali ,JFrame frame) {
try {
setCredenziali(connessione.richiestaCredenziali());
if(verificaCredenziali(credenziali)== false) {
JOptionPane.showMessageDialog(finestraAttuale, "L'email o la password sono errati. Riprovare.");
}else {
JOptionPane.showMessageDialog(finestraAttuale, "Accesso Effettuato");
return true;
}
}catch(SQLException e) {
JOptionPane.showMessageDialog(finestraAttuale, e.getMessage());
}
return false;
}
/**
* Verifica se l'account esiste.
* @param credenziali le credenziali da verificare.
* @return Ritorna true sell'account esiste.
*/
public boolean verificaCredenziali(Account credenziali) {
for(Account c:this.credenziali) {
if(c.getEmail().toLowerCase().equals(credenziali.getEmail())&& c.getPassword().equals(credenziali.getPassword())) {
setDatiAcount(c);
return true;
}
}
return false;
}
/**Crea il frame PannelloDiControllo relativo all'account.
* @param credenziali
* @param frameDaChiudere
*/
/**
* @return the connessione
*/
public Connessione getConnessione() {
return connessione;
}
/**
* @param connessione the connessione to set
*/
public void setConnessione(Connessione connessione) {
this.connessione = connessione;
}
/**
* @return the finestraAttuale
*/
public JFrame getFinestraAttuale() {
return finestraAttuale;
}
/**
* @param finestraAttuale the finestraAttuale to set
*/
public void setFinestraAttuale(JFrame finestraAttuale) {
this.finestraAttuale = finestraAttuale;
}
public List<Account> getCredenziali() {
return credenziali;
}
/**
* @param credenziali the credenziali to set
*/
public void setCredenziali(List<Account> credenziali) {
this.credenziali = credenziali;
}
/**
* @return the imp
*/
public Dipendente getImp() {
return imp;
}
/**
* @param imp the imp to set
*/
public void setImp(Dipendente imp) {
this.imp = imp;
}
/**
* @return the datiAcount
*/
public Account getDatiAcount() {
return datiAcount;
}
public void setDati(Account Dati) {
this.Dati = Dati;
}
/**
* @param datiAcount the datiAcount to set
*/
public void setDatiAcount(Account datiAcount) {
this.datiAcount = datiAcount;
}
public AutenticazioneControl getControl() {
return control;
}
public void setControl(AutenticazioneControl control) {
this.control = control;
}
public void setAccount(Account account){
this.account = account;
}
public Account getAccount(){
return account;
}
public boolean controlloAmministratore(String codiceID){
try{
if(connessione.verificaAmministratore(codiceID)==true){
return true;
}
}catch(SQLException e) {
JOptionPane.showMessageDialog(finestraAttuale, e.getMessage());
}
return false;
}
public void schermataIniziale(Account account, JFrame frame) {
try {
setDati(connessione.richiediAccount(account));
if(Dati.getCodiceID() != null && controlloAmministratore(Dati.getCodiceID())==false) {
if(connessione.verificaCustode(Dati.getCodiceID())==true){
JOptionPane.showMessageDialog(finestraAttuale,"Benvenuto, Custode");
SchermataCustode frmC = new SchermataCustode();
control1 = new AutenticazioneControl(frmC);
frmC.setVisible(true);
frame.setVisible(false);
}else{
JOptionPane.showMessageDialog(finestraAttuale,"Benvenuto, Autista");
SchermataAutista frmA = new SchermataAutista();
control1 = new AutenticazioneControl(frmA);
frmA.setVisible(true);
frame.setVisible(false);
}
}else{
if(controlloAmministratore(Dati.getCodiceID())==true){
JOptionPane.showMessageDialog(finestraAttuale,"Benvenuto, Amministratore");
SchermataAmministratore frmAmm = new SchermataAmministratore();
control1 = new AutenticazioneControl(frmAmm);
frmAmm.setVisible(true);
frame.setVisible(false);
}else{
JOptionPane.showMessageDialog(finestraAttuale,"Benvenuto, Cliente");
//setFinestraAttuale(frame);
SchermataCliente frmCl = new SchermataCliente();
frmCl.setControlAutenticazione(this);
//control1 = new AutenticazioneControl(frmCl);
frmCl.setVisible(true);
//frame.setVisible(false);
//frame.dispose();
finestraAttuale.dispose(); //qui mi lancia l'accezione<<<<<<<<<<<<<
}
}
}catch(SQLException e) {
JOptionPane.showMessageDialog(frame, e.getMessage());
}
}
/*public void dispose() {
finestraAttuale.dispose();
}*/
}
Questa è l'eccezione che mi lancia:
codice:
Errore
java.lang.NullPointerException
at Control.AutenticazioneControl.schermataIniziale(AutenticazioneControl.java:293)
at Autenticazione.Autenticazione.jButton1ActionPerformed(Autenticazione.java:154)
at Autenticazione.Autenticazione.access$000(Autenticazione.java:22)
at Autenticazione.Autenticazione$1.actionPerformed(Autenticazione.java:78)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
L'applicazione dovrebbe chiudere il frame di Autenticazione e aprire quello della schermata cliente (riga 293). Spero possiate aiutarmi e mi scuso in anticipo per eventuali errori